java转换流
/**
* 转换流InputStreamReader/OutputStreamWriter
*/
public class ConvertStream1 {
public static void main(String[] args) {
try (
InputStream in = System.in;
//System.in是InputStream对象,用于读取键盘输入/数据源的字节,是字节流、节点流,每次.read()只能读取一个字节,当用Scanner(System.in)的nextLine()方法时会将字节流转换为字符流(使用字符集进行解码),再通过BufferedReader读取整行内容
OutputStream out = System.out;
//System.out是PrintStream对象,PrintStream继承FilterOutputStream继承OutputStream,用于显示接收到的内容,是字节流、节点流,System.out.println()方法同样将out字节流外套转换流再外套缓冲流,通过BufferedWriter输出整行内容(字符数组),通过OutputStream将字符数组转换为字节数组(使用字符集进行编码),通过out将字节数组输出
InputStreamReader isr = new InputStreamReader(in);
//InputStreamReader处理字节流,实现字节流向字符流的转换,是处理流、字符流,构造器第二个参数用于设定字符集,不填默认使用utf-8字符集,将读取到的字节转换为字符的过程是解码的过程,按照字符集的规则将不同长度的字节bytes转换为2字节的char字符(unicode字符集每个字符占2byte),字节本身只是01二进制数,需要使用和编码相同的字符集解码才能正确的还原字符
OutputStreamWriter osw = new OutputStreamWriter(out);
//OutputStreamWriter将字节输出流转换为字符输出流,构造器第二个参数用于设定字符集,不填默认使用utf-8字符集,将字符按照字符集的规则转换为不同长度的字节bytes,再通过out将bytes输出,对于输出的内容/二进制数只有用相同的字符集解码才能还原成正确的字符
BufferedReader br = new BufferedReader(isr);
//将转换流传给字符缓冲流
BufferedWriter bw = new BufferedWriter(osw)
){
String inp;
do {
bw.write("请输入:");
bw.flush();
inp = br.readLine();
//.readLine()是读取一行内容,当System.in等待用户输入完成字符串后.read()只能读取一个字节的内容,通过嵌套处理流调用.readLine()将一行内容全部读取
bw.write("请确认您输入的内容是否正确:" + inp);
//使用字符处理流.write()
bw.newLine();
bw.write("确认Y/N:");
bw.flush();
//flush()在每一段输出的末尾使用,不需要每输出一次执行一遍
inp = br.readLine();
} while (!"y".equalsIgnoreCase(inp));
}catch (Exception e){
e.printStackTrace();
}
//System.out可以输出字节到控制台,当BufferedWriter写入字符串String时将字符串变为字符数组char[],后续执行flush时,调用内置的OutputStreamWriter,通过流编码器将字符数组char[]根据设定的字符集charset转化为字节数组byte[],这个过程是编码的过程
//System.out将编码后的字节数组byte[]输出到控制台,控制台再对bytes进行解码,转化为字符串/文本显示出来
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("iostream/testFile4.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("iostream/testFile5.txt")))){
//字节流外面套转换流再套缓冲流
int num = 1;
for (String line = br.readLine();line!=null;line = br.readLine()){
bw.write(num+".\t"+line);
//字节流无法使用拼接字符串添加行号,通过嵌套后使用缓冲流的write,作用同BufferedWriter(FileWriter)的write,而FileWriter对象内部也会生成OutputStreamWriter(FileOutputStream)对象
bw.newLine();
num++;
}
bw.flush();
}catch (Exception e){
e.printStackTrace();
}
}
}