关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单;(2)使用处理流执行效率更高。

1、BufferedInputStream/BufferedOutputStream和BufferedReader/BufferedWriter

Constructor

Description

BufferedInputStream(InputStream

Creates a  BufferedInputStream and saves its argument, the input stream  in, for later use.

BufferedInputStream(InputStream

Creates a  BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.       

  

All MethodsInstance MethodsConcrete Methods

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

Creates a buffered character-output stream that uses a default-sized output buffer.

BufferedWriter(Writer

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

Writes a portion of a String.

 

Constructor

Description

BufferedReader(Reader

Creates a buffering character-input stream that uses a default-sized input buffer.

BufferedReader(Reader

Creates a buffering character-input stream that uses an input buffer of the specified size.                                                                       

 

All MethodsInstance MethodsConcrete Methods

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

Creates a new print stream, without automatic line flushing, with the specified file.

PrintStream(File file, String

Creates a new print stream, without automatic line flushing, with the specified file and charset.

PrintStream(OutputStream

Creates a new print stream.

PrintStream(OutputStream

Creates a new print stream.

PrintStream(OutputStream out, boolean autoFlush,String

Creates a new print stream.

PrintStream(String

Creates a new print stream, without automatic line flushing, with the specified file name.

PrintStream(String fileName, String

Creates a new print stream, without automatic line flushing, with the specified file name and charset.

 

Constructor

Description

PrintWriter(File

Creates a new PrintWriter, without automatic line flushing, with the specified file.

PrintWriter(File file, String

Creates a new PrintWriter, without automatic line flushing, with the specified file and charset.

PrintWriter(OutputStream

Creates a new PrintWriter, without automatic line flushing, from an existing OutputStream.

PrintWriter(OutputStream

Creates a new PrintWriter from an existing OutputStream.

PrintWriter(Writer

Creates a new PrintWriter, without automatic line flushing.

PrintWriter(Writer

Creates a new PrintWriter.

PrintWriter(String

Creates a new PrintWriter, without automatic line flushing, with the specified file name.

PrintWriter(String fileName, String

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

Creates a new string reader.                                                                                                                                                                                     

 

All MethodsInstance MethodsConcrete Methods

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.

 

All MethodsInstance MethodsConcrete Methods

Modifier and Type

Method

Description

StringWriter

append(char c)

Appends the specified character to this writer.

StringWriter

append(CharSequence

Appends the specified character sequence to this writer.

StringWriter

append(CharSequence

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

Write a string.

void

write(String

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 = "从明天起,做一个幸福的人\n"
10                 + "喂马,劈柴,周游世界\n"
11                 + "从明天起,关心粮食和蔬菜\n"
12                 + "我有一所房子,面朝大海,春暖花开\n"
13                 + "从明天起,和每一个亲人通信\n"
14                 + "告诉他们我的幸福\n";
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("有一个美丽的新世界,\n");
33             sw.write("她在远方等我,\n");
34             sw.write("哪里有天真的孩子,\n");
35             sw.write("还有姑娘的酒窝\n");
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

Creates a  PushbackInputStream with a 1-byte pushback buffer, and saves its argument, the input stream  in, for later use.

PushbackInputStream(InputStream

Creates a  PushbackInputStream with a pushback buffer of the specified  size, and saves its argument, the input stream  in, for later use.

 

All MethodsInstance MethodsConcrete Methods

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

Creates a new pushback reader with a one-character pushback buffer.

PushbackReader(Reader

Creates a new pushback reader with a pushback buffer of the given size.                                                                                           

 

All MethodsInstance MethodsConcrete Methods

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("