本帖最后由 magi1201 于 2014-07-26 11:34:28 编辑

解决方案 »

  1.   

    while ((out = fis.read(outByte)) != -1) {
        dos.write(out);
    }
    两颗星大神在卖萌吗。。
    数据在outByte里,你把out写进文件。。
      

  2.   


    额 这个没有问题吧,outByte 是个字节数组,只是告诉fis,每次读取这么多字节出来
    读出来后,然后将字节给out,将out写出。
    这个有问题吗  对流部分不熟悉,就来问问,不要鄙视啊
      

  3.   


    额 这个没有问题吧,outByte 是个字节数组,只是告诉fis,每次读取这么多字节出来
    读出来后,然后将字节给out,将out写出。
    这个有问题吗  对流部分不熟悉,就来问问,不要鄙视啊
    我只是一个星期没碰Java了而已,不至于这个都记错了吧。。
    我清楚地记得InputStream的这个方法
    int read(byte[] buf)
    是最多读入buf.length字节,存储在buf里,返回一个int,表示实际读了多少字节。
    你这样只是把每次读了多少字节写进了文件啊,你可以用WinHex等工具看看文件内容,肯定是一堆100如果你byte[100],或者是一堆10如果你byte[10]。
      

  4.   


    额 这个没有问题吧,outByte 是个字节数组,只是告诉fis,每次读取这么多字节出来
    读出来后,然后将字节给out,将out写出。
    这个有问题吗  对流部分不熟悉,就来问问,不要鄙视啊
    反过来说你这样的功能也不可能实现啊,out是一个int,怎么可能存储多个字节,最多就4个字节,而outByte是一个字节数组,如果你只是要告诉read需要读多少字节,直接传int类型不就好了,不至于浪费一个字节数组,就是为了告诉read需要多少字节吧?
      

  5.   

    为什么读取流的把文件读进数组,而写入流把int out写进输出流,不是应该把 outByte数组写进去么?
    难道我看错了么?
      

  6.   

    这是个复杂的问题
    这和硬件配置 操作系统 文件系统 流的类型 实现方式等等都有很大关系通常一般的做法是,用一个BufferdStream(比如BufferedInputStream BufferedOutputStream),来包装你的底层Stream,然后用一个大小为2的幂的缓冲数组来操作这个BufferedStream,这个大小不要超过BufferedStream的默认缓冲大小,一般设为1024或2048比较合适。如果你觉得中间夹一层BufferedStream有损效率(实际这点效率损失几乎可以忽略,除非你说的是千万用户级别超大型密集运算),那不通过BufferedStream也可以,但你这个缓冲的大小就需要自己尝试哪个好,通常这个大小也是2的幂,并且在一定范围内越大越好(一般这个范围指不超过16K),另外注意如果是操作文件,一定要使用Block大小的倍数,最常见的Block大小是4K,不过不能保证其他文件系统的Block大小也是4K,但综合考虑4K 8K都是很好的缓冲大小,只要你不是4097这种刚好比4K多1的奇葩缓冲大小性能就基本差不多。或者其他的方法比如NIO的channel能够使用direct memory也就是不经过Java堆的内存或许可以提高一点效率。附上一个别人做的实验,比较有参考性,How big should my input stream buffer be?
      

  7.   


    总结一下,是自己基础太差了
    没用心读api,导致今天的这个问题
    补基础去了