解决方案 »

  1.   

    ((n=b.read(bytes))!=-1 是检查你上面FileInputString 是否读完了,如果读到文件最后没有数据了就是 -1
      

  2.   

    b.read(bytes),是指最多读入bytes.length个byte(这里是1024)。
    你现在的inputStream只有那么几个字符,远小于1024,所以读一定就能读完,不需要while循环,
    但如果inputStream里有超过1024个byte的内容,那就要用while才能读完。
      

  3.   


    比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
    这样说总能明白了吧
      

  4.   


    比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
    这样说总能明白了吧抱歉现在才记起来这个了    
    哦  懂了    那怎么获取所有的文件里面的内容  对其进行统计筛选。
    按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
      

  5.   


    比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
    这样说总能明白了吧抱歉现在才记起来这个了    
    哦  懂了    那怎么获取所有的文件里面的内容  对其进行统计筛选。
    按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
    定义一个对象,把每次读到的byte[]都存起来就行了
    StringBuilder sb = new StringBuild();
    byte[] buf = new byte[1024];
    int readCount=0;
    while((readCount=b.read(buf))>0){
         sb.append(new String(buf,0,readCount));
    }//sb这个对象就是流里所有内容了
    System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦
      

  6.   


    比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
    这样说总能明白了吧抱歉现在才记起来这个了    
    哦  懂了    那怎么获取所有的文件里面的内容  对其进行统计筛选。
    按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
    定义一个对象,把每次读到的byte[]都存起来就行了
    StringBuilder sb = new StringBuild();
    byte[] buf = new byte[1024];
    int readCount=0;
    while((readCount=b.read(buf))>0){
         sb.append(new String(buf,0,readCount));
    }//sb这个对象就是流里所有内容了
    System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦哦   谢谢   第一次提问,下次会注意的。
    但是还有一个问题不懂,像read()方法上说读取到结尾就返回-1,但是只要Bytes数组够用的话不是每次都能读到结尾吗?这样不是每次while语句中的代码都么运行,而且调试的时候while中的语句就是没有执行的,结果与直接运行的不一样啊。
    实在是麻烦了    有太多不懂得了 
      

  7.   

    单纯的read()方法,是每次读一个byte,假如你有一串”abc“(这里用字符串表示,实际上是byte类型的)要读,调用一次read()方法就会读一个,所以“abc"你会读三个,读到第四个没有时当作结尾了,就返回-1;有一些输入流的read(byte[] buf)方法实际上就是调用read()方法来循环读取的,下面写了个伪read(byte[] buf)方法(当然与真正的方法有差别,只是让你了解思想),你认真理解下吧
    public int read(byte[] buf) throws Exception {
    // 假设这个是要读的流
    FileInputStream fis = null; int pos = 0;
    // 读到的字节总数
    int count = 0;
    while (pos < buf.length) {
    int readInt = fis.read(); //读到结果
    if (readInt == -1) {
    if (count > 0) {
    return count;
    }
    return -1;
    } buf[pos++] = (byte) readInt;
    count++;
    } return count;
    }
      

  8.   

    public int read(byte[] buf) throws Exception {
    // 假设这个是要读的流
    FileInputStream fis = null; int pos = 0;
    // 读到的字节总数
    int count = 0;
    while (pos < buf.length) {
    int readInt = fis.read(); //读到结果
    if (readInt == -1) {
    if (count > 0) {
    //情况一:内容读完后返回count
    return count;
    }
    //情况二:文件内没有内容时返回-1
    return -1;
    } buf[pos++] = (byte) readInt;
    count++;
    }
    //情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length
    return count;
    }}是这样理解的吗?那不是有问题吗 ?一般情况都是情况一   但是情况一不是已经读到了结尾了吗?按照真正的read(bytes[])不是应该返回-1的吗?如果返回-1的话,我上次的那个问题还是弄不清楚啊?      
      

  9.   


    把while语句写直白点,这时候再读程序
    StringBuilder sb = new StringBuild();
    byte[] buf = new byte[1024];
    int readCount=0;
    while(true){
         readCount=b.read(buf));
         if(readCount == -1){
             break;
         }
         sb.append(new String(buf,0,readCount));
    }//sb这个对象就是流里所有内容了
    System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。
      

  10.   

    用while来循环读取是一种保险的做法。若文件字节数在buffer之内,则一般会一次就可以将文件内容全读到buffer中,若文件字节数超过buffer,则就需要循环来读取了,直到不能从文件中读到字节为止,也就是将文件的内容全部读完了
      

  11.   


    把while语句写直白点,这时候再读程序
    StringBuilder sb = new StringBuild();
    byte[] buf = new byte[1024];
    int readCount=0;
    while(true){
         readCount=b.read(buf));
         if(readCount == -1){
             break;
         }
         sb.append(new String(buf,0,readCount));
    }//sb这个对象就是流里所有内容了
    System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。如果是这样的话那可以理解了,但是还有两个问题
    1.我进行调试的时候,第一次while循环readcount的值就是-1;(我想弄清楚为什么调试时得到的与实际运行的不一样)
    2.如果第一次while循环readcount的值是10,那为什么第二次while循环时readcount的值是-1.
    真是太感谢你耐心的讲解了,学到了很多。就是自己总在郁闷read()返回值的问题,
      

  12.   

    个人觉得这和C语言当中的fread(....)相似,和while(i<n)性质是一样的,只是read一次之后,会自然而然的跳到下一个字节(下一个地址),这是我们看不到这个地址而已
      

  13.   

    嗯  就是这样的  read一次后就返回-1了
      

  14.   

    public int read(byte[] buf) throws Exception {
    // 假设这个是要读的流
    FileInputStream fis = null; int pos = 0;
    // 读到的字节总数
    int count = 0;
    while (pos < buf.length) {
    //当第二次while循环的时候,调用此方法时,因为fis.read()已经是都到末尾了就是-1了,所以count=0就返回-1了。
    int readInt = fis.read(); //读到结果
    if (readInt == -1) {
    if (count > 0) {
    //情况一:内容读完后返回count
    return count;
    }
    //情况二:文件内没有内容时返回-1
    return -1;
    } buf[pos++] = (byte) readInt;
    count++;
    }
    //情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length
    return count;
    }}
    这次终于理解了,我发现用eclipse的debug调试貌似是有问题的每次的出来的都是-1,用system.out.println()进行调试时第一次的结果不是-1.
    另外第二个问题也理解了,第二次while循环的时候,count=0;所以返回的是-1。这样理解的应该是对的了吧!
    谢谢!!!