文章目录
一、标准输入输出流
1.1 概念梳理
public static final InputStream in
:字节输入流,用来读取键盘录入的数据
示例:InputStream is = System.in;
public static final OutputStream out
:字节输出流,用来输出字节
示例:OutputStream os = System.out;
public static final PrintStream out
:字节输出流,将数据输出到命令行,打印流
示例:System.out.println();
1.2 案例一演示
- 需求:读取项目根目录下的
SystemInOutDemo.java
,并输出到命令行。 - 数据源:项目根目录下的
SystemInOutDemo.java
,使用BufferedReader
- 目的地:命令行,使用
System.out
由于标准输出流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读取到的是字符串,如果还想继续进行输出,还需要转换成字节数组。另外,我们想要通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可,可以通过OutputStreamWriter
,用到的方法public OutputStreamWriter(OutputStream out)
。
代码示例
方式一:
1)创建输入流对象
BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
2)创建输出流对象
OutputStream os = System.out; //标准输出流只能写byte/byte[]
3)进行读写
String line; //存储读到的数据
while((line = br.readLine()) != null){ //因为读的是String,所以判断是不是为null
os.write(line.getBytes()); //标准输出流只能写字符串转换后的字节数组byte[],这里可以用转换流改进,详见方式二
os.write("\r\n".getBytes()); //换行符也许自己手动转换为字节数组
}
4)释放资源
os.close();
br.close();
--------------------------------
方式二
1)创建输入流对象
BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
2)创建输出流对象
Writer w = new OutputStreamWriter(System.out); //向上转型,父类引用指向子类对象。转换流,字节->字符
3)进行读写
String line;
while((line = br.readLine()) != null){
w.write(line); //OutputStreamWriter对象可以直接输出字符串
w.write("\r\n"); //换行符仍需要自己写。可以进行改进,使用BufferedWriter自带的方法nextLine();
}
4)释放资源
os.close();
br.close();
--------------------------------
方式三:主要改进方式二中的换行
1)创建输入流对象
BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
2)创建输出流对象
BufferedWriter bw = new OutputStreamWriter(System.out); //使用缓冲流
3)进行读写
String line;
while((line = br.readLine()) != null){
bw.write(line);
bw.nextLine(); //使用缓冲流BufferedWriter自带的换行方法。
}
4)释放资源
os.close();
br.close();
1.3 案例二演示
- 需求:读取键盘录入的数据,并输出到项目根目录下的
a.txt
文件。 - 数据源:读取键盘录入的数据。
- 目的地:项目根目录下的
a.txt
文件。 - 转换流:需要把字节输入流转换为字符输入流。
InputStreamReader
,字节流 -> 字符流。方法:InputStreamReader(InputStream in)
代码示例:
1)创建输入流对象,输入的是字节
InputStream is = System.in;
2)创建输出流对象
FileWriter fw = new FileWriter("z.txt");
3)进行读写
byte[] bys = new byte[1024];
int len;
wihle((len = is.read(bys)) != -1){
fw.write(new String(bys, 0, len)); //字节转换为字符串,所以需要刷新
fw.flush();
}
4)释放资源
fw.close();
is.close();
-----------------------------
上述代码的改进思路:直接将标准输入流传入的字节送入转换流。
1)创建输入流对象,输入的是字节
InputStream is = System.in;
Reader r = new InputStreamReader(is); //------------将标准字节流对象放入转换流中
2)创建输出流对象
FileWriter fw = new FileWriter("z.txt");
3)进行读写
char[] chs = new char[1024]; //直接读的是字符
int len;
wihle((len = is.read(chs)) != -1){
fw.write(chs, 0, len); //直接输出字符串
fw.flush();
}
4)释放资源
fw.close();
is.close();
1.4 总结
二、打印流
2.1 概念梳理
PrintStream
:字节打印流PrintWriter
:字符打印流
2.2 字符打印流
2.2.1 字符打印流的特点
- 可以自动换行,
println()
- 不能输出字节,但是可以输出其他类型。
- 通过某些配置,可以实现自动刷新(只用调用
println
、printf
、format
可实现)。 - 也是包装流,不具备写出功能。
- 可以把字节输出流转换为字符输出流。
代码示例
1)创建打印流对象
PrintWriter pw = new PrintWriter("y.txt");
2)写出数据 - 父类的write()方法
pw.write("hello");
pw.write("world");
pw.write("java");
|
pw.println("hello");
pw.println("world");
pw.println("java");
3)释放资源
pw.close();
2.2.2 打印流的特有功能
- 自动换行:使用
println()
实现自动换行。 - 自动刷新:创建新
PrintWriter
对象,启动自动刷新开关,并且使用println
、printf
、format
三个方法可以实现自动刷新。 PrintWriter(OutputStream out, boolean autoFlash)
字节流输出自动刷新PrintWriter(Writer out, boolean autoFlash)
字符流输出自动刷新
注意:创建FileWriter
对象时的boolean
参数为是否追加;而创建打印流PrintWriter
对象的boolean
参数为是否刷新(只在println
、printf
、format
三个方法中有效)。
2.3 案例
- 需求:使用打印流复制文本文件
- 数据源:
SystemInOutDemo.java
- 目的地:
d:\\ SystemInOutDemo.java
代码示例
1)创建输入流对象
BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));
2) 创建输出流对象
PrintWriter pw = new PrintWriter(new FileWriter("d:\\SystemInOutDemo.java"));
3) 进行复制
String line;
while((line = br.readLine()) != null){
pw.println(line);
}
4) 释放资源
pw.close();
br.close();