io——转化流,对象流,properties(属性文件)
转化流
转换流就是在字节和字符之间起桥接作用的流。
一旦操作文本涉及到具体的指定编码表时,必须使用转换流 。
如果使用非默认编码保存文件或者读取文件时,需要用到转换流,因为字节流的重载构造方法中有指定编码格式的参数,而FileReader 与 FileWriter 是默认编码的文本文件。
字节流处理不了编码问题,转换流是为了解决字符流编码问题。
转换流的原理是:字符流 = 字节流 + 编码表。在转换流中选择正确的编码非常的重要,因为指定了编码,它所对应的字符集自然就指定了,否则很容易出现乱码。
编码方式不同决定处理文件类型不同,字节流(ASCII)处理二进制文件,字符流(Unicode)处理文本文件,仅此而已。
Java提供了两个转换流:
- InputStreamReader:将一个字节的输入流转换为一个字符的输入流。
- OutputStreamWriter:将一个字符的输出流转换为一个字节的输出流
public void readerFile2UTF8() {
try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("转换流.txt"),"UTF-8")){
char [] data = new char[128];
int length = inputStreamReader.read(data);
String content = new String(data,0,length);
System.out.println("编码为UTF-8内容:");
System.out.println(content);
} catch(IOException e) {
e.printStackTrace();
}
}
运行结果:
编码为UTF-8内容:
需求:
对现在的控制台翻译工具进行升级,由原来的单机应用变为c/s应用。
c端:保持原来控制台的使用方式
s端:完成原来查询单词,录入单词的功能
对象流
对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘 。
一个对象以流的形式进行传输,叫做序列化。
java对象只能在当前的jvm里存活,一旦离开了jvm,就无法使用。对象流能把对象通过流传输到另一个jvm里。就如同一个和本尊一样的分身。
一个对象能被流传输的前提条件是必须是实现Serializable接口 。
序列化:
//任务一:对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
public void serializationPerson() {
Person person = new Person();
person.setName("person");
person.setAge(38);
// 创建对象输出流
try(ObjectOutputStream outputStream =
new ObjectOutputStream(new FileOutputStream("person.ser"))) {
// 将对象序列化到person.ser文件
outputStream.writeObject(person);
System.out.println("对象序列化成功");
} catch (IOException e) {
e.printStackTrace();
}
}
反序列化:
//任务二:对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象
public void unserializationPerson() {
// 创建对象输入流,读取任务一创建的person.ser文件
try(ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream("person.ser"))){
// 读取任务一创建的person.ser文件,将文件内容反序列化为Person对象
Person person = (Person) objectInputStream.readObject();
System.out.println("反序列化后的对象:" + person);
} catch (IOException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
properties
Properties我们称之为属性文件,它是一个文本文件,存储数据的格式为:key=value;
读取系统配置文件
// 任务一:读取系统属性配置,并把系统属性写入到文件
public void readerAndWriterSystemProperties(){
Properties properties = System.getProperties();
System.out.println(properties);
try(FileWriter fileWriter = new FileWriter("system.properties")) {
properties.store(fileWriter, "");
} catch (IOException e){
e.printStackTrace();
}
}
读取自己的配置文件
config.properties:
zn.username=zn
zn.password=123456
zx.username=zx
zx.password=2355
//任务二:读取我们自己的属性文件
public void readerConfigProperties() {
try(FileInputStream fileInputStream = new FileInputStream("config.properties")){
Properties properties = new Properties();
properties.load(fileInputStream);
String username = properties.getProperty("zn.username");
String password = properties.getProperty("zx.password");
System.out.println("username:" + username + ",password:" + password);
} catch (IOException e){
e.printStackTrace();
}
}
运行结果:
"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=65027:C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\zn\.m2\repository\org\junit\platform\junit-platform-launcher\1.8.1\junit-platform-launcher-1.8.1.jar;C:\Users\zn\.m2\repository\org\junit\vintage\junit-vintage-engine\5.8.1\junit-vintage-engine-5.8.1.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;D:\project\java\teacher-wanxi\stage-two\out\production\day10-file;C:\Users\zn\.m2\repository\junit\junit\4.13.1\junit-4.13.1.jar;C:\Users\zn\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\zn\.m2\repository\org\junit\jupiter\junit-jupiter\5.8.1\junit-jupiter-5.8.1.jar;C:\Users\zn\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.8.1\junit-jupiter-api-5.8.1.jar;C:\Users\zn\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\zn\.m2\repository\org\junit\platform\junit-platform-commons\1.8.1\junit-platform-commons-1.8.1.jar;C:\Users\zn\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\zn\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.8.1\junit-jupiter-params-5.8.1.jar;C:\Users\zn\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.8.1\junit-jupiter-engine-5.8.1.jar;C:\Users\zn\.m2\repository\org\junit\platform\junit-platform-engine\1.8.1\junit-platform-engine-1.8.1.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.wx.test.PropertiesDemoTest,readerConfigProperties
username:zn,password:2355
Process finished with exit code 0