read()返回值为-1表示是读到文件的最后了,但当我用该方法读取字节数据时候碰到没有读完文件就结束的问题。怎么样解决用read逐字节读取非文本的问题。File   f=new   File( "这里如果是非文本,文件有错误,文本文件没有问题 "); 
FileInputStream   fin=new   FileInputStream(f); 
while(true) 

      
              byte   b=(byte)(fin.read()); 
              System.out.println   (b); 
              if(b==-1) 
              { 
              break; 
              } 
              System.out.println(b); 
              } 

解决方案 »

  1.   

    你这种方法遍历字节流文件本身就是不安全的做法,因为字节流文件内容里面很有可能有-1的int值,这样在读文件到一半的时候就会截断,以下的程序可以证明import java.io.FileInputStream;
    import java.io.File;public class FileReader {
        public static void main(String[] args)throws Exception{
            File f=new File("resources/pdf/pdf1.pdf");//这里可以改为pdf rar exe等文件
            long fileLength=f.length();
            FileInputStream fin=new FileInputStream(f);
            long i=0;
            while(i<fileLength)
            {
                i++;
                int b=fin.read();
                
                System.out.println (i);
                if(b==-1)
                {
                    System.out.println("------读取到-1标志------");
        //                break;
                }            System.out.println(b);
            }
            System.out.println("文件字节数是"+fileLength+",i值是"+i);
        }
    }在文本文件的字符编码都不会有-1所以-1只可能在文件流的末尾
    如果你要对字节流文件就不要这么一个一个字节做了,还是读取字节流文件的length,用length控制靠谱
      

  2.   

    用read(byte[] b)或者read(byte[],int off,int len);用这两个方法咯!
        这两个方法,在文件里没有数据了,才会返回负一,你那个方法,是每次返回一个字节!
     这两个read重载方法,低层也是调用read()方法;
      

  3.   

    你将read返回的int值截断为byte了,这是提前读出-1的原因。

    int b = fin.read();
    试试看。
      

  4.   

    用read(byte[] b)或者read(byte[],int off,int len);用这两个方法咯!
      这两个方法,在文件里没有数据了,才会返回负一,你那个方法,是每次返回一个字节!
     这两个read重载方法,低层也是调用read()方法;
      

  5.   

    貌似不是byte截断的原因,你试一下3楼的代码,中间照样会有-1
      

  6.   

      byte b=(byte)(fin.read());  
      System.out.println (b);  这样b当然为-1,但是fin不结束。因为实际上fin.read()返回的是255
      

  7.   

    int b = (int)fin.read();这样试试看。
      

  8.   

    fin.read()返回的就是一个int为啥还要转化为byte呢?
      

  9.   

    囧,上面我说的不对,因为实验做的不够多,之前做过一次凑巧我试的那个文件正好是我某次作业自己用-1做过标记的,事实上正常字节流的编码是不会出现-1的,只有在结尾才有。我多找了几个文件试下是不会碰到的。楼主的代码出现-1正是大侠所说的byte截断的原因,int数据大于byte会出现负值包括有-1,所以楼主的程序中途会退出,J2SE的基础还是不够,大家见笑。
      

  10.   

    其实也就是说,楼主的byte截断对字符流和字节流都可能造成无法正常读完文件就退出循环,read出来的int值如果包含有 255 511 767 1023等这样的值,楼主可以用下面的程序看看10000以内的int被转换为byte哪些数值被截断变成了-1
     for(int i=0;i<Math.pow(10,4);i++){
                  if((byte)i==-1){
                      System.out.println(i);
                  }
            }
      

  11.   

    我觉得吧!你应该是没有开辟一个字节空间byte[] byte = new byte[1024] 这样就是把你写的文本文件读到这个空见、