小白猿笔记 Day13(IO,字节流 字符流)

本文详细介绍了Java中的IO流,包括输入流、输出流的分类,如字节流和字符流,以及它们的常用子类如FileInputStream、FileOutputStream、BufferedInputStream和BufferedReader等。内容涵盖了流的创建、数据读写以及如何优化读取效率。同时,提到了字节流和字符流在处理二进制文件和文本文件时的区别,以及在实际编程中如何选择合适的流进行操作。
摘要由CSDN通过智能技术生成

IO阶段的学习方式:学习父类的公共方法,学习子类对象的创建方式

流的分类:

按照方向:输入流,输出流

按照操作单位:

字节流 : 针对二进制文件
字符流 : 针对文本文件

字节输入流   (针对二进制文件) 

InputStream(抽象类) 

此抽象类是表示字节输入流的所有类的超类/抽象类,不可创建对象

常用方法
abstract int read() 从输入流中读取数据的下一个字节
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组,off表示存时的偏移量

FileInputStrem子类--操作文件的字节输入流  

 直接插在文件上,直接读取文件数据

创建对象
FileInputStream(File file)—直接传文件对象
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定FileInputStream(String pathname)—传路径
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定

BufferedInputStrem子类--高效字节输入流

 BufferedInputStream 为另一个输入流添加一些功能,在创建BufferedInputStream 时,会创建一个内部缓冲区数组(默认8k大小)。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

 创建对象
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

ObjectInputStream

 测试:

FileInputStrem

 public static void main(String[] args) {
        method();//字节流的读取
        //本方法用于测试字节流的读取
        private static void method() {
            //1.创建流对象,注意InputStream是抽象父类,不可以实例化
            //创建一个本方法中都生效的局部变量,注意手动初始化,引用类型默认值null
            InputStream in2=null;
            try {
                //1.创建流对象
                //注意InputStream,不可以实例化
                //InputStream in = new FileInputStream(new File("D:\\ready\\1.txt"));
                in2 = new FileInputStream("D:\\ready\\1.txt");
                //2.使用流对象:读取指定文件中的数据
                /*read()每次调用都会读取一个字节,如果读到了文件数据的末尾,返回-1
                 * 这个方法的返回值类型是int,所以会查找指定字符对应编码的打印出来*/
                //    in.read();
//            System.out.println(in.read());
//            System.out.println(in.read());
//            System.out.println(in.read());

                //2.2优化代码,使用循环读取文件
                //定义变量,用来保存本次读到的数据
                //循环读取数据,只要读到的数据不等于-1,说明还有数据,符合循环条件,继续循环
                int b;
                while((b=in2.read())!=-1){
                    System.out.println(b);
                }
            } catch (IOException e) {
                e.printStackTrace();//默认写法,打印错误信息
            }finally {
                /*finally{}代码块是try-catch结构的第3个部分
                 * 这个部分不论是否捕获到异常,都一定会执行,所以常用来关流操作*/
                //3.释放资源,流资源用完必须释放

                try {
                    in2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

BufferedInputStrem:

字节输出流 

OutputStream--抽象类

此抽象类是表示输出字节流的所有类的超类.输出流接受输出字节并将这些字节发送到某个接收器.

常用方法:
Void close() 关闭此输出流并释放与此流相关的所有系统资源
Void flush() 刷新此输出流并强制写出所有缓冲的输出字节
Void write(byte[ ] b) 将b.length个字节从指定的byte数组写入此输出流
Void write(byte[ ] b,int off ,int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
Abstract void write(int b) 将指定的字节写入此输出流

FileOutputStream--子类

直接插在文件上,直接写出文件数据

构造方法(创建对象):
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的文件输出流
FileOutStream(File file)
创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutStream(File file,boolean append)—如果第二个参数为true,表示追加,不覆盖
创建一个向指定File对象表示的文件中写入数据的文件输出流,后面的参数是指是否覆盖原文件内容

BufferedOutputStream--子类

该类实现缓冲的输出流,通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必每次针对字节写出调用底层系统

构造方法(创建对象):
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,用以将数据写入指定的底层输出流

ObjectOutputStream

测试 :

FileOutputStream

BufferedOutputStream 

字符输入流 --针对本文文件

常用于处理纯文本数据,读写容易出现乱码的现象,在读写时,最好指定编码集为UTF-8

Reader---抽象类

用于读取字符流的抽象类。

 常用方法
int read() 读取单个字符
int read(char[] cbuf) 将字符读入数组
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区
abstract void close() 关闭该流并释放与之关联的所有资源

FileReader子类--操作文件的字符输入流

用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

 创建对象
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader

BufferedReader子类--高效字符输入流

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

 创建对象
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流

InputStreamReader

测试

FileReader

BufferedReade

字符输出流 

Writer  抽象类

写入字符流的抽象类

常用方法:
Abstract void close() 关闭此流,但要先刷新它
Void write(char[ ] cbuf) 写入字符数组
Void write(int c) 写入单个字符
Void write(String str) 写入字符串
Void write(String str,int off,int len) 写入字符串的某一部分
Abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分

FileWriter --子类

用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的.如果需要自己自定义这些值,可以先在FileOutputStream上构造一个OutputStreamWriter.

构造方法(创建对象):
FileWriter(String filename)
根据给定的文件名构造一个FileWriter对象
FileWriter(String filename,boolean append)
根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter

BufferedWriter--子类

将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入.可以指定缓冲区的大小,或者接受默认的大小,在大多数情况下,默认值就足够大了

构造方法(创建对象):
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流

测试: 

FileWriter

 BufferedWriter

总结:

1.流的分类

1)按照方向分类:输入流.输出流

2)按照操作的单位分类:字节流 字符流

3)组合情况:字节输入流  字节输出流 字符输入流 字符输出流

2.字节输入流

1)抽象父级:InputStream--不能是实例化

2)普通子级:

         1>FileInputStream - -操作文件的字节输入流

      构造方法参数: File  file/ String pathname

        2>BufferedInputStream -- 高效字节输入流

      构造方法参数:InputStream,但是无法创建抽象父级对象,所以传的是FileputStream

3.字节输出流

1)抽象父级:OutputStream--不能是实例化

2)普通子级:

         1>FileOutputStream - -操作文件的字节输出流

       构造方法参数: File  file/ String pathname

 注意:默认存在一个参数boolean append,默认值为false,也是覆盖输出,

如果将FileOutputStream构造函数的第2个参数appned设置true,就会实现追加输入的效果

        2>BufferedOutputStream -- 高效字节输出流

      构造方法参数:OutputStream,但是无法创建抽象父级对象,所以传的是FileOutputStream

4.字符输入流

1)抽象父级:Reader--不能是实例化

2)普通子级:

         1>FileReader - -操作文件的字符输入流

      构造方法参数: File  file/ String fileName

        2>BufferedReader -- 高效字符输入流

      构造方法参数:Reader,但是无法创建抽象父级对象,所以传的是FileReader

5.字符输出流

1)抽象父级:Writer--不能是实例化

2)普通子级:

         1>FileWriter - -操作文件的字符输出流

      构造方法参数: File  file/ String fileName

 注意:默认存在一个参数boolean append,默认值为false,也是覆盖输出,

如果将FileWriter构造函数的第2个参数appned设置true,就会实现追加输入的效果

        2>BufferedWriterr -- 高效字符输出流

      构造方法参数:Writer,但是无法创建抽象父级对象,所以传的是FileWriter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值