关于JAVA中字节输入输出流(OutputStream,InputStream)和字符输入输出流(FileWriter,FileReader)的总结

关于Java中的字节输入输出流和字符输入输出流,大致的做个学习总结。

对于任何文件来说本质上都是由字节组成的,所以在Java中来说。

字节流可以复制读取任何形式的文件,比如图片,音频等,而字符流我们一般用来读取文本形式的文件。

那基本的字节流有:

InputStream,OutputStream:(抽象类,是所有字节输入输出流的超类)
FileInputStream,FileOutputStream
System.in,System.out:(基本输入输出流)
PrintStream:(字节打印流)

字符流有:

reader,writer:(写入写出字符流的抽象类)
FileWriter, FileReader
PrintWriter:(字符打印流)
BufferedWriter,BufferedReader :(高速缓冲流,字符流)

字符流和字节流的转换类(两种流之间转换的桥梁)

InputStreamReader,OutputStreamWriter:(字节转字符流,转换流)

对象操作流

ObjectOutputStream,输出流
  writeObject
  ObjectOutputStream(OutputStream out)
ObjectInputStream,输入流
  readObject
  ObjectInputStream(InputStream in)
(注意:使用d对象输出流写出对象,只能使用对象输入流来读取对象
只能将支持java.io.Serializable接口的对象写入流中
异常:Exception in thread "main" java.io.NotSerializableException: Student
当前类没有实现相应的序列化接口(java.io.Serializable),抛出异常。
Exception in thread "main" java.io.EOFException
当输入过程中意外到达文件或者流的末尾时,抛出异常。(不和其他读取流一样返回一个特殊值(-1或者null),返回异常)
所以对象操作流程通过捕获异常的方法来判断是读到了文件的末尾
Serializable:序列号接口,是一个标识接口,只起到标识作用,没有具体的方法。
当一个类的对象需要IO流进行读写的时候,这个类必须实现该接口)

那对于字节流或者字符流的抽象类父类使用方法,可以使用指向子类实例的方法来使用,也就是向上转型。例如:

        //字节流
        InputStream is = new FileInputStream("a.txt");
        OutputStream os = new FileOutputStream("b.txt");
        OutputStream os1 = new FileOutputStream("b.txt",true);
        //true 表示是否追加数据

        //字符流
        Reader r = new FileReader("a.txt");
        Writer w = new FileWriter("b.txt");
        Writer w1 = new FileWriter("b.txt",true);
        //true 表示是否追加数据

        //字符高速缓冲流
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
        BufferedWriter bw1 = new BufferedWriter(new FileWriter("b.txt",true));
        //true 表示是否追加数据

        //打印流
        PrintWriter pw = new PrintWriter(new FileWriter("B.txt"),true);
        //true表示是否启动自动刷新

        //对象操作流
        ObjectInputStream oi = new ObjectInputStream(new FileInputStream("a.txt"));
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("b.txt"));
        ObjectOutputStream os1 = new ObjectOutputStream(new FileOutputStream("b.txt",true));
        //true 表示是否追加数据

        //字节转字符流,字节流通向字符流的桥梁
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //如果我们需要复制文本,想要直接输出字符流的数据,不想想进行字节的转换
        //就得使用字节和字符流之间的转换流,OutPutStreamWriter,将标准的字节输出流换换为字符输出流,就可以直接输出字符了
        //字节流通向字符流的桥梁,无需进行字符的转换再输出,OutPutStreamWriter

        //标准输入输出流
        //public static final InputStream in;字节输入流,用来读取键盘录入的数据。
        InputStream is = System.in;
        Scanner sc = new Scanner(System.in);

        //public static final PrintStream out:字节输出流,将数据输出到命令行
        System.out.println();

总体上来讲,各个流都有自身的特点,要结合实际应用使用各个输入输出流。

字节流可以读写任意类型的文件,但是只能逐字符读写或者一次读取一个字符数组。

字符流可以读取文本类型的文件,可以高效的读写,既可以一次性读写一行数据,也可以一次性读取一个字符数组。

高效缓冲流相当是字符流的升级版,依靠字符流作为读写手段,提供更加快速的读写方法。

转换流是字节流通向字符流的桥梁,相当于自动将字节流读取到的字节(byte)转换解码为字符,提供更加便捷的操作,不需要再通过getByte()转换为字节,或是new String()转换为字符,再读写或者输出。

字符打印流只能输出不能输入,没有输入流,可以通过println方法自动换行,不能输出字节,但是能输出其他任意类型,通过配置创建对象时的参数autoflush,可以实现自动刷新(只有在调用println,printf,format 时才有用)。

 

 

你可能感兴趣的:(Java)