关于缓冲区readLine函数的原理

来源:互联网 发布:linux中rpm命令 编辑:程序博客网 时间:2024/05/17 04:50

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

关于android培训前java基础学习的心得笔记先

第三篇:关于缓冲区readLine函数的原理及使用

readLine(),使用起来特别方便,每次读回来的都是一行,省了很多手动拼接buffer的琐碎;所以比较受程序员们的喜爱。

原以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null;因为readLine()阻塞后,System.out.println(message)这句根本就不会执行到,所以在接收端就不会有东西输出。要想执行到System.out.println(message),一个办法是发送完数据后就关掉流,这样readLine()结束阻塞状态,而能够得到正确的结果,但显然不能传一行就关一次数据流;另外一个办法是把System.out.println(message)放到while循环体内就可以。我后面仿照readLine函数原理自己写的函数就是按照这种方法输出的。另外,readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。

附带实现原理的代码:

import java.io.*;

public class Readline {
public static void main(String[] args){
myBufferedReader myBuf = null;
FileReader fr;
try{
fr = new FileReader("buf.txt");
myBuf = new myBufferedReader(fr);
String line = null;
while((line=myBuf.myReadLine())!=null){
System.out.print(line);
}

}
catch(IOException e){

}
finally{
try{
if(myBuf!=null)
myBuf.myClose();
}catch(IOException e)
{
throw new RuntimeException("关闭读写失败");
}
}
}
}
class myBufferedReader{
private FileReader r;
myBufferedReader(FileReader r){
this.r=r;
}
//自定义一个readLine函数
public String myReadLine() throws IOException{
StringBuilder sb =new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
return null;
}
public void myClose() throws IOException{
r.close();
}
}


0 0