流的和并:SequenceInputStream
可以将多个InputStream
合并为一个流,方便操作,比如现在需要将1.txt、2.txt、3.txt三个文本文件合并为一个4.txt文件,如果用流一个一个操作的话就很麻烦,可以使用该流
构造方法
1.SequenceInputStream(Enumeration<? extends InputStream> e)
2.SequenceInputStream(InputStream s1, InputStream s2)
作为InputStream
的子类,这个类也具有InputStream
的方法
该类的使用
Vector v=new Vector();
v.add(new FileInputStream("F:\\SequenceDeTest\\1.txt"));
v.add(new FileInputStream("F:\\SequenceDeTest\\2.txt"));
v.add(new FileInputStream("F:\\SequenceDeTest\\3.txt"));
Enumeration<InputStream> en=v.elements();
SequenceInputStream se=new SequenceInputStream(en);
FileOutputStream mude=new FileOutputStream("F:\\SequenceDeTest\\4.txt");
BufferedInputStream bufi=new BufferedInputStream(se);
int ch;
while((ch=bufi.read())!=-1){
mude.write(ch);
}
bufi.close();
mude.close();
}
流的拆分
现在有需求:将一个文件拆分为不超过1M的小块,然后再拼合
public class splitFile {
public static void main(String[] args) throws IOException {
qiege();
hebing();
}
public static void qiege() throws IOException {
byte[] buf = new byte[1024 * 1024];
int count = 1;
int len = 0;
FileInputStream source = new FileInputStream("F:\\kuGou\\DAOKO、米津玄師 - 打上花火.mp3");
FileOutputStream mude = null;
while ((len = source.read(buf)) != -1) {
mude = new FileOutputStream("F:\\SequenceDeTest\\" + (count++) + ".part");
mude.write(buf, 0, len);
mude.close();
}
source.close();
}
public static void hebing() throws IOException {
File newsource = new File("F:\\SequenceDeTest");
ArrayList<InputStream> partlist = new ArrayList<InputStream>();
File[] parts = newsource.listFiles();
int lenOfParts = parts.length;
for (int index = 1; index <= lenOfParts; index++) {
partlist.add(new FileInputStream("F:\\SequenceDeTest\\"+index+".part"));
}
Iterator<InputStream> it = partlist.iterator();
Enumeration<InputStream> en = new Enumeration<InputStream>() {
public boolean hasMoreElements() {
return it.hasNext();
}
public InputStream nextElement() {
return it.next();
}
};
BufferedInputStream bufi = new BufferedInputStream(new SequenceInputStream(en));
BufferedOutputStream bufo=new BufferedOutputStream(new FileOutputStream("F:\\拼合而成的打上花火.mp3"));
int ch;
while ((ch = bufi.read()) != -1) {
bufo.write(ch);
}
bufi.close();
bufo.close();
}
}
其中qiege()
是切割该文件的函数,hebing()
是合并该文件的函数.
遇到的问题
- 歌曲错乱(顺序乱了)
其实是因为
listFiles
内部并没有按照资源管理器里的顺序排,需要用普通的for循环
- 时间太长(成功构建需要20s左右)
一开始只给
hebing()
中的InputStream
加了缓冲,并没有给OutputStream
加缓冲.
当加了之后就只需要0.几秒了(可见加缓冲的重要性)