Java 字节流、字符流和转换流之间的关系
程序员文章站
2024-03-07 08:10:08
...
1. 字节流、字符流和转换流之间的关系
(1)字节流:读取字节到内存或将字节写入硬盘文件中。
(2)字符流:将字节转换为字符(读入)或将字符转换为字节(写出)。
(3)转换流:将字节按照指定的编码格式转换为字符(读入),或将字符按照指定的编码格式转换为字节(写出),字节(字符)通向字符(字节)的桥梁。
2.说明
上图中,硬盘中文件1.txt中有文字【你好】,如果编码格式为GBK,则存储的字节个数为4个,利用字节输入流FileInputStream将字节读取到字符流缓冲区,FileReader字符流会依据工作环境IDEA的编码格式对读取的字节进行解码,然后IDEA的编码格式为UTF-8,则会出现乱码。如果使用转换流InputStreamReader将字节转换为字符,该转换流可以使用默认的编码或者指定的编码格式,进而保证解码的准确性,最终读入内存。
上图中,将内存中的【你好】写出到硬盘文件1.txt中,使用字符输出流FileWriter时,该字符流会将你好按照IEDA的默认编码格式UTF-8将字符转换为字节,存入缓冲区,之后利用FileOutputStream字节流,将缓冲区内容写出到文件中,此时文件内容的编码格式会默认为UTF-8。如果使用OutputStreamWriter转换流可以使用指定的编码格式将字符转换为字节,之后利用字节流将字节写入文件。
3.案例
(1)输出转换流案例:
/**
* OutputStreamWriter转换流
* (1)OutputStreamWriter(OutputStream out);使用默认编码格式,将字符编码成字节
* (2)OutputStreamWriter(OutputStream out,String charsetName);使用指定编码格式,将字符编码成字节
*/
private static void osw01() throws Exception {
OutputStream os = new FileOutputStream("E:\\kankan\\1.txt");
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
osw.write("你好");
osw.flush();
osw.close();
}
(2)输入转换流案例:
/*
* InputStreamReader转换流
* (1)InputStreamReader(InputStream in);使用默认的编码格式,将字节转换为字符
* (2)InputStreamReader(InputStream in,String charsetName);使用指定编码格式,将字节转换为字符
*/
private static void isr01() throws IOException {
InputStream is = new FileInputStream("E:\\kankan\\1.txt");
InputStreamReader isr = new InputStreamReader(is,"utf-8");
char[] chs = new char[1024];
int len = 0;
while((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
isr.close();
}
上一篇: Java编程计算兔子生兔子的问题
下一篇: Java打印出所有的水仙花数的实现代码