关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单;(2)使用处理流执行效率更高。
1、BufferedInputStream/BufferedOutputStream和BufferedReader/BufferedWriter
Constructor | Description |
---|---|
BufferedInputStream(InputStream in) |
Creates a
BufferedInputStream and saves its argument, the input stream in , for later use. |
BufferedInputStream(InputStream in, int size) |
Creates a
BufferedInputStream with the specified buffer size, and saves its argument, the input streamin , for later use. |
Modifier and Type | Method | Description |
---|---|---|
int |
available() |
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.
|
void |
close() |
Closes this input stream and releases any system resources associated with the stream.
|
void |
mark(int readlimit) |
See the general contract of the
mark method of InputStream . |
boolean |
markSupported() |
Tests if this input stream supports the
mark and reset methods. |
int |
read() |
See the general contract of the
read method of InputStream . |
int |
read(byte[] b, int off, int len) |
Reads bytes from this byte-input stream into the specified byte array, starting at the given offset.
|
void |
reset() |
See the general contract of the
reset method of InputStream . |
long |
skip(long n) |
See the general contract of the
skip method of InputStream . |
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class BufferedStreamTest1 { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 FileInputStream fis = 11 new FileInputStream("D:\User_zhaoyingjun\JavaSE\Java_Eclipse_Workspace\HelloWorld2\src\com\zyjhandsome\io\BufferedStreamTest1.java"); 12 BufferedInputStream bis = new BufferedInputStream(fis); 13 int c = 0; 14 System.out.println(bis.read()); 15 System.out.println(bis.read()); 16 bis.mark(10); 17 for (int i = 0; i < 10 && (c = bis.read()) != -1; i++) 18 { 19 System.out.print(c + " "); 20 } 21 System.out.println(); 22 bis.reset(); 23 for (int i = 0; i < 10 && (c = bis.read()) != -1; i++) 24 { 25 System.out.print(c + " "); 26 } 27 } catch (FileNotFoundException e2) { 28 // TODO Auto-generated catch block 29 e2.printStackTrace(); 30 } catch (IOException e1) { 31 // TODO Auto-generated catch block 32 e1.printStackTrace(); 33 } 34 } 35 }
输出结果:
1 112 2 97 3 99 107 97 103 101 32 99 111 109 46 4 99 107 97 103 101 32 99 111 109 46
Constructor | Description |
---|---|
BufferedWriter(Writer out) |
Creates a buffered character-output stream that uses a default-sized output buffer.
|
BufferedWriter(Writer out, int sz) |
Creates a new buffered character-output stream that uses an output buffer of the given size.
|
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Closes the stream, flushing it first.
|
void |
flush() |
Flushes the stream.
|
void |
newLine() |
Writes a line separator.
|
void |
write(char[] cbuf, int off, int len) |
Writes a portion of an array of characters.
|
void |
write(int c) |
Writes a single character.
|
void |
write(String s, int off, int len) |
Writes a portion of a String.
|
Constructor | Description |
---|---|
BufferedReader(Reader in) |
Creates a buffering character-input stream that uses a default-sized input buffer.
|
BufferedReader(Reader in, int sz) |
Creates a buffering character-input stream that uses an input buffer of the specified size.
|
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Closes the stream and releases any system resources associated with it.
|
Stream<String> |
lines() |
Returns a
Stream , the elements of which are lines read from this BufferedReader . |
void |
mark(int readAheadLimit) |
Marks the present position in the stream.
|
boolean |
markSupported() |
Tells whether this stream supports the mark() operation, which it does.
|
int |
read() |
Reads a single character.
|
int |
read(char[] cbuf, int off, int len) |
Reads characters into a portion of an array.
|
String |
readLine() |
Reads a line of text.
|
boolean |
ready() |
Tells whether this stream is ready to be read.
|
void |
reset() |
Resets the stream to the most recent mark.
|
long |
skip(long n) |
Skips characters.
|
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class BufferedStreamTest2 { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 BufferedWriter bw = new BufferedWriter( 11 new FileWriter("D:\User_zhaoyingjun\JavaSE\Test\BufferedStreamTest2.dat")); 12 BufferedReader br = new BufferedReader( 13 new FileReader("D:\User_zhaoyingjun\JavaSE\Test\BufferedStreamTest2.dat")); 14 String s = null; 15 for (int i = 0; i <= 100; i++) 16 { 17 s = String.valueOf(Math.random()); 18 bw.write(s); 19 bw.newLine(); 20 } 21 bw.flush(); 22 while ((s = br.readLine()) != null) 23 { 24 System.out.println(s); 25 } 26 bw.close(); 27 br.close(); 28 } catch (IOException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 } 33 }
2、处理流的用法(PrintStream)
下面程序使用PrintStream处理流来包装OutputStream,使用处理流后的输出流在输出时将更加方便。
PrintWriter和PrintStream都属于输出流,分别针对字符和字节。
PrintWriter和PrintStream提供了重载print、println方法用于多种数据类型的输出。
PrintWriter和PrintStream的输出不会抛出异常,用户通过检测错误状态获取错误信息。
PrintWriter和PrintStream有自动flush功能。
Constructor | Description |
---|---|
PrintStream(File file) |
Creates a new print stream, without automatic line flushing, with the specified file.
|
PrintStream(File file, String csn) |
Creates a new print stream, without automatic line flushing, with the specified file and charset.
|
PrintStream(OutputStream out) |
Creates a new print stream.
|
PrintStream(OutputStream out, boolean autoFlush) |
Creates a new print stream.
|
PrintStream(OutputStream out, boolean autoFlush,String encoding) |
Creates a new print stream.
|
PrintStream(String fileName) |
Creates a new print stream, without automatic line flushing, with the specified file name.
|
PrintStream(String fileName, String csn) |
Creates a new print stream, without automatic line flushing, with the specified file name and charset.
|
Constructor | Description |
---|---|
PrintWriter(File file) |
Creates a new PrintWriter, without automatic line flushing, with the specified file.
|
PrintWriter(File file, String csn) |
Creates a new PrintWriter, without automatic line flushing, with the specified file and charset.
|
PrintWriter(OutputStream out) |
Creates a new PrintWriter, without automatic line flushing, from an existing OutputStream.
|
PrintWriter(OutputStream out, boolean autoFlush) |
Creates a new PrintWriter from an existing OutputStream.
|
PrintWriter(Writer out) |
Creates a new PrintWriter, without automatic line flushing.
|
PrintWriter(Writer out, boolean autoFlush) |
Creates a new PrintWriter.
|
PrintWriter(String fileName) |
Creates a new PrintWriter, without automatic line flushing, with the specified file name.
|
PrintWriter(String fileName, String csn) |
Creates a new PrintWriter, without automatic line flushing, with the specified file name and charset.
|
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class PrintStreamTest { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 FileOutputStream fos = new FileOutputStream("D:\User_zhaoyingjun\JavaSE\Test\PrintStreamTest.txt"); 11 PrintStream ps = new PrintStream(fos); 12 // 使用PrintStream执行输出 13 ps.println("普通字符串"); 14 // 直接使用PrintStream输出对象 15 ps.println(new PrintStreamTest()); 16 ps.close(); 17 } catch (FileNotFoundException e) { 18 // TODO Auto-generated catch block 19 e.printStackTrace(); 20 } 21 } 22 }
输出结果(文件“PrintStreamTest.txt”中的内容):
1 普通字符串 2 com.zyjhandsome.io.PrintStreamTest@71be98f5
由于PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。
在选择字节流或者字符流时,通常有一个规则:如果进行输入/输出的内容是文本内容,则应该考虑使用字符流;如果进行输入/输出的内容是二进制那内容,则应该考虑使用字节流。
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class TestPrintStream { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 PrintStream ps = null; 10 try { 11 FileOutputStream fos = new FileOutputStream("D:\User_zhaoyingjun\JavaSE\Test\TestPrintStream1.log"); 12 ps = new PrintStream(fos); 13 } catch (FileNotFoundException e) { 14 // TODO Auto-generated catch block 15 e.printStackTrace(); 16 } 17 if (ps != null) 18 { 19 System.setOut(ps); 20 } 21 int ln = 0; 22 // char型,16-bit 23 for (char c = 0; c <= 60000; c++) 24 { 25 System.out.println(c + ""); 26 if (ln++ >= 100) 27 { 28 System.out.println(); 29 ln = 0; 30 } 31 32 } 33 ps.close(); 34 } 35 }
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class TestPrintStream2 { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 String fileName = args[0]; 10 if (fileName != null) 11 { 12 list_test(fileName, System.out); 13 } 14 } 15 public static void list_test(String f, PrintStream ps) 16 { 17 try { 18 // 在字符流FileReader外面套了一个BufferReader,BufferReader类中有readLine()方法可以读取一行的内容 19 BufferedReader br = new BufferedReader(new FileReader(f)); 20 String s = null; 21 while ((s = br.readLine()) != null) 22 { 23 ps.println(s); 24 } 25 br.close(); 26 } catch (FileNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 ps.println("无法读取文件"); 33 } 34 } 35 }
1 package com.zyjhandsome.io; 2 3 import java.util.*; 4 import java.io.*; 5 6 public class TestPrintStream3 { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 String s = null; 11 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 12 try { 13 FileWriter fw = new FileWriter("D:\User_zhaoyingjun\JavaSE\Test\TestPrintStream3.log"); 14 // 也可以选择使用追加(增加文本内容)形式 15 // FileWriter fw = new FileWriter("D:\User_zhaoyingjun\JavaSE\Test\TestPrintStream3.log", true); 16 PrintWriter log = new PrintWriter(fw); 17 while ( (s = br.readLine()) != null ) 18 { 19 if (s.equals("exit")) 20 { 21 break; 22 // System.exit(-1); 23 } 24 System.out.println(s.toUpperCase()); 25 log.println("--------"); 26 log.println(s.toUpperCase()); 27 } 28 log.println("===" + new Date() + "==="); 29 log.flush(); 30 log.close(); 31 } catch (IOException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 } 36 }
输出结果:
1 hi 2 HI 3 hello 4 HELLO 5 hah 6 HAH 7 exit
在“TestPrintStream3.log”文件中输出结果:
-------- HI -------- HELLO -------- HAH ===Tue Sep 25 09:12:42 CST 2018===
3、输入/输出流体系
StringWriter和StringReader:
Constructor | Description |
---|---|
StringReader(String s) |
Creates a new string reader.
|
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Closes the stream and releases any system resources associated with it.
|
void |
mark(int readAheadLimit) |
Marks the present position in the stream.
|
boolean |
markSupported() |
Tells whether this stream supports the mark() operation, which it does.
|
int |
read() |
Reads a single character.
|
int |
read(char[] cbuf, int off, int len) |
Reads characters into a portion of an array.
|
boolean |
ready() |
Tells whether this stream is ready to be read.
|
void |
reset() |
Resets the stream to the most recent mark, or to the beginning of the string if it has never been marked.
|
long |
skip(long ns) |
Skips the specified number of characters in the stream.
|
Constructor | Description |
---|---|
StringWriter() |
Create a new string writer using the default initial string-buffer size.
|
StringWriter(int initialSize) |
Create a new string writer using the specified initial string-buffer size.
|
Modifier and Type | Method | Description |
---|---|---|
StringWriter |
append(char c) |
Appends the specified character to this writer.
|
StringWriter |
append(CharSequence csq) |
Appends the specified character sequence to this writer.
|
StringWriter |
append(CharSequence csq, int start, int end) |
Appends a subsequence of the specified character sequence to this writer.
|
void |
close() |
Closing a
StringWriter has no effect. |
void |
flush() |
Flush the stream.
|
StringBuffer |
getBuffer() |
Return the string buffer itself.
|
String |
toString() |
Return the buffer's current value as a string.
|
void |
write(char[] cbuf, int off, int len) |
Write a portion of an array of characters.
|
void |
write(int c) |
Write a single character.
|
void |
write(String str) |
Write a string.
|
void |
write(String str, int off, int len) |
Write a portion of a string.
|
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class StringNodeTest { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 String src = "从明天起,做一个幸福的人 " 10 + "喂马,劈柴,周游世界 " 11 + "从明天起,关心粮食和蔬菜 " 12 + "我有一所房子,面朝大海,春暖花开 " 13 + "从明天起,和每一个亲人通信 " 14 + "告诉他们我的幸福 "; 15 char[] buffer = new char[32]; 16 int hasRead = 0; 17 try { 18 StringReader sr = new StringReader(src); 19 // 采用循环方式读取字符串 20 while((hasRead = sr.read(buffer)) != -1) 21 { 22 System.out.print(new String(buffer, 0, hasRead)); 23 } 24 } catch (Exception e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 try { 29 StringWriter sw = new StringWriter(); 30 // 调用StringWriter的方法执行输出 31 // 调用StringWriter的方法执行输出 32 sw.write("有一个美丽的新世界, "); 33 sw.write("她在远方等我, "); 34 sw.write("哪里有天真的孩子, "); 35 sw.write("还有姑娘的酒窝 "); 36 System.out.println("----下面是sw的字符串节点里的内容----"); 37 // 使用toString()方法返回StringWtiter字符串节点的内容 38 System.out.println(sw.toString()); 39 } catch (Exception e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 } 44 }
输出结果:
1 从明天起,做一个幸福的人 2 喂马,劈柴,周游世界 3 从明天起,关心粮食和蔬菜 4 我有一所房子,面朝大海,春暖花开 5 从明天起,和每一个亲人通信 6 告诉他们我的幸福 7 ----下面是sw的字符串节点里的内容---- 8 有一个美丽的新世界, 9 她在远方等我, 10 哪里有天真的孩子, 11 还有姑娘的酒窝
4、转换流
输入/输出流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流,其中InputStringReader将输入字节流转换成字符输入流,OutputStringWriter将输出字节流转换成字符输出流。
Java使用System.in(这是一个InputStream字节流)代表标准输入,即键盘输入,使用不太方便,而且键盘那内容都是文本内容,所以可以使用InputStreamReader将其转换成字符输入流,普通的Reader读取输入内容时也不太方便,可以将普通的Reader再次包装成BufferedReader,利用BufferedReader的readLine()方法可以一次读取一行内容。如下程序所示。
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class TransFormKeyinTest { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 InputStreamReader reader = new InputStreamReader(System.in); 10 BufferedReader br = new BufferedReader(reader); 11 String s = null; 12 try { 13 s = br.readLine(); 14 while (s != null) 15 { 16 if (s.equals("exit")) 17 { 18 System.exit(1); 19 } 20 System.out.println(s.toUpperCase()); 21 s = br.readLine(); 22 } 23 br.close(); 24 } catch (IOException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 }
输出结果:
1 hello 2 HELLO 3 how are you. 4 HOW ARE YOU.
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class TransFormTest1 { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 OutputStreamWriter ows = new OutputStreamWriter( 11 new FileOutputStream("D:\User_zhaoyingjun\JavaSE\Test\TransFormTest1.txt")); 12 ows.write("microsoft..."); 13 // 获取当前输出流的编码方式 14 System.out.println(ows.getEncoding()); 15 ows.close(); 16 // FileOutputStream中第二个参数true代表是否在文件中追加内容 17 ows = new OutputStreamWriter( 18 new FileOutputStream("D:\User_zhaoyingjun\JavaSE\Test\TransFormTest1.txt", true), 19 "ISO8859_1"); 20 ows.write("microsoft..."); 21 // 获取当前输出流的编码方式 22 System.out.println(ows.getEncoding()); 23 ows.close(); 24 } catch (FileNotFoundException e2) { 25 // TODO Auto-generated catch block 26 e2.printStackTrace(); 27 } catch (IOException e1) { 28 // TODO Auto-generated catch block 29 e1.printStackTrace(); 30 } 31 } 32 }
输出结果:
1 GBK 2 ISO8859_1
5、推回输入流
在输入/输出流体系中,有两个特殊的流与众不同,就是PushbackInputStream和PushbackReader,它们提供的方法如下所示。
PushbackInputStream的构造器及方法:
Constructor | Description |
---|---|
PushbackInputStream(InputStream in) |
Creates a
PushbackInputStream with a 1-byte pushback buffer, and saves its argument, the input stream in , for later use. |
PushbackInputStream(InputStream in, int size) |
Creates a
PushbackInputStream with a pushback buffer of the specified size , and saves its argument, the input stream in , for later use. |
Modifier and Type | Method | Description |
---|---|---|
int |
available() |
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.
|
void |
close() |
Closes this input stream and releases any system resources associated with the stream.
|
void |
mark(int readlimit) |
Marks the current position in this input stream.
|
boolean |
markSupported() |
Tests if this input stream supports the
mark and reset methods, which it does not. |
int |
read() |
Reads the next byte of data from this input stream.
|
int |
read(byte[] b, int off, int len) |
Reads up to
len bytes of data from this input stream into an array of bytes. |
void |
reset() |
Repositions this stream to the position at the time the
mark method was last called on this input stream. |
long |
skip(long n) |
Skips over and discards
n bytes of data from this input stream. |
void |
unread(byte[] b) |
Pushes back an array of bytes by copying it to the front of the pushback buffer.(将一个字节数组内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
void |
unread(byte[] b, int off, int len) |
Pushes back a portion of an array of bytes by copying it to the front of the pushback buffer.(将一个字节数组里从off开始,长度为len字节的内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
void |
unread(int b) |
Pushes back a byte by copying it to the front of the pushback buffer.(将一个字节推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
PushbackReader的构造器和方法:
Constructor | Description |
---|---|
PushbackReader(Reader in) |
Creates a new pushback reader with a one-character pushback buffer.
|
PushbackReader(Reader in, int size) |
Creates a new pushback reader with a pushback buffer of the given size.
|
Modifier and Type | Method | Description |
---|---|---|
void |
close() |
Closes the stream and releases any system resources associated with it.
|
void |
mark(int readAheadLimit) |
Marks the present position in the stream.
|
boolean |
markSupported() |
Tells whether this stream supports the mark() operation, which it does not.
|
int |
read() |
Reads a single character.
|
int |
read(char[] cbuf, int off, int len) |
Reads characters into a portion of an array.
|
boolean |
ready() |
Tells whether this stream is ready to be read.
|
void |
reset() |
Resets the stream.
|
long |
skip(long n) |
Skips characters.
|
void |
unread(char[] cbuf) |
Pushes back an array of characters by copying it to the front of the pushback buffer.(将一个字符数组内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
void |
unread(char[] cbuf, int off, int len) |
Pushes back a portion of an array of characters by copying it to the front of the pushback buffer. (将一个字符数组里从off开始,长度为len字节的内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
void |
unread(int c) |
Pushes back a single character by copying it to the front of the pushback buffer.(将一个字符推回到推回缓冲区里,从而允许重复读取刚刚读取的内容)
|
可以发现最后三个方法与InputStream和Reader中的三个read()方法一一对应,这三个方法就是PushbackInputStream和PushbackReader的奥秘所在。
这两个推回输入流都带有一个推回缓冲区,当程序调用这两个推回输入流的unread()方法时,系统将会把指定数组的内容推回到该缓冲区里,而推回输入流每次调用read()方法时总是先从推回缓冲区读取,只有完全读取了推回缓冲区的内容后,但还没有装满read()所需要的数组时才会从原输入流中读取。
当创建一个PushbackInputStream和PushbackReader时需要指定推回缓冲区的大小,默认的推回缓冲区的长度为1。如果程序中推回到推回缓冲区的内容超出了推回 缓冲区的大小,将会引发Pushback buffer overflow的IOException异常。
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class PushbackTest { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 // 创建一个PushbackReader对象,指定退回缓冲区的长度为64 11 PushbackReader pr = new PushbackReader( 12 new FileReader("D:\User_zhaoyingjun\JavaSE\Java_Eclipse_Workspace\HelloWorld2\src\com\zyjhandsome\io\PushbackTest.java"), 64); 13 char[] buf = new char[32]; 14 // 用于保存上次读取的字符串内容 15 String lastContent = ""; 16 int hasRead = 0; 17 // 循环读取文件内容 18 while ((hasRead = pr.read(buf)) > 0) 19 { 20 // 将读取的内容转换成字符串 21 String content = new String(buf, 0, hasRead); 22 int targetIndex = 0; 23 // 将上次读取大的字符串和本次读取的字符串拼起来 24 // 查看是否包含目标字符串,如果包含目标字符串 25 if ( (targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0) 26 { 27 // 将本次内容和上次内容一起推回到缓冲区 28 pr.unread((lastContent + content).toCharArray()); 29 // 重新定义一个长度为targetIndex的char数组 30 if (targetIndex > 32) 31 { 32 buf = new char[targetIndex]; 33 } 34 // 再次读取指定长度的内容(就是目标字符串之间的内容 ) 35 pr.read(buf, 0, targetIndex); 36 // 打印去读的内容 37 System.out.print(new String(buf , 0 ,targetIndex)); 38 System.exit(0); 39 } 40 else 41 { 42 // 打印上次读取的内容 43 System.out.print(lastContent); 44 lastContent = content; 45 } 46 } 47 } catch (FileNotFoundException e2) { 48 // TODO Auto-generated catch block 49 e2.printStackTrace(); 50 } catch (IOException e1) { 51 // TODO Auto-generated catch block 52 e1.printStackTrace(); 53 } 54 } 55 }
输出结果:
1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class PushbackTest { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 try { 10 // 创建一个PushbackReader对象,指定退回缓冲区的长度为64 11 PushbackReader pr = new PushbackReader( 12 new FileReader("D:\User_zhaoyingjun\JavaSE\Java_Eclipse_Workspace\HelloWorld2\src\com\zyjhandsome\io\PushbackTest.java"), 64); 13 char[] buf = new char[32]; 14 // 用于保存上次读取的字符串内容 15 String lastContent = ""; 16 int hasRead = 0; 17 // 循环读取文件内容 18 while ((hasRead = pr.read(buf)) > 0) 19 { 20 // 将读取的内容转换成字符串 21 String content = new String(buf, 0, hasRead); 22 int targetIndex = 0; 23 // 将上次读取大的字符串和本次读取的字符串拼起来 24 // 查看是否包含目标字符串,如果包含目标字符串 25 if ( (targetIndex = (lastContent + content).indexOf("