zoukankan      html  css  js  c++  java
  • Java字节缓冲流和字符缓冲流学习

    1、字节缓冲流

    首先要明确一个概念:对文件或其他目标频繁的读写操作,效率低,性能差。
    使用缓冲流的好处是,能够高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来。

    BufferedInputStream:为另一个输入流添加一些功能,在创建BufferedInputStream时,会创建一个内部缓冲区数组,用于缓冲数据。
    BufferedOutputStream:通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    /**
    * 缓存的目的:解决写入文件操作时,频繁的操作文件所带来的性能降低的问题
    * BufferedOutputStream内部默认的缓存大小是8kb,每次写入时存储到缓存中的byte数组中, 会把数组中的数据写入文件,并且下标归零
    */
    public class BufferedStreamDemo {
    
    	public static void main(String[] args) {
    		byteWriter();
    		byteReader();
    	}
    
    	private static void byteReader() {
    		File file = new File("F:/test.txt");
    		try {
    			InputStream in = new FileInputStream(file);
    
    			// 构造一个字节缓冲流
    			BufferedInputStream bis = new BufferedInputStream(in);
    			byte[] flush = new byte[1024];
    			int len = -1;
    			while ((len = bis.read(flush)) != -1) {
    				System.out.println(new String(flush, 0, len));
    			}
    			bis.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}// byteReader
    
    	private static void byteWriter() {
    		File file = new File("F:/test.txt");
    
    		try {
    			OutputStream out = new FileOutputStream(file, true);
    			BufferedOutputStream bos = new BufferedOutputStream(out);
    
    			String info = "你爱Java吗?";
    			bos.write(info.getBytes());
    			bos.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}// byteWriter
    }
    

    2、字符缓冲流

    BufferedReader:从字符输入流中读取文本,缓冲各个字节,从而实现字符、数组和行的高效读取。
    BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    private static void charWriter() {
    	File file = new File("F:/test.txt");
    	try {
    		Writer writer = new FileWriter(file, true);
    		BufferedWriter bw = new BufferedWriter(writer);
    
    		bw.write("我爱Java SE");
    		bw.flush();
    		bw.close();
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }// charWriter
    
    private static void charReader() {
    	File file = new File("F:/test.txt");
    	try {
    		Reader reader = new FileReader(file);
    		// 为字符流提供缓存,达到高效读取的目的
    		BufferedReader br = new BufferedReader(reader);
    		char[] buf = new char[1024];
    		int len = -1;
    		while ((len = br.read(buf)) != -1) {
    			System.out.println(new String(buf, 0, len));
    		}
    		br.close();// 不用关闭reader,是因为关闭br时内部已经帮我们关闭了reader
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }// charReader
    

    为什么要用字符缓冲流

    • 字符缓冲流: 加入字符缓冲流,增强读取功能,新增方法readLine() 更高效的读取
    • FileReader:内部使用InputStreamReader,解码过程,byte->char,默认缓存大小是8k
    • BufferedReader:默认缓存大小是8k,但是可以手动指定大小,把数据直接读取到缓存中,减少转换过程的次数,效率更高。所以虽然FileReader中已经加入了缓存,仍要加上BufferedReader的原因
  • 相关阅读:
    为lvm逻辑分区扩容
    Linux性能优化课程笔记-CPU性能工具
    Linux性能优化课程笔记-bcc工具
    nmcli命令添加bond网口
    IPv6地址冲突
    mongodb的审计功能
    BIND支静态存根区域
    git的使用(2)
    全世界都在学python-打开文件
    java操作mongodb时,对象bean和DBObject相互转换的方法
  • 原文地址:https://www.cnblogs.com/zxfei/p/10873898.html
Copyright © 2011-2022 走看看