网站营销软件,利用wordpress建站怎么上传网页,企业网站建设信息管理平台的立项目的,网站建设要素BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用socket.close()关闭不需要的socket.从一个有若干行的文件中依次读取各行#xff0c;处理后输出#xff0c;如果用以下方法处理后输出如果用以下方法则会出现除第一行外行首字符丢失现象.String str null;brnew BufferedReader(new FileReader(fileName));do{str buf.readLine());}while(br.read()!-1);以下用法会使每行都少首字符while(br.read() ! -1){str br.readLine();}原因就在于br.read() ! -1 这判断条件上。 因为在执行这个条件的时候其实它已经读取了一个字符了然而在这里并没有对读取出来的这个字符做处理所以会出现少一个字符,如果你这里写的是while(br.readLine()null)会出现隔一行少一行!建议使用以下方法String str null;while((str br.readLine()) ! null){//System.out.println(str);//此时str就保存了一行字符串}这样应该就可以无字符丢失地得到一行了虽然写IO方面的程序不多但BufferedReader/BufferedInputStream倒是用过好几次的原因是它有一个很特别的方法readLine()使用起来特别方便每次读回来的都是一行省了很多手动拼接buffer的琐碎它比较高效相对于一个字符/字节地读取、转换、返回来说它有一个缓冲区读满缓冲区才返回一般情况下都建议使用它们把其它Reader/InputStream包起来使得读取数据更高效。对于文件来说经常遇到一行一行的特别相符情景。这次是在蓝牙开发时使用两个蓝牙互相传数据(即一个发一个收)bluecove这个开源组件已经把数据读取都封装成InputStream了也就相当于平时的IO读取了很自然就使用起readLine()来了。发数据BufferedWriter output new BufferedWriter(new OutputStreamWriter(conn.openOutputStream()));int i 1;String message message i;while(isRunning) {output.write(message/n);i;}读数据BufferedReader input new BufferedReader(new InputStreamReader(m_conn.openInputStream()));String message ;String line null;while((line m_input.readLine()) ! null) {message line;}System.out.println(message);上面是代码的节选使用这段代码会发现写数据时每次都成功而读数据侧却一直没有数据输出(除非把流关掉)。经过折腾原来这里面有几个大问题需要理解误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1)而实际上readLine()是一个阻塞函数当没有数据读取时就一直会阻塞在那而不是返回null因为readLine()阻塞后System.out.println(message)这句根本就不会执行到所以在接收端就不会有东西输出。要想执行到System.out.println(message)一个办法是发送完数据后就关掉流这样readLine()结束阻塞状态而能够得到正确的结果但显然不能传一行就关一次数据流另外一个办法是把System.out.println(message)放到while循环体内就可以。readLine()只有在数据流发生异常或者另一端被close()掉时才会返回null值。如果不指定buffer大小则readLine()使用的buffer有8192个字符。在达到buffer大小之前只有遇到/r、/n、/r/n才会返回。readLine()的实质(下面是从JDK源码摘出来的)String readLine(boolean ignoreLF) throws IOException {StringBuffer s null;int startChar;synchronized (lock) {ensureOpen();boolean omitLF ignoreLF || skipLF;bufferLoop:for (;;) {if (nextChar nChars)fill(); //在此读数据if (nextChar nChars) { /* EOF */if (s ! null s.length() 0)return s.toString();elsereturn null;}......//其它}private void fill() throws IOException {..../其它int n;do {n in.read(cb, dst, cb.length - dst); //实质} while (n 0);if (n 0) {nChars dst n;nextChar dst;}}从上面看出readLine()是调用了read(char[] cbuf, int off, int len) 来读取数据后面再根据/r或/n来进行数据处理。小结使用readLine()一定要注意读入的数据要注意有/r或/n或/r/n没有数据时会阻塞在数据流异常或断开时才会返回null使用socket之类的数据流时要避免使用readLine()以免为了等待一个换行/回车符而一直阻塞1.读取一个txt文件,方法很多种我使用了字符流来读取(为了方便)FileReader fr new FileReader(f:\\TestJava.Java);BufferedReader bf new BufferedReader(fr);//这里进行读取int b;while((bbf.read())!-1){System.out.println(bf.readLine());}发现每行的第一个字符都没有显示出来原因呢bbf.read())!-1 每次都会先读取一个字节出来所以后面的bf.readLine())读取的就会每行少一个字节所以应该使用String valueString null;while ((valueStringbf.readLine())!null){System.out.println(valueString);}