黑马程序员技术交流社区

标题: IO的readLine方法 [打印本页]

作者: 余明辉    时间: 2012-8-14 00:09
标题: IO的readLine方法
public class Demo {
public static void main(String[] args) throws IOException{
File file =new File("file/a.txt");    //随便读取一个文本文件,最好文件大一点才会出现问题
int b =1;
int i=0;
int a =0;
FileInputStream fis =new FileInputStream(file);
InputStreamReader isr =new InputStreamReader(fis);
while(i<10){
while(a<10){
BufferedReader bis = new BufferedReader(isr);
System.out.println(bis.readLine()+"     "+b++);     //这里会打印出null   ,为什么 ,怎么解决
a++;
if(a==5){break;}
}
i++;
}
}
}

作者: 李知伦    时间: 2012-8-14 00:38
因为你这一句BufferedReader bis = new BufferedReader(isr);在while循环中,就每次都会创建一个BufferedReader(isr)对象,但是只有第一个包装了isr,能读取到第一行,后面的就都读不到数据
内层循环与 i 没有任何关系,外层循环也就起不到作用,
如果你想读取指定行数,并打印行数,这样写比较合适
  1. import java.io.*;
  2. public class test {
  3.         public static void main(String[] args) throws IOException{
  4.                 File file =new File("a.txt");    //随便读取一个文本文件,最好文件大一点才会出现问题
  5.                 FileInputStream fis =new FileInputStream(file);
  6.                 InputStreamReader isr =new InputStreamReader(fis);
  7.                 BufferedReader bis = new BufferedReader(isr);               
  8.                 for (int i=0,b=1;i<10 ;i++,b++ )
  9.                 {
  10.                         //if(i==5){break;}
  11.                         System.out.println(b+".\t"+bis.readLine());  //这里会打印出null   ,为什么 ,怎么解决
  12.                 }
  13.         }
  14. }
复制代码

作者: 杜佳瑞    时间: 2012-8-14 00:51
import java.io.*;
class DemoTest1
{
        public static void main(String[] args) throws IOException
        {
                File file =new File("Test2.java");    //随便读取一个文本文件,最好文件大一点才会出现问题
                int b =1;
                int i=0;
                int a =0;
                FileInputStream fis =new FileInputStream(file);
                InputStreamReader isr =new InputStreamReader(fis);
                while(i<10)
                {
                        while(a<10)
                        {        

                                BufferedReader bis = new BufferedReader(isr);//这里每次循环都会创建一个新的缓冲区,虽然我不知道这原理是什么,但肯定得放到外面。
                                System.out.println(bis.readLine()+"     "+(b++)+"..."+i); 我这里面加了点东西,结果可以看出前5次打印i=0,后5次i=1,所以我想不通楼主下面那个判断是干吗用的。对整个结果没有任何影响                              
                                a++;
                                if(a==5)//
                                        break;
                        }
                        i++;
                }
        }
}

作者: 杨习平    时间: 2012-8-14 02:02
public class Demo {
public static void main(String[] args) throws IOException{
File file =new File("file/a.txt");    //随便读取一个文本文件,最好文件大一点才会出现问题
int b =1;
int i=0;
int a =0;
FileInputStream fis =new FileInputStream(file);
InputStreamReader isr =new InputStreamReader(fis);
while(i<10){
while(a<10){
BufferedReader bis = new BufferedReader(isr);
   while(bis.readLine()!=null){//我在这里改进了一下,你看看吧,合不合你的想法           System.out.println(bis.readLine() + "     " + b++);

     }
                                        a++;
if(a==5){break;}
}
i++;
}
}
}

作者: 余明辉    时间: 2012-8-14 23:33
我也是网上看到的一个题目,自己一直没有想明白为什么会出现这种问题。我的解决方法也是把new BufferedReader放在循环外面,听人说如果放在循环里面的话,第一次可以读,但是第二次的话,java有个保护机制,就不允许再读了,所以后面输出的全部都是null。
问题已经解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2