系列文章目录
Java_IO——概述
Java_IO——字节流
Java_IO——字符流
Java_IO——缓冲流
Java_IO——属性集与转换流
Java_IO——序列化与反序列化、打印流
Java_IO——IO异常的处理
文章目录
属性集
java.util.Properties类继承了Hashtable,表示了一个持久的属性集,它可以保存在流中或从流中加载,属性列表中每一个键及其对应值都是一个字符串
- Properties类是一个双列集合,key和value都是字符串
- Properties类代表了一个持久的属性集,是唯一一个与IO流相结合的集合
方法
store,将集合中的临时数据,持久化写入到硬盘中
- void store(Writer writer, String comments)
- void store(OutputStream out, String comments)
参数:- OutputStream out:字节输出流,不能写中文
- Writer writer:字符输出流,能写中文
- String comments:注释,用来解释保存的文件是干嘛的(不能写中文,会产生乱码,因为其默认编码是unicode,一般写“”空字符串)
使用:
- 创建Properties集合对象,添加数据
- 创建字节输出流/字符输出流对象,构造方法中要绑定输出的目的地
- 使用方法store,将集合中的临时数据,持久化写入到硬盘中
- 释放资源
private static void show02() throws IOException {
//1.创建Properties集合对象,添加数据
Properties prop = new Properties();
prop.setProperty("赵丽颖","168");
prop.setProperty("迪丽热巴","165");
prop.setProperty("古力娜扎","160");
// 2.创建字节输出流/字符输出流对象,构造方法中要绑定输出的目的地
// FileWriter fw = new FileWriter("D:\\***\\prop.txt");
// 3.使用方法store,将集合中的临时数据,持久化写入到硬盘中
// prop.store(fw,"save Date");
// 4.释放资源
// fw.close();
prop.store(new FileOutputStream("D:\\***\\prop2.txt"),"save Date");
}
load,把硬盘中的文件(键值对),读取到集合中
- void load(Reader reader)
- void load(InputStream inStream)
参数:- InputStream inStream:字节输入流,不能写中文
- Reader reader:字符输入流,能写中文
使用:
- 创建Properties集合对象
- 使用方法load,把硬盘中的文件(键值对),读取到集合中
- 遍历Properties集合
private static void show03() throws IOException {
//1.创建Properties集合对象
Properties prop = new Properties();
//2.使用方法load,把硬盘中的文件(键值对),读取到集合中
prop.load(new FileReader("D:\\***\\prop.txt"));
//3.遍历Properties集合
Set<String> set = prop.stringPropertyNames();
for (String K : set) {
String V = prop.getProperty(K);
System.out.println(K + "=" + V);
}
}
注意:
- 存储键值对的文件中,键与值默认的连接符号一般使用=(等号)或空格
- 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会被读取
- 存储键值对的文件中,键与值默认都是字符串,不用再加引号
操作字符串的特有方法:
- Object setProperty(String key, String value)
调用 Hashtable方法 put 。 - String getProperty(String key)
使用此属性列表中指定的键(key)搜索属性,相当于get(key)。 - Set stringPropertyNames()
返回此属性列表中的一组键,其中键及其对应的值为字符串,相当于keySet方法
使用
- 创建Properties对象
- 使用setProperty添加数据
- 使用stringPropertyNames取出键,并存到Set集合中
- 遍历Set集合
private static void show01() {
//创建Properties对象
Properties prop = new Properties();
//使用setProperty添加数据
prop.setProperty("赵丽颖","168");
prop.setProperty("迪丽热巴","165");
prop.setProperty("古力娜扎","160");
//使用stringPropertyNames取出键,并存到Set集合中
Set<String> set = prop.stringPropertyNames();
//遍历Set集合
for (String K : set) {
String V = prop.getProperty(K);
System.out.println(K + "=" + V);
}
}
转换流
字符编码和字符集
字符编码
- 按照某种规则,将字符存储到计算机中,称为编码;
- 反之,将存储在计算机中的二进制数按某种规则解析显示出来,成为解码
字符编码:就是一套自然语言的字符与二进制之间的对应规则
编码表:生活中文字和计算机中二进制的对应规则
字符集
字符集:也叫编码表,是一个系统支持的所有字符的集合,包括各国文字、标点符号、图形符号、数字等。
- 常见的字符集:
当编码确定了,对应的字符集就确定了
转换流的作用
使用FileReader读取GBK编码的文件就会出现乱码,此时就需要转换流
原理图解
OutputStreamWriter类
java.io.OutputStreamWriter是字符流通向字节流的桥梁,它使用指定的charset(编码表)将写入流中的字符编码为字节,此类继承了Writer类
- 构造方法:
- OutputStreamWriter(OutputStream out)
创建使用默认字符编码(UTF-8)的OutputStreamWriter - OutputStreamWriter(OutputStream out,String charsetName)
创建使用指定字符编码的OutputStreamWriter - 参数:
- OutputStream out:字节输出流
- String charsetName:编码表名称(不区分大小写)
- OutputStreamWriter(OutputStream out)
使用:
- 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
- 使用Writer方法,将字节存储到缓冲区中
- 使用flush方法,将缓冲区中的字节刷新到文件中
- 释放资源
package DemoReverseStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Demo02OutputStreamWriter {
public static void main(String[] args) throws IOException {
write_utf_8();
write_gbk();
}
private static void write_gbk() throws IOException {
//1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\gbk.txt"),"gbk");
//2.使用Writer方法,将字节存储到缓冲区中
osw.write("***");
//3.使用flush方法,将缓冲区中的字节刷新到文件中
osw.flush();
//4.释放资源
osw.close();
}
private static void write_utf_8() throws IOException {
//1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的字符集
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\utf-8.txt"),"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\***\\utf-8.txt"));
//2.使用Writer方法,将字节存储到缓冲区中
osw.write("彭于晏");
//3.使用flush方法,将缓冲区中的字节刷新到文件中
osw.flush();
//4.释放资源
osw.close();
}
}
InputStreamReader类
java.io.InputStreamReader类是字节流通向字符流的桥梁,它使用指定的charset(编码表)读取字节并将其解码为字符,此类继承了Reader类
- 构造方法:
- InputStreamReader(InputStream in)
创建使用默认字符编码(UTF-8)的InputStreamReader - InputStreamReader(InputStream in,String charsetName)
创建使用指定字符编码的InputStreamReader - 参数:
- InputStream in:字节输入流
- String charsetName:编码表名称(不区分大小写)
- InputStreamReader(InputStream in)
使用:
- 创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
- 使用Reader方法读取文件
- 释放资源
注意:构造方法中的编码表要与文件的编码相同,否则会有乱码
package DemoReverseStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo03InputStreamReader {
public static void main(String[] args) throws IOException {
read_utf_8();
read_gbk();
}
private static void read_gbk() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\gbk.txt"),"GBK");
//2.使用Reader方法读取文件
int len = 0;
while ((len = isr.read()) != -1) {
System.out.println((char) len);
}
//3.释放资源
isr.close();
}
private static void read_utf_8() throws IOException {
//1.创建InputStreamReader对象,构造方法中传递字节输出流和指定的字符集
// InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\utf-8.txt"),"utf-8");
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\***\\utf-8.txt"));
//2.使用Reader方法读取文件
int len = 0;
while ((len = isr.read()) != -1) {
System.out.println((char) len);
}
//3.释放资源
isr.close();
}
}