IO类(详解)

体系

1.File类

1.1概念

*是java.io包中的一个类

*File类的对象可表示文件/目录,还可对文件/目录的属性进行操作,如:文件名等。

//在当前目录创建一个与tm.txt文件名相关的对象
File f1=new File("tm.txt");
//指明详细路径及文件名,可以用双斜杠"\\"或反斜杠"/"
File f2=new File("E:/java/tm.txt");
//指明详细路径及目录名,使用双斜杠"\\"
File f2=new File("E:\\java");

1.2File类的常用方法

import java.io.File;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) {
        //File f2=new File("H:/demo");//无H盘
        File f2=new File("E:/demo");
        /*if(!f2.exists()){
            try {
                f2.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("文件创建失败");
            }
        }*/
        System.out.println(f2.delete());//删除文件,成功返回true;否则返回false
    }
}
import java.io.File;

public class Demo3 {
    public static void main(String[] args) {
        File f2=new File("E:/demo/a/b");
        f2.mkdir();//单极文件夹
        f2.mkdirs();//双级文件夹
        f2.delete();//删除时,文件必须为空
        File[] fs=f2.listFiles();
        for(File f:fs){
            System.out.println(f);
            f.delete();
        }
        f2.delete();
    }
}

2.IO流

从数据流编码格式上划分为

● 字节流

字节流中常用类 字节输入流 InputStream FileInputStream 字节输出流OutputStream FileOutputStrea m.

● 字符流

字符流中常用类 字符输入流 Reader 字符输出流 Write r

3.输入流、输出流

3.1输入、输出的概念

*输入(input):将电脑硬盘的数据读到程序中、

*输出(output):从程序往外部写数据,即进行数据的write操作

3.2输入流、输出流

● 输入流:往程序中读叫输入流。 ● 输出流:从程序中往外写叫输出流 .

InputStream和OutputStream的子类都是字节流,字节处理单元为1字节。

Reader和Writer的子类都是字符流 主要处理字符或字符串 ,字符流处 理单元为1个字符。

4.节点流、处理流

4.1节点流

直接操作文件、字符串等。如:

FileInputStream

FileOutputStream

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        /*
        节点流操作
         */
        String mes="你好";
        FileOutputStream out=new FileOutputStream("D:/demo.txt");
        out.write(mes.getBytes());
        FileInputStream in=new FileInputStream("D:/demo.txt");
        byte[] b=new byte[20];
        int length=in.read(b);
        String mess=new String(b,0,length);


    }
}

4.2处理流

又为包装流。如:

BufferedInputStream

BufferedOutputStream

DataInputStream

DataOutputStream

ObjectInputStream

ObjectOutputStream

import java.io.*;

public class Demo4 {
    /*
    FileInputStream  FileOutputStream 直接操作文件,节点流
    内部带缓冲数组的包装处理流
    BufferedInputStream  BufferedOutputStream 流对象,属于包装流/处理流
     */
    public static void main(String[] args) throws IOException {
        FileInputStream in=new FileInputStream("E:/feige.exe");
        BufferedInputStream bin=new BufferedInputStream(in);

        FileOutputStream out=new FileOutputStream("F:/feige.exe");
        //BufferedOutputStream bout=new BufferedOutputStream(out);//8192
        BufferedOutputStream bout=new BufferedOutputStream(out,2048);

        byte[] b=new byte[1024*10];
        int length=0;
        while((length=bin.read())!=-1){
            bout.write(b,0,length);
        }
        bin.close();
        bout.flush();//刷新缓存区
        bout.close();
    }
}

import java.io.*;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        /*
        处理流操作
         */
        String mes="你好呀!";
        FileOutputStream out=new FileOutputStream("D:/demo.txt");
        DataOutputStream dout=new DataOutputStream(out);
        dout.writeUTF(mes);
        FileInputStream in=new FileInputStream("D:/demo.txt");
        DataInputStream din=new DataInputStream(in);
        String mess=din.readUTF();
        System.out.println(mess);
    }
}

5.字符流

字符流只能读取纯文本文件。

每次读取单位为一个字符,utf-8编码表中,一个汉字由3个字节组成。

计算机所有数据的存储以字节为单位。

字符输入流父类:Reader

InputStreamReader是转换流,将字节按照编码表转为字符;

FileReader 文件输入字符流。

字符输出流父类:Writer

OutputStreamWriter是转换流,将字符转为字节;

FileWriter 文件输出字符流。

缓冲字符流

BufferedReader 缓冲字符输入流

BufferedWriter 缓冲字符输出流

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        FileReader reader=new FileReader("E:/demo1.txt");
        FileWriter writer=new FileWriter("F:/demo2.txt");
        char[] c=new char[10];
        int length=0;
        while((length=reader.read(c))!=-1){
            System.out.println(length);
            writer.write(c,0,length);
        }
        reader.close();
        writer.close();
    }
}
pimport java.io.*;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileReader reader=new FileReader("E:/demo.txt");
        BufferedReader bufferedReader=new BufferedReader(reader);

        FileWriter writer=new FileWriter("F:/demo.txt",true);//true 可以不让下一次的内容覆盖当前内容
        BufferedWriter bufferedWriter=new BufferedWriter(writer);
        String line=null;
        while((line=bufferedReader.readLine())!=null){
            bufferedWriter.write(line);//一次写出一个字符串
            bufferedWriter.newLine();//换行符
        }
        bufferedReader.close();
        bufferedWriter.close();
    }
}

6.print流

只做输出没有输入,打印流分为字节打印流和字符打印 流

PrintWriter: 字符打印流 print方法可打印各类型数据。

在javaweb项目中,服务器端向客户端响应数据以打印流的方式响应 。

7.对象输入输出流/对象序列化

对象寿命随程序的终止而终止,有时需将对象信息保存,在需要时恢复,将其持久化。

对象的输出流/对象序列化:ObjectOutputStream

将指定对象写进文件。

用readObject()方法直接读取一个对象。

当一个类的对象需被序列化时,该类要实现Serializable接口,

实现后,隐式在类中生产一个不重复的序列化编号,该编号会在类被修改后随之改变,重新生成一个编号,

这在反序列化时可能会出现问题,对象和类不能对应。

我们可以显示生成一个序列化编号,即使类信息发生变化,也不改变。

private static final long serialVersionUID = -5669977830036777084L;

当属性不需要被序列化时,用transient修饰。

对象输入流/对象反序列化:ObjectInputStream

将指定的已序列化好的文件读出。

用writeObject()方法直接将对象保存到输出流。

import java.io.*;
import java.util.Date;


public class Car implements Serializable {

   
    private static final long serialVersionUID = -5669977830036777084L;

    private transient int num;
    private String name;
    private String color;
    public Car(int num,String name){
        this.num=num;
        this.name=name;
    }

    @Override
    public String toString() {
        return "Car{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
         //对象序列化
       /* FileOutputStream fos = new FileOutputStream("F:/t.tmp");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Car car=new Car(10,"奔驰");
        //不是所有类的对象都可被序列化到文件中
        oos.writeObject(car);
        oos.close();
        */

        FileInputStream fis = new FileInputStream("F:/t.tmp");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Car car =(Car)ois.readObject();//反序列化,也是Java中创建对象的一种方式
        System.out.println(car);//Car{num=0, name='奔驰'}
        ois.close();
    }

}
//若没有显示生成序列化编号,运行后会有以下错误
Exception in thread "main" java.io.InvalidClassException: com.albb.javaIO.Car; local class incompatible: stream classdesc serialVersionUID = -6599522886150976569, local class serialVersionUID = -1072406244132866035
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谭同学ha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值