超牛牪犇Java之打印流&合并流

一.打印流

打印流永远不会抛出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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值