如题,想计算一个BufferedReader的长度,然后将Reader的数据存到char[]中,代码如下:
public static void main(String[] args) throws Exception
{

BufferedReader x = new BufferedReader(new FileReader(new File("c:\\work\\1.txt")));

int len = 0;
while( x.read() != -1 )
{
len++;
}

char[] c = new char[len];
x.read(c);

System.out.println(new String(c));
}后来测了一下发现可能是while循环中已经读到了末尾一位了,下面再调用read方法就返回-1了,
但是如何解决不明,望指教。

解决方案 »

  1.   

        BufferedReader x = new BufferedReader(new FileReader(new File("c:\\work\\1.txt")));
        StringBuilder b = new StringBuilder();
        String line;
        while ((line = x.readLine()) != null) {
          b.append(line);
          b.append("\n");
        }
        String page = b.toString();已经读过了,不能再次读取了!
      

  2.   

    你的方法试过了,获取的长度为11而非10。
    另外,readline方法好像是BufferedReader的方法,Reader里面没有这个方法的。我的问题其实是这样的:
    void A(){
      BufferedReader x = new BufferedReader(new FileReader(new File("c:\\work\\1.txt"))); 
      B(x);
    }void B(Reader x){
      //此处计算x的长度并将内容存到char[]中;
    }以上,B方法中如何实现?我看了一下Reader有个reset()方法,但是需要执行操作,但是具体如何
    处理不明,望指教。
      

  3.   


    1楼说的对,你读过一次,光标已经跑到最后了!
    void B(Reader x){ 
         ((BufferedReader)x).readline();//ok了!
      

  4.   

    3楼的问题是传进来的Reader对象不一定就是BufferedReader呀,可能是Reader其它的子类吧。
    这时强制类型转换就有问题了吧。
      

  5.   

    问题就是B()方法传入的Reader对象的长度不知道,我就无法new一个char[]出来,存放Reader的内容。
    本来想先读一遍把Reader的长度算出来,然后使用的,但是不行。
      

  6.   

    x.close();
    BufferedReader没有关闭的后果,教训十分深刻!
      

  7.   


    read.(0); // xxxxxxx
    while( x.read() != -1 ) {
      len++; 
    }
    x.reset();    // xxxxxxx
    char[] c = new char[len]; 
    x.read(c);
      

  8.   


    以上代码执行后报如下的错误:
    Exception in thread "main" java.io.IOException: Mark invalid
    at java.io.BufferedReader.reset(Unknown Source)
    at test.main(test.java:26)
    不知何故?
      

  9.   


    BufferedReader 好象问题不是很严重。 就浪费点资源。
    如果是 BufferedWriter的话问题就大了。 因为你的东西根本不会
    写到你的文件你去。就好象 你在记事本里写了东西没有保存一样。
      

  10.   

    BufferedReader x = new BufferedReader(new FileReader(new File("c:\\work\\1.txt")));
        StringBuilder b = new StringBuilder();
        String line;
        while ((line = x.readLine()) != null) {
          b.append(line);
          b.append("\n");
        }
        String page = b.toString();
      

  11.   

    (0)
    然后reset()报错为何啊?
      

  12.   

    (0) 
    然后reset()报错为何啊?
      

  13.   

    (0) 
    然后reset()报错为何啊?
      

  14.   

    没有明白你这样想作什么。
    好象在得到文件的长度?是的话,直接用File.length() 不就可以了么/???
      

  15.   

    我的问题其实是这样的:  
    void A(){  
      BufferedReader x = new BufferedReader(new FileReader(new File("c:\\work\\1.txt")));   
      char[] = B(x);  
    }  char[] B(Reader x){  
      //此处计算x的长度并将内容存到char[]中返回;  
    }  以上,B方法中如何实现?  主要是char[]数组的长度无法确定。问题就是B()方法传入的Reader对象的长度不知道,我就无法new一个char[]出来,存放Reader的内容。 
    本来想先读一遍把Reader的长度算出来,然后使用的,但是不行。
      

  16.   

    这样???import java.io.*;
    public class test { public static void main(String[] args) {
    test t = new test();
    t.A();
    } public void A() {
    try
    {
    char[] arr = B(new FileReader(new File("c:/a.txt")));
    System.out.println("length:"+arr.length);
    for (char c : arr)
    {
    System.out.print(c);
    }
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } } public char[] B(Reader reader) {
    try
    {
    CharArrayWriter output = new CharArrayWriter();
    BufferedReader r = new BufferedReader(reader);
    String str = r.readLine();
    while (str != null)
    {
    str += "\r\n";
    output.write(str,0,str.length());
    str = r.readLine();
    } r.close();
    return output.toCharArray(); }
    catch (Exception e)
    {
    e.printStackTrace();
    return null;
    }

    }
      

  17.   

    改了一下:
    上面的流忘了关了。
    import java.io.*;
    public class test { public static void main(String[] args) {
    test t = new test();
    t.A();
    } public void A() {
    try
    {
    char[] arr = B(new FileReader(new File("c:/a.txt")));
    System.out.println("length:"+arr.length);
    for (char c : arr)
    {
    System.out.print(c);
    }
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } } public char[] B(Reader reader) {
    try
    {
    CharArrayWriter output = new CharArrayWriter();
    BufferedReader r = new BufferedReader(reader);
    String str = r.readLine();
    while (str != null)
    {
    str += "\r\n";
    output.write(str,0,str.length());
    str = r.readLine();
    } r.close();
    char[] arr = output.toCharArray();
    output.close();
    return arr; }
    catch (Exception e)
    {
    e.printStackTrace();
    return null;
    }

    }
      

  18.   

    public char[] B(Reader reader) {
            try
            {
                CharArrayWriter output = new CharArrayWriter();
                BufferedReader r = new BufferedReader(reader);
    以上reader若不为BufferedReader时new是否会出错呢?
      

  19.   


    你只要传进来一个Reader 就可以。
    然后包装成BufferedReader....
      

  20.   

    答:用个StringBuilder类,再加上自己的缓冲区读(如:8K左右的缓冲区),性能肯定比BufferedReader好。
    然后再转成char[]。
    以上仅供你参考