1.字符编码与解码.
(1). 字符编码 : 将字符,字符串,字符数组------> 字节,字节数组.
(2). 字节,字节数组------>字符,字符串,字符数组.
如果希望程序在读取文件时(也就是解码)不会发生字符乱码的问题,需要保证解码时使用的字符集与编码时使用的字符集一致.
这就需要用到转换流.
2.转换流.
(1). 作用 : 实现字节与字符之间的转换.
(2). 常见API :
InputStreamReader : 将一个输入型字节流转换为输入型字符流.
OutputStreamWriter : 将一个输出型字符流转换为输出型字节流.
(3). 例 :
@Test
public void test9() {
InputStreamReader isr = null;
try {
File file = new File("src/hello.txt");
FileInputStream fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
char[] cbuffer = new char[5];
int len;
while((len = isr.read(cbuffer)) != -1) {
for (int i = 0; i < len; i++) {
System.out.print(cbuffer[i]);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
isr.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
控制台
abc123
hexua
你是个大**
注 :
isr = new InputStreamReader(fis);
此处默认的是使用的是"utf-8"字符集.
按住Ctrl+p可以查看参数列表.
说明我们可以在此处传入字符集.比如 :
isr = new InputStreamReader(fis, "GBK");
如果我们此时使用的是如上输入型字符流.运行代码可以看到乱码.
abc123
hexua
浣犳槸涓ぇ**
那么为什么会发生乱码呢?很明显,编码集默认用的"utf-8",而此时解码集用的"GBK"不一致.而我们可以看到,英文字符与数字并没有发生乱码的现象,反而中文出现了乱码.为什么呢?也很简单,因为utf-8与gbk都向下兼容了ASCII码,都使用一个字符存的,所以没有发生乱码.而中文却发生乱码.因为一个中文字符在gbk中占两个字符,而在utf8中占3个字符.
3.字符集
(1). 在文件中存储的字符集
- ASCII : 主要用来存储a,b,c等英文字符及数字和特殊符号.
- gbk : 用来存储中文简体繁体,并向下兼容ASCII,意味着英文字母等仍然占一个字节.而中文字符使用两个字符.
- utf-8 : 可以用来存储世界范围内主要的语言的所有字符.使用1-4个不等的字节表示一个字符.中文字符使用3个字节存储.同时又向下兼容ASCII.
(2). 在内存中存储的字符
- 在内存中的字符都以两个字节存储.'a'也用两个字节存储,只是只使用了一半的空间.
4.对象流
(1). 前言
如果需要将内存中定义的变量(包括基本数据类型和引用数据类型)保存在文件中,我们应该怎么办呢?
java提供了对象流来处理这些类型的数据.
(2). 对象流.
ObjectOutputStream : 允许应用程序将基本数据类型,引用数据类型写入输出流.从而允许把这种输入流保存在物理磁盘上或通过网络将这种字节流传入网络节点.
ObjectInputStream : 允许应用程序以与机器无关的方式从底层输入流中读取基本数据类型,引用数据类型的变量.
(3). 常用方法
ObjectOutputStream :
ObjectInputStream : 将上述write改为read.
(4). 例 :
@Test
public void test10() throws IOException {
File file = new File("src/xixi.txt");
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
System.out.println(ois.readInt());
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
ois.close();
}
}
@Test
public void test12() {
File file = new File("src/xixi.txt");
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeDouble(23.7);
oos.writeUTF("hjsfbhj");
oos.writeInt(34);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
oos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
5.序列化.