while( in2.available()!=-1)//这换成-1试试
                out2.writeByte(in2.readByte());

解决方案 »

  1.   

    我试过这样的情况 JAVA的这个available函数好像有点问题
    你最好用一个变量先取出它的值 再来做WHILE 不用次次都调用
      

  2.   

    如果你分配读取的byte数组足够大,这个问题就应该不存在了.
    但是建议采用Reader/Writer类组完成文件读写操作
      

  3.   

    对于像jpg这类格式的文件也可用Reader/Writer类来进行读写吗?
      

  4.   

    为改成如下的方式就正常了:
                byte[] b = new byte[2048];
                int readLen = 0;
                
                while( (readLen=in2.read(b,0,b.length))!=-1)
                    out2.write(b,0,readLen);
    这是为什么呢?为怎么知道该byte数组应该分配多大呢?
      

  5.   

    sorry没有看清题目,reader和writer是用来读取文本文件的,数据文件的读取long len = sourceFile.length();
    byte[] b;
    if(len > Integer.MAX_VALUE){
    throw new Exception("File is too large!");
    }else{
    b = new byte[(int)len];
    }
    int bytes = 0;
    int offset = 0;
    try {
    FileInputStream fis = new FileInputStream(sourceFile);
    FileOutputStream fos = new FileOutputStream(targetFile);
    while(offset < b.length && (bytes = fis.read(b,offset,b.length-offset)) >= 0){
    offset += bytes;
    }
    fos.write(encoder.encode(b));
    fos.close();
    fis.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }应该声明一个长度和源文件等长的byte数组,但是file对象得到的length是long类型,声明数组的维度只能是整型,也就是说源文件的体积被限制在Integer的最大值,大概是4g多。这样,得到file的长度之后,就可以根据这个长度创建数组了。
      

  6.   

    怎么知道该byte数组应该分配多大呢?
      

  7.   

    to:javafaq2004(农村干部瞎忙活)
    long len = sourceFile.length();
    通过得到源文件的长度就可以知道分配多大的数组了
      

  8.   

    byte[] b = new byte[2048];
    int startPosition = 0;
    int readLen = 0;
    int fileLen = sourceFile.length();
    while(startPostion < fileLen)            
       while( (readLen=in2.read(b,0,b.length))!=-1)
          {          
             out2.write(b,0,readLen);
             startPostion += readLen;
          }
       ........   byte数组大,缓存就大,byte数组小缓存就小,你把它设成大小1,也没有问题,就是计算机忙了些,呵呵