java进阶打卡28

字节缓冲输出流BufferedOutputStream

java.io.BufferedOutputStream extends OutputStream

继承自父类的共性成员方法:
    - public void close():关闭此输出流并释放与此流相关联的任何系统资源。
    - public void flush():刷新此输出流并强制任何缓冲的输出字节被写出。
    - public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流。
    - public void write(byte[] b, int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
    - public abstract void write(int b):将指定的字节输出流。

构造方法:
    BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
    参数:
         OutputStream out:字节输出流
            我们可以传递FileOutputStream,缓冲区会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率。
         int size:指定缓冲流内部缓冲区的大小,不指定默认
         
使用步骤(重点):
1. 创建FileOutputStream对象,构造方法中绑定要输出的目的地
例如:	FileOutputStream fos = new FileOutputStream("day10-code\\a.txt");
2. 创建BufferedOutputStream对象,构造方法中传递BufferedOutputStream对象,提高FileOutputStream对象效率
例如:	BufferedOutputStream bos = new BufferedOutputStream(fos);
3. 使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
例如:	bos.write("我把数据写入到内部缓冲区中".getBytes());
4. 使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
例如:	bos.flush();
5. 释放资源(会先调用flush方法刷新数据,第4步可以省略)
例如:	bos.close();

字节缓冲输入流BufferedInputStream

java.io.BufferedInputStream extends InputStream

继承自父类的成员方法:
    int read() 从输入流中读取数据的下一个字节。
    int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
    void close() 关闭此输入流并释放与该流关联的所有系统资源。

构造方法:
    BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
    BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用。
    参数:
        InputStream in:字节输入流
            我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream对象的读取效率。
            int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点):
1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
例如:	FileInputStream fis = new FileInputStream("day10-code\\a.txt");
2. 创建BufferedInputStream对象,构造方法中传递BufferedInputStream对象,提高FileInputStream对象的读取效率
例如:	BufferedInputStream bis = new BufferedInputStream(fis);
3. 使用BufferedInputStream对象中的方法read,读取文件
例如:	// int read() 从输入流中读取数据的下一个字节。
        int len = 0; // 记录每次读取到的字节
        while((len = bis.read()) != -1){
            System.out.println(len);
        }

		// int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
        byte[] bytes = new byte[1024]; // 存储每次读取的数据
        int len = 0; // 记录每次读取的有效字节个数
        while((len = bis.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
4. 释放资源
例如:	bis.close();

缓冲流的效率测试

文件复制练习:一读一写

明确:
    数据源:c:\\1.jpg
    数据的目的地:d:\\1.jpg
文件复制的步骤:
    1. 创建字节缓冲输入流对象,构造方法中传递字节输入流
    2. 创建字节缓冲输出流对象,构造方法中传递字节输出流
    3. 使用字节缓冲输入流对象中的方法read,读取文件
    4. 使用字节缓冲输出流中的方法write,把读取的数据写入到内部缓冲区中
    5. 释放资源(会先把缓冲区中的数据,刷新到文件中)
文件的大小:780831字节
缓冲流一次读写一个字节:32毫秒
缓冲流使用数组缓存读取多个字节,写入多个字节:5毫秒

public static void main(String[] args) throws IOException {
	long s = System.currentTimeMillis();
 	
 	BufferedInputStream bis = new BufferedInputStream(new FileInputStream("c:\\1.jpg"));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:\\1.jpg"));   
    
    // 一次读取一个字节写入一个字节的方式
    /*int len = 0;
    while((len = bis.read()) != -1){
		bos.write(len);
    }*/

	// 使用数组缓存读取多个字节,写入多个字节
    byte[] bytes = new byte[1024];
    int len = 0;
    while((len = bis.read(bytes)) != -1){
    	bos.write(bytes,0,len);
    }

    bos.close();
    bis.close();

    long e = System.currentTimeMillis();
    System.out.println("复制文件共耗时:" + (e-s) + "毫秒");
}

注意:以下为不使用缓冲流
FileInputStream fis = new FileInputStream("c:\\1.jpg");
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
文件的大小:780831字节
一次读写一个字节:6043毫秒
使用数组缓存读取多个字节,写入多个字节:10毫秒

字符缓冲输出流BufferedWriter

java.io.BufferedWriter extends Writer

继承自父类的共性成员方法:
    - void write(int c) 写入单个字符。
    - void write(char[] cbuf) 写入字符数组。
    - void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    - void write(String str) 写入字符串。
    - void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    - void flush() 刷新该流的缓冲。
    - void close() 关闭此流,但要先刷新它。

构造方法:
    BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
    BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
    参数:
        Writer out:字符输出流
            我们可以传递FileWriter,缓冲区会给FileWriter增加一个缓冲区,提高FileWriter的写入效率
        int sz:指定缓冲区的大小,不写默认大小

【特有的成员方法】:
    void newLine() 写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符
    换行:换行符号
	    windows:\r\n
	    linux:/n
	    mac:/r

使用步骤:
1. 创建字符缓冲输出流对象,构造方法中传递字符输出流
例如:	BufferedWriter bw = new BufferedWriter(new FileWriter("day10-code\\c.txt"));
2. 调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
例如:	for (int i = 0; i < 10; i++) {
            bw.write("XXXX");
			// bw.write("\r\n");
            bw.newLine();
        }
3. 调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
例如:	bw.flush();
4. 释放资源
例如:	bw.close();

字符缓冲输入流BufferedReader

java.io.BufferedReader extends Reader

继承自父类的共性成员方法:
    int reader() 读取单个字符并返回。
    int read(char[] cbuf) 一次读取多个字符,将字符读入数组。
    void close() 关闭该流并释放与之关联的所有资源。
构造方法:
    BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
    BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
    参数:
         Reader in:字符输入流
            我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率
            
【特有的成员方法】:
    String readLine() 读取一个文本行。读取一行数据
        行的终止符号:通过下列字符之一即可认为某行已终止:换行('\n')或回车后直接跟着换行(\r\n)。
    返回值:
        包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null

使用步骤:
1. 创建字符缓冲输入流对象,构造方法中传递字符输入流
例如:	BufferedReader br = new BufferedReader(new FileReader("day10-code\\c.txt"));
2. 使用字符缓冲输入流对象中的方法read/readLine读取文本
例如:	String line;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
3. 释放资源
例如:	br.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值