二、 1. BufferedWriter java.io
类 BufferedWriter java.io.BufferedWriter 所有已实现的接口: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。 通常 Writer 将其输出立即发送到基础字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如, PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。 2. BuffereReader java.io
类 BufferedReader java.io.BufferedReader 所有已实现的接口: 直接已知子类: 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如, BufferedReader in = new BufferedReader(new FileReader("foo.in")); 将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 可以对使用 DataInputStream 进行按原文输入的程序进行本地化,方法是用合适的 BufferedReader 替换每个 DataInputStream。 3. 通过缓存区复制文本文件 public class CopyTextByBuf { /** * 通过缓冲区复制一个.java文件 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub BufferedReader bufr = null; BufferedWriter bufw = null; try{ bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java")); bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt")); String line = null; while ((line = bufr.readLine())!= null) { bufw.write(line); bufw.newLine(); bufw.flush(); } }catch(IOException e){ System.out.print(e.toString()); throw new RuntimeException("读写失败!"); }finally{ try{ if(bufr != null){ bufr.close(); } }catch(IOException e){ throw new RuntimeException("读取关闭失败!"); } try{ if(bufw != null){ bufw.close(); } }catch(IOException e){ throw new RuntimeException("写入关闭失败!"); } } } } 4. ReadLine 的原理图例 readLine 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 返回: 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 抛出: 无论是读一行,或者读取多个字符,其实最终都是在硬盘上一个一个读取。所以最终使用的还是Read 方法一次读一个的方法。其实在内部是有一个封装好的数组,分配在内存中的。 5. MybufferedReader public class MybufferedReader { private FileReader r; public MybufferedReader(FileReader r) { // TODO Auto-generated constructor stub this.r = r; } public String MyReaderLine () throws IOException{ //定义一个临时容器 StringBuilder sBuilder = new StringBuilder(); int ch = 0; while ((ch = r.read())!= -1) { if(ch =='\r') continue; if(ch =='\n') return sBuilder.toString(); else sBuilder.append((char)ch); } if(sBuilder.length()!= 0){ return sBuilder.toString(); } return null; } public void MyClose() throws IOException{ r.close(); } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileReader fr = new FileReader("buf.txt"); MybufferedReader mybuf = new MybufferedReader(fr); String line = null; while ((line = mybuf.MyReaderLine())!=null) { System.out.print(line); } mybuf.MyClose(); } }
这是老毕讲的IO流第二阶段的一部分视频的内容。有时间把你们总结的内容也给我分享分享,我很希望看看大家从视频中都看到的有什么。
|