int count = 0; //总共读了多少了   
int bufferSize = 1024*10; //缓存大小   
byte[] buffer = new byte[bufferSize];   
while(count<length)   
{   
    if((length-count)<bufferSize) //如果还剩字节小于缓存大小   
    {   
        buffer = new byte[length-count];   
    }   
  
    //read size 每次还不一样,新鲜   
    int readSize = is.read(buffer, 0, buffer.length);   
    //int readSize = is.read(buffer);   
    System.out.println("readSize: " + readSize + "  buffer.length: " + buffer.length);   
    os.write(buffer, 0, readSize);   
    count += readSize;   
    System.out.println("总大小: " + length + " 已经读了: " + count +" 字节");   
}   
  
思路是每次读缓存那么大小的字节,如果当最后读取的字节数小于未读字节数,那么改变缓存大小,   
但是问题在于,每次is.read(buffer, 0, buffer.length);时,buffer都不会被读满,比如buffer.length=200,   
但is.read返回的值总是小于200,反复若干次读取后,文件是传输完整的。   
  
希望大家能给个思路,我是哪弄得逻辑有问题还是什么原因? 谢谢了  

解决方案 »

  1.   

    length是不是总的字节数?第一次while循环 count肯定是小于length的  问题出来了 如果你的length-count确实是小于bufferSize的(10240),那么buffer数组的长度就会被重置,是length-count,这也就导致了buffer.length变化了
    也就是你每次读取的值不一样多了。
      

  2.   

    谢谢justinavril你的回答,你说的没错,一般如果小于1024*10大小的文件,第一次循环就要重置缓存大小,然后读完一次就OK退出了,可是这个程序会反复的读,并反复重置缓存大小,比如总长度是1000字节,
    1.把缓存从1024*10 重置成1000
    2.然后is.read()出来的数按说应该是缓存大小吧?可是这里会read出一个小于1000的数,
    3.然后会再次循环n次后,传完文件 。也不会报错~~~
      

  3.   

    我给你查了下API文档,这个read方法是读取as many as的字节数,也就是说是尽可能多地去读不超过缓存数组的字节数,而不是保证每次都读取等同于数组长度的字节数。这下解决了 呵呵
      

  4.   

    啊??不是吧...应该是读满缓存才对的呀。。之前做过的所有东西byte[] buf = new byte[1024]比如传10240字节的东东,int n = is.read(buf)n会循环10次读完,而且每次都是1024,如果总文件是10241大小,那么就会循环11次前10次n都是1024,最后一次n是1的我觉得问题可能不是这个。。
      

  5.   

    read(byte[] b)和read(byte b, int off, int end)两个方法是不一样的...
    你换成前者试试,保证每次都一样;而后者则是不定的。
      

  6.   

    如果设置buffersize的话,应该设置成length
    实际上不用设置,因为
    os.write(buffer, 0, readSize);
    只会写有数据的部分
      

  7.   

    我之前用的就是read(byte[])不行,我才换成read(byte[],0,len)的,555555555555,java api也说了,read(byte[])实际上调的就是  read(byte[],0,byte.length)
      

  8.   

    youthon,你好,
    int readSize = is.read(buffer, 0, buffer.length);   os.write(buffer, 0, readSize);如果readSize换成buffer.length一定会错的,因为现在readSize并不能读满0到buffer.length个字节数。。从没遇到过这种问题,居然不能读满。。  
      

  9.   

    贴多点代码,看看length是怎么来的.
      

  10.   

    readSize不能换成buffer.length,readsize才是数据的长度呀
    我之前一直都这样用的
    不改变buffer的大小有问题吗?
      

  11.   

    必须要改变buffer大小,否则就会多读了,一定要限制读出的字节数,因为对方给一个大的字节流,结构是这样的,字节数+内容+字节数+内容.....,所以我要根据他的字节数,来读出相应的内容,如果我不改buffer大小,那么在最后一次读的时候,会读出下一段内容的一部分,这样就错了。。
      

  12.   

    length就是取得字节流的前4位字节转成int型,来代表后面字节流内容长度
      

  13.   

    如果我没有理解错的话,他给你多少数据你就读多少数据,这样就不用重设buffer的size
    如果他给的数据比你要读的多,那你需要设置
      

  14.   

    字节数+内容 是一段字节流。。怎么打印来呀,全是byte[]
      

  15.   

    我是说对于某段的打印结果System.out.println("readSize: " + readSize + "  buffer.length: " + buffer.length);       System.out.println("总大小: " + length + " 已经读了: " + count +" 字节"); 
      

  16.   

    这是打出来的具体输出:
    Thread-5总大小: 264122 已经读了: 35502 字节
    Thread-5  改缓存大小为: 228620
    readSize: 1460  buffer.length: 228620
    Thread-5总大小: 264122 已经读了: 36962 字节
    Thread-5  改缓存大小为: 227160
    readSize: 2920  buffer.length: 227160
    Thread-5总大小: 264122 已经读了: 39882 字节
    Thread-5  改缓存大小为: 224240
    readSize: 1460  buffer.length: 224240
    Thread-5总大小: 264122 已经读了: 41342 字节
    Thread-5  改缓存大小为: 222780
    readSize: 1460  buffer.length: 222780
    Thread-5总大小: 264122 已经读了: 42802 字节
    Thread-5  改缓存大小为: 221320
    readSize: 1460  buffer.length: 221320
    Thread-5总大小: 264122 已经读了: 44262 字节
    Thread-5  改缓存大小为: 219860
    readSize: 1460  buffer.length: 219860
    Thread-5总大小: 264122 已经读了: 45722 字节
    Thread-5  改缓存大小为: 218400
    readSize: 1460  buffer.length: 218400
    Thread-5总大小: 264122 已经读了: 47182 字节
    Thread-5  改缓存大小为: 216940
    readSize: 2920  buffer.length: 216940
    Thread-5总大小: 264122 已经读了: 50102 字节
    Thread-5  改缓存大小为: 214020
    readSize: 1460  buffer.length: 214020
    Thread-5总大小: 264122 已经读了: 51562 字节
    Thread-5  改缓存大小为: 212560
    readSize: 1460  buffer.length: 212560
    Thread-5总大小: 264122 已经读了: 53022 字节
    Thread-5  改缓存大小为: 211100
    readSize: 1460  buffer.length: 211100
    Thread-5总大小: 264122 已经读了: 54482 字节
    Thread-5  改缓存大小为: 209640
    readSize: 1460  buffer.length: 209640
    Thread-5总大小: 264122 已经读了: 55942 字节
    Thread-5  改缓存大小为: 208180
    readSize: 1276  buffer.length: 208180
    Thread-5总大小: 264122 已经读了: 57218 字节
    Thread-5  改缓存大小为: 206904
    readSize: 2920  buffer.length: 206904
    Thread-5总大小: 264122 已经读了: 60138 字节
    Thread-5  改缓存大小为: 203984
    readSize: 1176  buffer.length: 203984
    Thread-5总大小: 264122 已经读了: 61314 字节
    Thread-5  改缓存大小为: 202808
    readSize: 2048  buffer.length: 202808
    Thread-5总大小: 264122 已经读了: 63362 字节
    Thread-5  改缓存大小为: 200760
    readSize: 2920  buffer.length: 200760
    Thread-5总大小: 264122 已经读了: 66282 字节
    Thread-5  改缓存大小为: 197840
    readSize: 3224  buffer.length: 197840
    Thread-5总大小: 264122 已经读了: 69506 字节
    Thread-5  改缓存大小为: 194616
    readSize: 2920  buffer.length: 194616
    Thread-5总大小: 264122 已经读了: 72426 字节
    Thread-5  改缓存大小为: 191696
    readSize: 1176  buffer.length: 191696
    Thread-5总大小: 264122 已经读了: 73602 字节
    Thread-5  改缓存大小为: 190520
    readSize: 2048  buffer.length: 190520
    Thread-5总大小: 264122 已经读了: 75650 字节
    Thread-5  改缓存大小为: 188472
    readSize: 1460  buffer.length: 188472
    Thread-5总大小: 264122 已经读了: 77110 字节
    Thread-5  改缓存大小为: 187012
    readSize: 1460  buffer.length: 187012
    Thread-5总大小: 264122 已经读了: 78570 字节
    Thread-5  改缓存大小为: 185552
    readSize: 1176  buffer.length: 185552
    Thread-5总大小: 264122 已经读了: 79746 字节
    Thread-5  改缓存大小为: 184376
    readSize: 2048  buffer.length: 184376
    Thread-5总大小: 264122 已经读了: 81794 字节
    Thread-5  改缓存大小为: 182328
    readSize: 2048  buffer.length: 182328
    Thread-5总大小: 264122 已经读了: 83842 字节
    Thread-5  改缓存大小为: 180280
    readSize: 2048  buffer.length: 180280
    Thread-5总大小: 264122 已经读了: 85890 字节
    Thread-5  改缓存大小为: 178232
    readSize: 2048  buffer.length: 178232
    Thread-5总大小: 264122 已经读了: 87938 字节
    Thread-5  改缓存大小为: 176184
    readSize: 2048  buffer.length: 176184
    Thread-5总大小: 264122 已经读了: 89986 字节
    Thread-5  改缓存大小为: 174136
    readSize: 2048  buffer.length: 174136
    Thread-5总大小: 264122 已经读了: 92034 字节
    Thread-5  改缓存大小为: 172088
    readSize: 2048  buffer.length: 172088
    Thread-5总大小: 264122 已经读了: 94082 字节
    Thread-5  改缓存大小为: 170040
    readSize: 2048  buffer.length: 170040
    Thread-5总大小: 264122 已经读了: 96130 字节
    Thread-5  改缓存大小为: 167992
    readSize: 2048  buffer.length: 167992
    Thread-5总大小: 264122 已经读了: 98178 字节
    Thread-5  改缓存大小为: 165944
    readSize: 2048  buffer.length: 165944
    Thread-5总大小: 264122 已经读了: 100226 字节
    Thread-5  改缓存大小为: 163896
    readSize: 2048  buffer.length: 163896
    Thread-5总大小: 264122 已经读了: 102274 字节
    Thread-5  改缓存大小为: 161848
    readSize: 2048  buffer.length: 161848
    Thread-5总大小: 264122 已经读了: 104322 字节
    Thread-5  改缓存大小为: 159800
    readSize: 2048  buffer.length: 159800
    Thread-5总大小: 264122 已经读了: 106370 字节
    Thread-5  改缓存大小为: 157752
    readSize: 2048  buffer.length: 157752
    Thread-5总大小: 264122 已经读了: 108418 字节
    Thread-5  改缓存大小为: 155704
    readSize: 2048  buffer.length: 155704
    Thread-5总大小: 264122 已经读了: 110466 字节
    Thread-5  改缓存大小为: 153656
    readSize: 2048  buffer.length: 153656
    Thread-5总大小: 264122 已经读了: 112514 字节
    Thread-5  改缓存大小为: 151608
    readSize: 2048  buffer.length: 151608
    Thread-5总大小: 264122 已经读了: 114562 字节
    Thread-5  改缓存大小为: 149560
    readSize: 2048  buffer.length: 149560
    Thread-5总大小: 264122 已经读了: 116610 字节
    Thread-5  改缓存大小为: 147512
    readSize: 2048  buffer.length: 147512
    Thread-5总大小: 264122 已经读了: 118658 字节
    Thread-5  改缓存大小为: 145464
    readSize: 2048  buffer.length: 145464
    Thread-5总大小: 264122 已经读了: 120706 字节
    Thread-5  改缓存大小为: 143416
    readSize: 2048  buffer.length: 143416
    Thread-5总大小: 264122 已经读了: 122754 字节
    Thread-5  改缓存大小为: 141368
    readSize: 2048  buffer.length: 141368
    Thread-5总大小: 264122 已经读了: 124802 字节
    Thread-5  改缓存大小为: 139320
    readSize: 2048  buffer.length: 139320
    Thread-5总大小: 264122 已经读了: 126850 字节
    Thread-5  改缓存大小为: 137272
    readSize: 2048  buffer.length: 137272
    Thread-5总大小: 264122 已经读了: 128898 字节
    Thread-5  改缓存大小为: 135224
    readSize: 2048  buffer.length: 135224
    Thread-5总大小: 264122 已经读了: 130946 字节
    Thread-5  改缓存大小为: 133176
    readSize: 2048  buffer.length: 133176
    Thread-5总大小: 264122 已经读了: 132994 字节
    Thread-5  改缓存大小为: 131128
    readSize: 2048  buffer.length: 131128
    Thread-5总大小: 264122 已经读了: 135042 字节
    Thread-5  改缓存大小为: 129080
    readSize: 2048  buffer.length: 129080
    Thread-5总大小: 264122 已经读了: 137090 字节
    Thread-5  改缓存大小为: 127032
    readSize: 2048  buffer.length: 127032
    Thread-5总大小: 264122 已经读了: 139138 字节
    Thread-5  改缓存大小为: 124984
    readSize: 2048  buffer.length: 124984
    Thread-5总大小: 264122 已经读了: 141186 字节
    Thread-5  改缓存大小为: 122936
    readSize: 2048  buffer.length: 122936
    Thread-5总大小: 264122 已经读了: 143234 字节
    Thread-5  改缓存大小为: 120888
    readSize: 2048  buffer.length: 120888
    Thread-5总大小: 264122 已经读了: 145282 字节
    Thread-5  改缓存大小为: 118840
    readSize: 2048  buffer.length: 118840
    Thread-5总大小: 264122 已经读了: 147330 字节
    Thread-5  改缓存大小为: 116792
    readSize: 2048  buffer.length: 116792
    Thread-5总大小: 264122 已经读了: 149378 字节
    Thread-5  改缓存大小为: 114744
    readSize: 2048  buffer.length: 114744
    Thread-5总大小: 264122 已经读了: 151426 字节
    Thread-5  改缓存大小为: 112696
    readSize: 2048  buffer.length: 112696
      

  17.   

    Thread-5总大小: 264122 已经读了: 153474 字节
    Thread-5  改缓存大小为: 110648
    readSize: 2048  buffer.length: 110648
    Thread-5总大小: 264122 已经读了: 155522 字节
    Thread-5  改缓存大小为: 108600
    readSize: 2048  buffer.length: 108600
    Thread-5总大小: 264122 已经读了: 157570 字节
    Thread-5  改缓存大小为: 106552
    readSize: 4096  buffer.length: 106552
    Thread-5总大小: 264122 已经读了: 161666 字节
    Thread-5  改缓存大小为: 102456
    readSize: 2048  buffer.length: 102456
    Thread-5总大小: 264122 已经读了: 163714 字节
    Thread-5  改缓存大小为: 100408
    readSize: 2048  buffer.length: 100408
    Thread-5总大小: 264122 已经读了: 165762 字节
    Thread-5  改缓存大小为: 98360
    readSize: 2048  buffer.length: 98360
    Thread-5总大小: 264122 已经读了: 167810 字节
    Thread-5  改缓存大小为: 96312
    readSize: 2048  buffer.length: 96312
    Thread-5总大小: 264122 已经读了: 169858 字节
    Thread-5  改缓存大小为: 94264
    readSize: 2048  buffer.length: 94264
    Thread-5总大小: 264122 已经读了: 171906 字节
    Thread-5  改缓存大小为: 92216
    readSize: 2048  buffer.length: 92216
    Thread-5总大小: 264122 已经读了: 173954 字节
    Thread-5  改缓存大小为: 90168
    readSize: 2048  buffer.length: 90168
    Thread-5总大小: 264122 已经读了: 176002 字节
    Thread-5  改缓存大小为: 88120
    readSize: 2048  buffer.length: 88120
    Thread-5总大小: 264122 已经读了: 178050 字节
    Thread-5  改缓存大小为: 86072
    readSize: 2048  buffer.length: 86072
    Thread-5总大小: 264122 已经读了: 180098 字节
    Thread-5  改缓存大小为: 84024
    readSize: 2048  buffer.length: 84024
    Thread-5总大小: 264122 已经读了: 182146 字节
    Thread-5  改缓存大小为: 81976
    readSize: 2048  buffer.length: 81976
    Thread-5总大小: 264122 已经读了: 184194 字节
    Thread-5  改缓存大小为: 79928
    readSize: 2048  buffer.length: 79928
    Thread-5总大小: 264122 已经读了: 186242 字节
    Thread-5  改缓存大小为: 77880
    readSize: 2048  buffer.length: 77880
    Thread-5总大小: 264122 已经读了: 188290 字节
    Thread-5  改缓存大小为: 75832
    readSize: 2048  buffer.length: 75832
    Thread-5总大小: 264122 已经读了: 190338 字节
    Thread-5  改缓存大小为: 73784
    readSize: 2048  buffer.length: 73784
    Thread-5总大小: 264122 已经读了: 192386 字节
    Thread-5  改缓存大小为: 71736
    readSize: 2048  buffer.length: 71736
    Thread-5总大小: 264122 已经读了: 194434 字节
    Thread-5  改缓存大小为: 69688
    readSize: 2048  buffer.length: 69688
    Thread-5总大小: 264122 已经读了: 196482 字节
    Thread-5  改缓存大小为: 67640
    readSize: 2048  buffer.length: 67640
    Thread-5总大小: 264122 已经读了: 198530 字节
    Thread-5  改缓存大小为: 65592
    readSize: 2048  buffer.length: 65592
    Thread-5总大小: 264122 已经读了: 200578 字节
    Thread-5  改缓存大小为: 63544
    readSize: 8192  buffer.length: 63544
    Thread-5总大小: 264122 已经读了: 208770 字节
    Thread-5  改缓存大小为: 55352
    readSize: 2048  buffer.length: 55352
    Thread-5总大小: 264122 已经读了: 210818 字节
    Thread-5  改缓存大小为: 53304
    readSize: 2048  buffer.length: 53304
    Thread-5总大小: 264122 已经读了: 212866 字节
    Thread-5  改缓存大小为: 51256
    readSize: 2048  buffer.length: 51256
    Thread-5总大小: 264122 已经读了: 214914 字节
    Thread-5  改缓存大小为: 49208
    readSize: 2048  buffer.length: 49208
    Thread-5总大小: 264122 已经读了: 216962 字节
    Thread-5  改缓存大小为: 47160
    readSize: 2048  buffer.length: 47160
    Thread-5总大小: 264122 已经读了: 219010 字节
    Thread-5  改缓存大小为: 45112
    readSize: 2048  buffer.length: 45112
    Thread-5总大小: 264122 已经读了: 221058 字节
    Thread-5  改缓存大小为: 43064
    readSize: 2048  buffer.length: 43064
    Thread-5总大小: 264122 已经读了: 223106 字节
    Thread-5  改缓存大小为: 41016
    readSize: 2048  buffer.length: 41016
    Thread-5总大小: 264122 已经读了: 225154 字节
    Thread-5  改缓存大小为: 38968
    readSize: 2048  buffer.length: 38968
    Thread-5总大小: 264122 已经读了: 227202 字节
    Thread-5  改缓存大小为: 36920
    readSize: 2048  buffer.length: 36920
    Thread-5总大小: 264122 已经读了: 229250 字节
    Thread-5  改缓存大小为: 34872
    readSize: 2048  buffer.length: 34872
    Thread-5总大小: 264122 已经读了: 231298 字节
    Thread-5  改缓存大小为: 32824
    readSize: 2048  buffer.length: 32824
    Thread-5总大小: 264122 已经读了: 233346 字节
    Thread-5  改缓存大小为: 30776
    readSize: 2048  buffer.length: 30776
    Thread-5总大小: 264122 已经读了: 235394 字节
    Thread-5  改缓存大小为: 28728
    readSize: 2048  buffer.length: 28728
    Thread-5总大小: 264122 已经读了: 237442 字节
    Thread-5  改缓存大小为: 26680
    readSize: 2048  buffer.length: 26680
    Thread-5总大小: 264122 已经读了: 239490 字节
    Thread-5  改缓存大小为: 24632
    readSize: 2048  buffer.length: 24632
    Thread-5总大小: 264122 已经读了: 241538 字节
    Thread-5  改缓存大小为: 22584
    readSize: 2048  buffer.length: 22584
    Thread-5总大小: 264122 已经读了: 243586 字节
    Thread-5  改缓存大小为: 20536
    readSize: 2048  buffer.length: 20536
    Thread-5总大小: 264122 已经读了: 245634 字节
    Thread-5  改缓存大小为: 18488
    readSize: 2048  buffer.length: 18488
    Thread-5总大小: 264122 已经读了: 247682 字节
    Thread-5  改缓存大小为: 16440
    readSize: 2048  buffer.length: 16440
    Thread-5总大小: 264122 已经读了: 249730 字节
    Thread-5  改缓存大小为: 14392
    readSize: 2048  buffer.length: 14392
    Thread-5总大小: 264122 已经读了: 251778 字节
    Thread-5  改缓存大小为: 12344
    readSize: 2048  buffer.length: 12344
    Thread-5总大小: 264122 已经读了: 253826 字节
    Thread-5  改缓存大小为: 10296
    readSize: 2048  buffer.length: 10296
    Thread-5总大小: 264122 已经读了: 255874 字节
    Thread-5  改缓存大小为: 8248
    readSize: 2048  buffer.length: 8248
    Thread-5总大小: 264122 已经读了: 257922 字节
    Thread-5  改缓存大小为: 6200
    readSize: 2048  buffer.length: 6200
    Thread-5总大小: 264122 已经读了: 259970 字节
    Thread-5  改缓存大小为: 4152
    readSize: 2048  buffer.length: 4152
    Thread-5总大小: 264122 已经读了: 262018 字节
    Thread-5  改缓存大小为: 2104
    readSize: 2048  buffer.length: 2104
    Thread-5总大小: 264122 已经读了: 264066 字节
    Thread-5  改缓存大小为: 56
    readSize: 56  buffer.length: 56
    Thread-5总大小: 264122 已经读了: 264122 字节
      

  18.   

    还有就是你怎么取的length? read()4次还是用DataInputStream.readInt()?
      

  19.   

    youthon  正是这样,他给的要比我读的多,他给一大串,我要分N段来读这一大串
      

  20.   

    总的length长度肯定没问题。。现在就是他总会重置缓存大小,这个现象很奇怪。按说我重置后的缓存足以让他一次把内容read进这个缓存数组,可它每次只去read出一部分,
      

  21.   

    Thread-5总大小: 264122 已经读了: 35502 字节
    Thread-5  改缓存大小为: 228620 这个好奇怪,都还未小于1024*10就改了,这个应该不是你贴的代码产生的吧.还有就是,你这个是什么流? 是否已经生成好的文件来的? 如果不是,那么每次read只能根据available多少来读,因为可能你对方的流还没来得及过来(虽然还有很多字节).
      

  22.   

    lxxzhy  对,我实际缓存是1024*500 您说的这句很精辟!你这个是什么流? 是否已经生成好的文件来的? 如果不是,那么每次read只能根据available多少来读,因为可能你对方的流还没来得及过来(虽然还有很多字节).
    也许正是这个原因吧,多谢了!!!!!!!!!!!!!分给您10分吧,我分不多,我要分上面兄弟10分
      

  23.   

    我发现和你沟通好困难,你总是误解我的话
    看来只有拿实例来说明public static void main( String[] args )
    {
    try
    {
    FileInputStream fis = new FileInputStream( "G:\\test.txt" );
    FileOutputStream fos = new FileOutputStream( "G:\\result.txt" );
    byte[] buffer = new byte[1024];

    //其实就这么简单
    int count;
    while( (count = fis.read( buffer )) != -1 )
    {
    fos.write( buffer, 0, count );
    }

    fos.close();
    fis.close();
    }
    catch( FileNotFoundException e )
    {
    e.printStackTrace();
    }
    catch( IOException e )
    {
    e.printStackTrace();
    }

    }代码我运行过了,没有问题
      

  24.   

    lxxzhy我证明了一下,你是对的,确实是流没有写完,谢谢!看来我得去再补补IO基础了,谢谢!
      

  25.   

    没必要每次改变缓存大小;
                    while (count < length
    && (readSize = in.read(buffer, 0, length - count)) != -1)
    {

                            os.write(buffer, 0, readSize);   
    lenCount += len;

    }
      

  26.   


    lenCount += len; 改为  count  += readSize ;