A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ___瘦不了 中级黑马   /  2014-10-8 20:33  /  1113 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package practise;

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;

public class SequenceInputStreamDemo {
        public static void main(String args[]) throws IOException{
                FileInputStream fis1 = new FileInputStream("c:\\a.txt");
                FileInputStream fis2 = new FileInputStream("c:\\list.txt");
                FileInputStream fis3 = new FileInputStream("c:\\b.txt");
                Vector<FileInputStream> v = new Vector<FileInputStream>();
                v.add(fis1);
                v.add(fis2);
                v.add(fis3);
                Enumeration<FileInputStream> en = v.elements();
                SequenceInputStream sis = new SequenceInputStream(en);
                FileOutputStream fos = new FileOutputStream("c:\\4.txt");
                byte[] buf = new byte[1024];
                int len = 0;
                while((len=sis.read(buf))!=-1){
                        fos.write(buf);          //fos.write(buf,0,len);这两种写法难道有什么区别么?求大神详解
                        fos.flush();
                }
                sis.close();
                fos.close();
        }

}
上面是序列流毕姥爷视频上的一个练习,带注释的部分两种写法有什么区别呢?为什么会导致最后的结果不同呢?后一种写法是正常的,前一种写法出来之后我发现4.txt里面b文本里面的内容竟然穿插到list的内容里去了,按道理来说程序会以b文本返回的-1作为结束符啊,然而再穿插之后list内容竟然在b内容后面继续输出完了,这不科学啊!!我说的有点乱,望大解答,谢谢

1 个回复

倒序浏览
此处楼主要注意一点,就是fos.write(buf)是把数组中的全部元素写出去,fos.write(buf,0,len)则是写出角标从0到len的数组元素(包含buf[0],不包含buf[len]).


针对楼主的代码对错误的情况进行分析,假设a.txt文件中的最后一次读取的字节长度为a, list.txt文件中的字节总长度为s, 且a>s, 那么数组在最后一次读取a.txt时,buf[0]到buf[a]之间的元素全部为a.txt中的元素,写出后不会影响字节数组中元素的值,当写出后读入list.txt文件中的字节,但是由于list文件中的字节数s小于a,因此只会覆盖buf[0]-buf[s]之间的值,那么buf[s]到buf[a]之间的值还是a.txt中相应的值,因此使用fos.write(buf)写入全部数组元素时,buf[s]到buf[a]之间的元素也会写出,造成合并的文件中list.txt中的内容输出后还会有a.txt中的内容。


第二种方式即fos.write(buf,0,len)之所以正确,是因为每次输出的时候只会输出当次读入到字节数组中的元素,因此即便没有覆盖,也不会输出那部分内容。
楼主的代码如果用前一种情况的话合并的文件的实际大小会大于三个文件大小的总和,因为输出了一些多余的内容。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马