一.打印流
打印流永远不会抛出IO异常
操作输出目的(写文件 控制台打印)
PrintStream(字节流)
构造方法:文件 字节输出流 路径
PrintWrite(字符流)
构造方法:文件 字节输出流 路径 字符输出流
核心功能:原样输出到目的端
System.in 是BufferedInputStream对象
System.out 是PrintStream的对象(打印流)
写入的方法:
File file = new File("/Users/Commander/Desktop/test/taylor.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps = new PrintStream(fos);
//写入
ps.println("hahaha");
ps.println(100);
ps.println(true);
//关闭
ps.close();
//写什么就打印什么
开启自动刷新的构造方法:
传参时 加个true(只对流有效)
PrintWriter pw = new PrintWriter(fw,true);
exercise1:
利用System.in从控制台接收 再打印到控制台
//创建流对象 不会卡住你的程序(让程序处于运行状态等待输入)
//从控制台读取的时候才会卡住程序
InputStream in = System.in;
//拼接
StringBuilder sb = new StringBuilder();
int len = 0;
while (true) {
//判断停止
if (sb.toString().equals("quit")) {
break;
}
len = in.read();
//判断换行
if ((len != '\n')) {
//拼接
sb.append((char)len);
}else {
//打印
System.out.println(sb.toString());
//清空字符串
sb.delete(0, sb.length());
}
}
in.close();
exercise2:
在练习一的基础上可以输入中文并打印
(用字符流)
InputStream in = System.in;
InputStreamReader isr = new InputStreamReader(in);
StringBuffer sb = new StringBuffer();
//用bufferedReader包装一下(可以一行一行读)
BufferedReader br = new BufferedReader(isr);
FileWriter fw = new FileWriter("/Users/Commander/Desktop/test/zhongwen.txt");
//写
PrintWriter pw = new PrintWriter(fw,true);
String string = null;
while ((string = br.readLine()) != null) {
if (string.equals("quit")) {
break;
}
pw.println(string);
}
br.close();
pw.close();
想用什么功能就包装什么功能(装饰者模式)
二.合并流
SequenceInputStream(需要传入一个枚举器)
作用:
可以把多个文件读成一个文件 合并成一个文件(文件不局限于是文本,图片音频也可以)
//将三个文件写到第四个文件中
File file1 = new File("/Users/Commander/Desktop/test/1.txt");
File file2 = new File("/Users/Commander/Desktop/test/2.txt");
File file3 = new File("/Users/Commander/Desktop/test/3.txt");
//创建集合
Vector<FileInputStream> vector = new Vector<>();
//向集合中添加要合并的文件
vector.add(new FileInputStream(file1));
vector.add(new FileInputStream(file2));
vector.add(new FileInputStream(file3));
//获取迭代器
Enumeration<FileInputStream> elements = vector.elements();
SequenceInputStream sis = new SequenceInputStream(elements);
//写入第四个文件
FileOutputStream fos = new FileOutputStream("/Users/Commander/Desktop/test/4.txt");
//进行读写
int len = 0;
while ((len = sis.read()) != -1) {
fos.write(len);
}
//关闭资源 只关合并流就行
sis.close();
fos.close();
exercise:
把一张图片(7M) 分割成多个(7个 一个文件1M)文件
FileInputStream fis = new FileInputStream("/Users/Commander/Desktop/tupian.png");
//一个文件大小为1M
byte[] b = new byte[1024*1024];
int len = 0;
FileOutputStream fos = null;
int name = 1;
while ((len = fis.read(b)) != -1) {
fos = new FileOutputStream("/Users/Commander/Desktop/" + (name++) + ".png");
fos.write(b,0,len);
fos.close();
}
fis.close();
再把这些文件合成一个文件
Vector<FileInputStream> vector = new Vector<>();
for (int i = 1; i <= 7; i++) {
vector.add(new FileInputStream("/Users/Commander/Desktop/" + i + ".png"));
}
Enumeration<FileInputStream> elements = vector.elements();
SequenceInputStream sis = new SequenceInputStream(elements);
FileOutputStream fos = new FileOutputStream("/Users/Commander/Desktop/hebing.png");
byte[] b = new byte[1024];
int len = 0;
while ((len = sis.read(b)) != -1) {
fos.write(b,0,len);
}
fos.close();
sis.close();