Java基础练习 — 标准输入输出流/打印流

一、标准输入输出流

1.1 概念梳理

  1. public static final InputStream in:字节输入流,用来读取键盘录入的数据
    示例:InputStream is = System.in;
  2. public static final OutputStream out:字节输出流,用来输出字节
    示例:OutputStream os = System.out;
  3. public static final PrintStream out:字节输出流,将数据输出到命令行,打印流
    示例:System.out.println();
    标准输入输出流

1.2 案例一演示

  1. 需求:读取项目根目录下的SystemInOutDemo.java,并输出到命令行。
  2. 数据源:项目根目录下的SystemInOutDemo.java,使用BufferedReader
  3. 目的地:命令行,使用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 案例二演示

  1. 需求:读取键盘录入的数据,并输出到项目根目录下的a.txt文件。
  2. 数据源:读取键盘录入的数据。
  3. 目的地:项目根目录下的a.txt文件。
  4. 转换流:需要把字节输入流转换为字符输入流。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 总结

高级IO流
在这里插入图片描述

二、打印流

2.1 概念梳理

  • PrintStream:字节打印流
  • PrintWriter:字符打印流

2.2 字符打印流

2.2.1 字符打印流的特点

  1. 可以自动换行,println()
  2. 不能输出字节,但是可以输出其他类型。
  3. 通过某些配置,可以实现自动刷新(只用调用printlnprintfformat可实现)。
  4. 也是包装流,不具备写出功能。
  5. 可以把字节输出流转换为字符输出流
    代码示例
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 打印流的特有功能

  1. 自动换行:使用println()实现自动换行。
  2. 自动刷新:创建新PrintWriter对象,启动自动刷新开关,并且使用printlnprintfformat三个方法可以实现自动刷新。
  3. PrintWriter(OutputStream out, boolean autoFlash)字节流输出自动刷新
  4. PrintWriter(Writer out, boolean autoFlash)字符流输出自动刷新
    注意:创建FileWriter对象时的boolean参数为是否追加;而创建打印流PrintWriter对象的boolean参数为是否刷新(只在printlnprintfformat三个方法中有效)。

2.3 案例

  1. 需求:使用打印流复制文本文件
  2. 数据源:SystemInOutDemo.java
  3. 目的地: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();
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值