简述
节点流:可以从一个特定的数据源读写数据(FileRead等)。处理流:在节点流的基础上,为程序提供更加强大的读写功能(BufferedReader等),可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。例如处理流BufferedWrite(Writer w)可以封装Write的任意子类对象,更加灵活。修饰器模式。节点流:可以从一个特定的数据源读写数据(FileRead等)。处理流:在节点流的基础上,为程序提供更加强大的读写功能(BufferedReader等)。
BufferedReader
BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。构造方法:1.BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。2.BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。成员方法:1.read() 读取单个字符。2.read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。3.readLine() 读取一个文本行。4.close() 关闭该流并释放与之关联的所有资源。
public static void main(String[] args) { BufferedReader br = null; try { String filePath = "C:\\Users\\ms674\\Desktop\\File\\file1.txt"; //创建BufferedReader对象封装FileReader对象实现增强 br = new BufferedReader(new FileReader(filePath)); //按行读取效率高 String line; while ((line = br.readLine()) != null) { System.out.println(line); } System.err.println("文件读取完毕..."); } catch (Exception e) { e.printStackTrace(); } finally { //只需要关闭处理流,底层会自动关闭节点流 if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } }}
BufferedWriter
BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。构造方法:1.BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。2.BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。成员方法:1.write(int c) 写入单个字符。2.write(char[] cbuf, int off, int len) 写入字符数组的某一部分。3.write(String s, int off, int len) 写入字符串的某一部分。4.newLine() 写入一个行分隔符。5.flush() 刷新该流的缓冲,将缓冲区的内容写入本地磁盘。6.close() 关闭此流,但要先刷新它。
public static void main(String[] args) { String filePath = "C:\\Users\\ms674\\Desktop\\File\\buffered-w1.txt"; BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(filePath,true)); bw.write("你好,Java!"); bw.newLine();//换行 bw.write("你好,Python!"); } catch (IOException e) { e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } }}
BufferedInputStream
BufferedInputStreamBufferedInputStream为另一个输入流添加一些功能,即缓冲输入以及支持mark和reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。构造方法:1.BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,封装增强in。成员方法:1.read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个byte 数组中。2.close() 关闭此输入流并释放与该流关联的所有系统资源。
BufferedOutputStream
BufferedOutputStream该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。构造方法:1.BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。成员方法:1.write(int b) 将指定的字节写入此缓冲的输出流,b为字符ASCII码。2.write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。3.flush() 刷新此缓冲的输出流,将缓冲区数据写入本地磁盘。4.close() 关闭流,关闭前默认执行一次缓冲区刷新。
二进制文本拷贝案例
public static void main(String[] args) { //BufferedInputStream封装InputStream子类对象实现增强,会创建内部缓冲区数组 BufferedInputStream bis = null; BufferedOutputStream bos = null; try { String filePath = "C:\\Users\\ms674\\Desktop\\File\\img1.png"; String copyPath = "C:\\Users\\ms674\\Desktop\\File\\DDD\\copy-img1.png"; bis = new BufferedInputStream(new FileInputStream(new File(filePath))); bos = new BufferedOutputStream(new FileOutputStream(new File(copyPath))); int len; byte[] bs = new byte[1024]; while ((len = bis.read(bs)) != -1) { bos.write(bs,0,len); } System.out.println("拷贝成功"); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } }}