简介
-
转换流提供了在字节流和字符流之间的转换。
-
Java API提供了两个转换流:
-
InputstreamReader
:将Inputstream
转换为Reader
。 -
OutputStreamWriter
:将Writer
转换为OutputStream
。
-
-
字节流中的数据都是字符时,转成字符流操作更高效。
-
很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。
InputStreamReader
InputStreamReader
将一个字节的输入流转换为字符的输入流,解码:字节、字节数组 --->字符数组、字符串。
构造器:
public InputStreamReader(InputStream in)
-
public InputStreamReader(Inputstream in,String charsetName)
:可以指定编码集。
OutputStreamWriter
OutputStreamWriter
将一个字符的输出流转换为字节的输出流,编码:字符数组、字符串 ---> 字节、字节数组。
构造器:
public OutputStreamWriter(OutputStream out)
-
public OutputStreamWriter(Outputstream out,String charsetName)
:可以指定编码集。
图示:
代码示例
/**
综合使用InputStreamReader和OutputStreamWriter
*/
public class IsrAndOswTest {
@Test
public void test() {
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
//1.造文件、造流
File file1 = new File("D:\\io\\hello.txt");
File file2 = new File("D:\\io\\hello_gbk.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
isr = new InputStreamReader(fis, "utf-8");
osw = new OutputStreamWriter(fos, "gbk");
//2.读写过程
char[] cbuf = new char[1024];
int len;
while ((len = isr.read(cbuf)) != -1) {
osw.write(cbuf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3.关闭资源
if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (osw != null) {
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
说明:文件编码的方式(比如:GBK),决定了解析时使用的字符集(也只能是GBK)。
编码集
常见的编码表
-
ASCII
:美国标准信息交换码。用一个字节的7位可以表示。 -
ISO8859-1
:拉丁码表。欧洲码表用一个字节的8位表示。 -
GB2312
:中国的中文编码表。最多两个字节编码所有字符 -
GBK
:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码 -
Unicode
:国际标准码,融合了目前人类使用的所字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。 -
UTF-8
:变长的编码方式,可用1-4个字节来表示一个字符。
说明:
- 面向传输的众多
UTF(UCS Transfer Format)
标准出现了,顾名思义,UTF-8
就是每次8个位传输数据,而UTF-16
就是每次16个位。这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。 -
Unicode
只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode
编码是UTF-8
和UTF-16
。
UTF-8变长编码表示
编码应用
- 编码:字符串-->字节数组。
- 解码:字节数组-->字符串。
- 转换流的编码应用:
- 可以将字符按指定编码格式存储。
- 可以对文本数据按指定编码格式来解读。
- 指定编码表的动作由构造器完成。
使用要求:
客户端/浏览器端 <----> 后台(java
,GO
,Python
,Node.js
,php
) <----> 数据库。
要求前前后后使用的字符集都要统一:UTF-8
。
网友评论