一. 合并流 SequenceInputStream
Java可以将 两个文件,或者多个文件 合并到一个文件。 注意,如果是两个文件进行合并,合并后的文件是三个, 如A +B 合并, 那么会合并到 C, 共有 A,B,C 三个文件。
那么,你说如何将 A文件合并到B文件,而不产生C 文件呢。 这个与文件复制差不多, 需要让目的地文件即B 存在,并且有数据, 在实例化FileOutputStream时,用追加, append=true 的方式进行读取就可以了, 就可以将A 文件合并到B 文件里面了。
这儿 SequenceInputStream 讨论的是 产生 最后的结果文件 C 文件。
一.一 方法
一.一.一 构造方法
一.一.一.一 方法
一.一.一.二 演示
@Test public void conTest() throws Exception{ //1. 定义两个输入流 File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"out.txt"); InputStream in1=new FileInputStream(file1); File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"err.txt"); InputStream in2=new FileInputStream(file2); //第一种方式 SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2); //第二种,传入多个合并源 Vector<InputStream> vector=new Vector<>(); vector.add(in1); vector.add(in2); //变成集合 Enumeration<InputStream> inputStreamEnum=vector.elements(); //传入集合 SequenceInputStream sequenceInputStream1=new SequenceInputStream(inputStreamEnum); }
一.一.二 普通读取方法
一.二 演示合并流 SequenceInputStream
合并源一: out.txt 文件内容
合并源二: err.txt 文件内容
@Test public void seqTest() throws Exception{ //1. 定义两个输入流 File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"out.txt"); InputStream in1=new FileInputStream(file1); File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"err.txt"); InputStream in2=new FileInputStream(file2); //合并流 SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2); //结果文件 File file3=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"hebing.txt"); OutputStream outputStream=new FileOutputStream(file3); byte[] bytes=new byte[1024]; int len=-1; while((len=sequenceInputStream.read(bytes))!=-1){ outputStream.write(bytes,0,len); } outputStream.close(); sequenceInputStream.close(); in1.close(); in2.close(); }
运行程序, 查看 hebing.txt 文件内容
二. 回退流 PushbackInputStream
以前读取文件 inputStream.read(), 或者 inputStream.read(b) 时,只能往前读,不能往后退,读过去就过去了。 然而,有时候,可能误读之类的,需要回退。 那么就用到 回退流 PushbackInputStream 了。
二.一 方法
二.一.一 构造方法
二.一.一.一 方法
二.一.一.二 演示
@Test public void conTest() throws Exception{ //读内存,不读文件了 InputStream inputStream=new ByteArrayInputStream("你好啊".getBytes("UTF-8")); PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream); }
二.一.二 读和回退方法
二.二 演示回退流 PushbackInputStream
@Test public void pushTest() throws Exception{ String str="Hello,EveryOne,My Name is,TwoBu,tterfly"; InputStream inputStream=new ByteArrayInputStream(str.getBytes("UTF-8")); //构建回退流 PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream,8); int len=-1; System.out.println("输出内容:"); while((len=pushbackInputStream.read())!=-1){ //有值 char c=(char)len; if(c==','){ //为 ,号时 ,先往前读3个,再往后倒两个 byte[] b1=new byte[3]; pushbackInputStream.read(b1); //往后倒两个 pushbackInputStream.unread(b1,0,2); }else{ System.out.print(c); } } }
运行程序,控制台打印输出:
回退分析:
Hello,EveryOne,My Name is,TwoBu,tterfly
第一个, 号时, 往前读取三个,读了 Eve, 又往后回退两个, 回退 Ev, 即将 Ev 重新放置到缓冲区去, 而e 没有放置,e丢失了。
第二个, 号时, My空格 读取这三个, My回退到缓冲区,空格丢失。
第三个,号时,Two 读取这三个, Tw回退到缓冲区,o丢失.
第四个,号时 tte读取这三个, tt回退到缓冲区, e失去。
所以最后结果是: HelloEvryOneMyName isTwButtrfly
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!