OutputStream只允许输出字节数据,Writer只允许输出字符数据和字符串数据。在实际开发中,会有多种数据类型的数据需要输出(如:整数、浮点数、字符、引用对象等),因而为了简化输出的操作,提供了两个打印流操作:
- 字节打印流(PrintStream)
- 字符打印流(PrintWriter)
1、使用PrintWriter实现文件内容输出的例子:
package com.mydemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class FileIODemo {
public static void main(String[] args) throws Exception {
// 定义操作文件
File file = new File("e:" + File.separator + "test.txt");
// 实例化打印流对象
PrintWriter printWriter = new PrintWriter(new FileOutputStream(file));
// 输出数据并换行
printWriter.println("姓名:张三");
printWriter.print("年龄:");
printWriter.print(20);
// 关闭打印流
printWriter.close();
}
}
2、模拟打印流完善输出类支持的例子【打印流的设计思想:弥补已有输出流的不足,而本质上并没有脱离输出流的操作本质,这样的设计在java中被称为装饰设计模式(Decorator Pattern)】:
// 实现一些常用数据的输出
class PrintUtil implements AutoCloseable {
// 核心操作为OutputStream
private OutputStream outputStream;
/**
* 单参构造函数
* <p>
* 由外部来决定输出的位置
*
* @param outputStream
*/
public PrintUtil(OutputStream outputStream) {
this.outputStream = outputStream;
}
/**
* 换行输出字符串
*
* @param num
*/
public void println(long num) {
this.println(String.valueOf(num));
}
/**
* 输出字符串
*
* @param num
*/
public void print(long num) {
this.println(String.valueOf(num));
}
/**
* 输出字符串
*
* @param str
*/
private void print(String str) {
try {
// 输出
this.outputStream.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 换行输出字符串
*
* @param str
*/
private void println(String str) {
this.print(str + "\r\n");
}
@Override
public void close() throws Exception {
this.outputStream.close();
}
}
3、格式化输出的例子:
package com.mydemo;
import java.io.*;
public class FileIODemo {
public static void main(String[] args) throws Exception {
// 定义操作的文件
File file = new File("e:" + File.separator + "test.txt");
// 实例化打印流对象
PrintWriter printWriter = new PrintWriter(new FileOutputStream(file));
// 姓名内容
String name = "张三";
// 年龄内容
int age = 20;
// 薪水内容
double salary = 8800.6323113;
/**
* 格式化输出
*
* printf()方法设置数据的占位符与具体的数值结合进行操作
* (字符串:%s、 整数:%d、 浮点数: %m.nf、 字符: %c)
*/
printWriter.printf("姓名:%s、 年龄:%d、 收入:%1.2f", name, age, salary);
printWriter.close();
}
}