个人简介
- 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
- 欢迎点赞+收藏+留言💜
- 踏踏实实走着,每一步都算数🧡
我们都知道如果代码编码和文件编码相同,使用字符流读取中文不会出现乱码情况;一旦编码方式不同,就会出现乱码。要解决该问题就需要我们今天学习的转换流。
一、字符输入转换流(InputStreamReader):可以把原始的字节流按照指定的编码转换成字符输入流。
构造方法:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author hanhan
* date 2022/4/15 8:07
* 努力已经来不及了,你得拼命
*/
public class CharSetTest_Demo {
public static void main(String[] args) {
try ( //提取UTF-16BE文件的原始字节流
InputStream f = new FileInputStream("D:\\成名\\geci.text");
//把原始字节流转换成字符输入流,完美的解决了乱码问题
InputStreamReader in = new InputStreamReader(f,"UTF-16BE");
BufferedReader b = new BufferedReader(in);
){
String line;
while((line=b.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、字符输出转换流(OutputStreamWriter):
1.可以把字符以指定编码获取字节后再使用字节输出流写出去:eg:"智者不如爱河,建设美丽中国".getBytes(编码)
2.使用字符输出转换流实现
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
/**
* @author hanhan
* date 2022/4/15 9:18
* 努力已经来不及了,你得拼命
*/
public class OutputStreamWriter_Demo {
public static void main(String[] args) {
try (
//定义一个字节输出流
FileOutputStream f = new FileOutputStream("src/OutputStreamWriter.text");
//把原始的字节输出流转换成字符输出流
OutputStreamWriter o = new OutputStreamWriter(f,"GBK");
BufferedWriter b = new BufferedWriter(o);
){
b.write("我爱中国");
b.write("我爱JAVA");
b.write("啦啦啦啦");
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、对象序列化
作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
官方规定:
1.对象如果要序列化,就必须实现Serializable接口。
2.不需要序列化的变量可以用transient修饰
3.对象序列化和反序列化的版本必须一致
常用API:writeObject()
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @author hanhan
* date 2022/4/16 10:11
* 努力已经来不及了,你得拼命
*/
public class ObjectOutputStream_Demo {
public static void main(String[] args) throws Exception {
//创建学生对象
Student s = new Student("小明", "12", "女");
//对象序列化,使用对象字节输出流包装字节输出流管道
ObjectOutputStream ob = new ObjectOutputStream(new FileOutputStream("src/Student.text"));
ob.writeObject(s);
ob.close();
System.out.println("序列化成功");
}
}
class Student implements Serializable {
private String name;
private String age;
private String sex;
public Student() {
}
public Student(String name, String age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
四、对象反序列化(ObjectInputStream类)
作用:以内存为基准,把存储到磁盘文件中的对象数据恢复成内存中的对象。
import java.io.FileInputStream;
import java.io.ObjectInputStream;
/**
* @author hanhan
* date 2022/4/16 10:44
* 努力已经来不及了,你得拼命
*/
public class ObjectInputStream_Demo {
public static void main(String[] args) throws Exception {
//把文件中的对象数据恢复成内存中Java对象
ObjectInputStream ob = new ObjectInputStream(new FileInputStream("src/Student.text"));
Student o = (Student)ob.readObject();
System.out.println(o);
}
}