1、转换流: InputStreamReader , OutputStreamWriter
【1】转换流:作用:将字节流和字符流进行转换。
【2】转换流 属于 字节流还是字符流? 属于字符流
InputStreamReader :字节输入流 —> 字符的输入流
OutputStreamWriter : 字符输出流 —> 字节的输出流
【3】图解:
输入输出——是相对于程序来说的。
理解:
InputStreamReader —— 把输入方向的字节流转换成输入方向的字符流;
OutputStreamWriter —— 把输出方向的字符流转换成输出方向的字节流。
【4】将输入的字节流转换为输入的字符流,然后完成文件到程序(的查看):
代码示例:以下代码实现了上图左侧的转换
package test5_;
import java.io.*;
/**
* @Auther: zhoulz
* @Description: test5_
* @version: 1.0
*/
public class Test1 {
public static void main(String[] args) throws IOException {
//文件---》程序:
//1.有一个源文件
File f = new File("d:\\Test.txt");
//2、需要一个输入的字节流接触文件:
FileInputStream fis = new FileInputStream(f);
//3、加入一个转换流,将字节流转换为字符流:(转换流属于一个处理流)
//将字节转换为字符的时候,需要指定一个编码,这个编码跟文件本身的编码格式统一
//如果编码格式不统一的话,那么在控制台上展示的效果就会出现乱码
//InputStreamReader isr = new InputStreamReader(fis,"utf-8");
//换成gbk格式就会出错
//如果不指定编码的话,则会(自动)获取程序本身的编码:utf-8,因为提供了这样的一个构造器
InputStreamReader isr = new InputStreamReader(fis);
//4、开始动作,将文件中内容显示在控制台
char[] ch = new char[20];
int len = isr.read(ch);
while (len != -1){
//System.out.println(ch);
//System.out.println(len);
//将缓冲数组转为字符串在控制台上打印出来
System.out.print(new String(ch,0,len)); //注意,不用换行
len = isr.read(ch);
}
//5、关闭流
isr.close();
}
}
2、转换流:InputStreamReader,OutputStreamWriter
—— 实现文本文件的复制
代码示例:
package test5_;
import java.io.*;
/**
* @Auther: zhoulz
* @Description: test5_
* @version: 1.0
*/
public class Test2 {
public static void main(String[] args) throws IOException {
//1、有一个源文件
File f1 = new File("d:\\Test.txt");
//2、有一个目标文件
File f2 = new File("d:\\Demo.txt");
//3、输入方向
FileInputStream fis = new FileInputStream(f1);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
//4、输出方向
FileOutputStream fos = new FileOutputStream(f2);
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
//5、开始动作:
char[] ch = new char[20];
int len = isr.read(ch);
while (len != -1){
osw.write(ch,0,len);
len = isr.read(ch);
}
//6、关闭流
osw.close();
isr.close();
}
}
3、System类对IO流的支持
【1】System的属性:
System.in : “标准”输入流。---》默认情况下 从键盘输入
System.out :“标准”输出流。 ---》默认情况下,输出到控制台。
【2】System.in :“标准”输入流。---> 默认情况下 从键盘输入
代码示例:
package test5_;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
/**
* @Auther: zhoulz
* @Description: test5_
* @version: 1.0
*/
public class Test3_System_in {
public static void main(String[] args) throws IOException {
//得到的是标准的输入流 —> 从键盘输入
/*InputStream in = System.in;
//调用方法:
int n = in.read();
//read方法等待键盘的录入,所以这个方法是一个阻塞方法。
System.out.println(n);*/
//以前案例:从键盘录入一个int类型的数据:
//从上面的代码证明,键盘录入实际上是:System.in
//形象的理解:System.in是一根管,这个管怼到键盘上去了,所以你从键盘录入的话,就从这个管到程序中了
//Scanner的作用:扫描器:起扫描作用的,扫键盘录入的从这根管出来的数据
/*Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println(i);*/
//既然Scanner是扫描的作用,那就不一定非得扫System.in进来的东西,
//还可以扫描其他管的内容,如:
Scanner sc = new Scanner(new FileInputStream((new File("d:\\Test.txt"))));
//只要下面有东西,就进行输出
while (sc.hasNext()){ //用if的话会只读一部分
System.out.println(sc.next());
}
}
}
【3】System.out :返回的输出流 、 打印流(PrintStream)
代码示例:
package test5_;
import java.io.PrintStream;
/**
* @Auther: zhoulz
* @Description: test5_
* @version: 1.0
*/
public class Test4_System_out {
public static void main(String[] args) {
//写到控制台
PrintStream out = System.out;
//调用方法
out.print("你好1");//直接在控制台写出,但是不换行
out.print("你好2");
out.print("你好3");
out.print("你好4");
out.println("中国人1");//直接在控制台写出,并且换行操作
out.println("中国人2");
out.println("中国人3");
out.println("中国人4");
System.out.println("你好");
System.out.println("中国人");
}
}
4、练习:键盘录入内容输出到文件中
【1】解决思路:
【2】代码:
package test5_;
import java.io.*;
/**
* @Auther: zhoulz
* @Description: test5_
* @version: 1.0
*/
public class Test5_a_case {
public static void main(String[] args) throws IOException {
//1、先准备输入方向
//键盘录入:
InputStream in = System.in; //System.in属于字节流!!!
//字节流 ——> 字符流:
InputStreamReader isr = new InputStreamReader(in);
//在isr外面再套一个缓冲流:
BufferedReader br = new BufferedReader(isr);
//2、再准备输出方向
//准备目标文件
File f = new File("d:\\Demo.txt");
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);
//3、开始动作
String s = br.readLine();
while (!s.equals("exit")){//条件是:s != null的话,则会一直录入
bw.write(s);
bw.newLine();//文件中换行
s = br.readLine();
}
//4、关闭流
bw.close();
br.close();
}
}