import java.io.*;
class reader{
public static void main(String args[])throws IOException{
FileReader f=new FileReader("a.txt");
BufferedReader br=new BufferedReader(f);
System.out.println(br.readLine());
br.(0);
br.reset();
System.out.println(br.readLine());
}
}
a.txt文件中的内容是hello world.
得到的结果是:
hello world.
null
Press any key to continue...
我想第二次通过readLine方法把a.txt里的内容再读一遍.但是就是出不来,结果仍是null.
在程序中我使用了和reset方法.但是没起作用,请问这两个方法怎么用呢?如何才能重复读取文件里的内容呢?

解决方案 »

  1.   

    FileReader也是个OutputStream,是个数据流,类似于水从自来水管流出,读过一次以后就不会再读到。
    要重复读取,可以尝试使用过滤器PushbackReader,它是个允许将字符推回到流的字符流reader。
      

  2.   

    System.out.println(br.readLine());
    br.(0);把这两行换一下,另外的参数不应该是0,
    它的含义是:保持标记不变时,读取的字符数的限制。在读取这么多字符之后试图reset时,有可能会失败。 
      

  3.   

    与楼上说的无关,方法用错了
    1、读取之前先一下,否则回不去了
    2、方法的参数是指失效之前最多能读取的字符数量,读取超过这个数量之后,前一个就失效了,详细介绍自己看api。import java.io.*;
    class reader{
    public static void main(String args[])throws IOException{
    FileReader f=new FileReader("reader.java");
    BufferedReader br=new BufferedReader(f);
    br.(1024);  // 先,再read,1024表示从这里开始读取超过1024个字符,该就失效了
    System.out.println(br.readLine());
    br.reset();
    System.out.println(br.readLine());
    }
    }
      

  4.   

    br.(100);
    System.out.println(br.readLine());
    br.reset();
      

  5.   

    问题解决了,但是我还有些疑问?我上面的程序是访问a.txt这个文件。这个文件的内容是
    hello world.并且没有换行。如果的值少于字符的个数就会失败。例如
    import java.io.*;
    class reader{
    public static void main(String args[])throws IOException{
    FileReader f=new FileReader("a.txt");
    BufferedReader br=new BufferedReader(f);
    br.(5);  //这里写成了5就会在第二个readLine当中出错.而写大一点例如写20就没事.
    System.out.println(br.readLine());
    br.reset();
    System.out.println(br.readLine());
    }
    }
    关于方法的参数,java的api上面说 "限制值大于输入缓冲区的大小将导致分配一个新缓冲区,其大小不小于该限制值。因此应该小心使用较大的值。"参数写多大合适呢?
      

  6.   

    具体的长度确实要由编写者决定了,如果真的不的话,也可以这样做
    File f=new File("a.txt");
    BufferedReader br=new BufferedReader(f);
    br.(f.length());
      

  7.   

    具体的长度确实要由编写者决定了,如果真的不能确定近似的值话,也可以这样做
    File f=new File("a.txt");
    BufferedReader br=new BufferedReader(f);
    br.(f.length()+1);限制值大于输入缓冲区的大小将导致分配一个新缓冲区,其大小不小于该限制值。因此应该小心使用较大的值
    这句话的意思是,当的参数大于读入缓冲区的长度时,为了能让流重置(reset)到的位置,jvm必须开辟额外的缓冲区以存储读过的流的数据,也就是说会占用更多的内存,因此需要用户谨慎使用这个参数。所以如果流的数据量非常大时,要重新读取流的数据,不如重新打开一次,更加节省系统资源。
      

  8.   

    提问
    Hello World是11个字符
    br.(11);运行就出错
    br.(12);运行正确
    为什么?
    方法的参数是指失效之前最多能读取的字符数量,读取超过这个数量之后,前一个就失效
    放11的时候刚好是读取了11个字符啊。刚好读完。为什么会出错?br.(f.length()+1);FileReader好像没有length()方法
      

  9.   

    汗,问题真多。Hello World是11个字符
    br.(11);运行就出错
    br.(12);运行正确
    为什么?你用getline方法读取,总要有字符表示读取结束,否则程序怎么知道Hello World(11个字符)到这里就是一行了,这个字符不论是换行'\n'还是文件结束EOF都要占用一个长度,因此实际已经读取超过了11个字符,所以会失效。br.(f.length()+1);FileReader好像没有length()方法看清楚,
    File f=new File("a.txt");
    BufferedReader br=new BufferedReader(f);
    br.(f.length()+1);
    f是File不是FileReader!