打印流
PrintWriter与PrintStream
可以直接操作输入流和文件
序列流
SequenceInputStream
对多个流进行合并
操作对象
ObjectInputStream与ObjectOutputStream
被操作的对象需要实现Serializable(标记接口)
字节打印流
PrintStream
构造函数可以接收的参数类型;
1、File对象,File;
2、字符串路径:String;
3、字节输出流:OutputStream
字符打印流:
PrintWriter:
构造函数可以接收的参数类型;
1、File对象:File;
2、字符串路径:String;
3、字节输出流:OutputStream;
4、字符输出流:Writer;
package com.javaxl.io.other;
import java.io.*;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-15 8:31
*/
public class PrintStreamDemo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter("C:\\PrintWriterDemo.txt"),true);
String line = null;
while ((line = br.readLine())!=null){
if("over".equals(line)){
break;
}
pw.println(line.toUpperCase());
// pw.flush(); true代表自动刷新
}
br.close();
pw.close();
}
}
应用:多章小说合并成一本小说
package com.javaxl.io.other;
import java.io.*;
import java.util.Vector;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-15 8:53
*/
public class SequenceDemo {
public static void main(String[] args) throws IOException {
Vector<FileInputStream> v = new Vector<>();
v.add(new FileInputStream("C:\\charset.txt"));
v.add(new FileInputStream("C:\\fos.txt"));
v.add(new FileInputStream("C:\\PrintWriterDemo.txt"));
SequenceInputStream sis = new SequenceInputStream(v.elements());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\sequence.txt"));
byte[] bbuf = new byte[1024];
int len = 0;
while ((len = sis.read(bbuf))!=-1){
bos.write(bbuf,0,len);
}
bos.close();
sis.close();
}
}
Vector的遍历在IO流中的应用
当服务器限制上传文件的大小,可以将其切割上传
将切割的文件合并
package com.javaxl.io.other;
import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-15 9:29
*/
public class SplitDemo {
public static void main(String[] args) throws IOException {
// split();
merge();
}
public static void split() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\6.jpg"));
FileOutputStream out = null;
byte[] bbuf = new byte[1024*10];
int len = 0;
int count = 1;
while ((len = bis.read(bbuf))!=-1){
out = new FileOutputStream("C:\\partFiles\\"+(count++)+".part");
out.write(bbuf,0,len);
out.close();
}
bis.close();
}
public static void merge() throws IOException {
List<FileInputStream> al = new ArrayList<>();
File dir = new File("C:\\partFiles");
for (File file : dir.listFiles()) {
al.add(new FileInputStream(file));
}
Iterator<FileInputStream> it = al.iterator();
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("C:\\partFiles\\together.jpg");
byte[] bbuf = new byte[1024];
int len = 0;
while ((len = sis.read(bbuf))!=-1){
fos.write(bbuf,0,len);
}
fos.close();
}
}
因为使用vector对象性能较低,所以采用ArrayList来存放需要合并的碎片文件,但是创建序列流需要用到枚举接口,所以用匿名内部类来完成枚举的创建,而匿名内部类所使用的变量需要被final所修饰。
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有