目录
1.Properties类
1.1概述
Properties叫做属性集,是HashTable的子类,属于双列集合,这个集合的键和值都是字符串类型,不需要规定泛型。我们通常使用属性集和流相关的方法。
1.2构造方法
方法 | 说明 |
public Properties() | 创建一个空的属性列表 |
1.3常用方法
方法 | 说明 |
Object setProperty(String key,String value) | 添加键值对 |
String getProperty(String key) | 根据键获取值 |
stringPropertyNames() | 获取所有的键 |
load(输出流) | 把文件中的键值对数据读取到属性集中 |
store(输出流,String comments) | 把集合中的键值对保存到文件中 |
集合的相关方法:
//public Properties() 创建一个空的属性列表。
Properties pro = new Properties();
//Object setProperty(String key ,String value) 添加键值对
pro.setProperty("key1", "value1");
pro.setProperty("key2", "value2");
pro.setProperty("key3", "value3");
pro.setProperty("key1", "value4"); //key值相同,会覆盖
System.out.println(pro);
//String getProperty(String key) 根据键获取值
System.out.println(pro.getProperty("key1"));
System.out.println(pro.getProperty("key2"));
//stringPropertyNames() 获取所有的键
System.out.println(pro.stringPropertyNames());
IO的相关方法:
//构造方法 创建对象
Properties pro = new Properties();
//创建输入流 读取数据
FileReader fr = new FileReader("src\\study\\properties\\test.properties");
//load(输入流) 把文件中的键值对数据读到集合中
pro.load(fr);
//关流
fr.close();
//输出
System.out.println(pro);
//构造方法 创建对象
Properties pr = new Properties();
pr.setProperty("username", "玖玖");
pr.setProperty("password", "jiujiu");
pr.setProperty("birthday", "2022-01-22");
pr.setProperty("年龄", "1");
pr.setProperty("性别", "男");
//创建输出流
FileWriter fw = new FileWriter("src\\study\\properties\\test02.properties");
//store(输出流,String comments) 把集合中的键值对保存到文件中
pr.store(fw,"输出备注");
//关流
fw.close();
2.缓冲流
2.1介绍
普通流的使用效率较低,java提供了四个缓冲流用来提高前面四个普通流的效率。
FileOutputStream --> BufferedOutputStream
FileInputStream --> BufferedInputStream
FileWriter --> BufferedWriter
FileReader --> BufferedReader
2.2字节缓冲流
构造方法:
方法 | 说明 |
public BufferedInputStream(InputStream in) | 创建一个字节缓冲输入流 |
public BufferedOutputStream(OutputStream out) | 创建一个字节缓冲输出流 |
缓冲输出流都是会把数据先输出到缓冲区。
提高效率,没有特殊功能
缓冲输出流代码示例:
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src\\study\\bufferedStream\\test00.txt"));
//输出一个字符
bos.write(97);
bos.write(13);
bos.write(10);
//输出一个数组
byte[] arr = {98,65,99,66,100};
bos.write(arr);
bos.write("\r\n".getBytes());
bos.write(arr,2,3);
//刷新
bos.flush();
//关流
bos.close();
缓冲输入流代码示例:
//创建缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src\\study\\bufferedStream\\test00.txt"));
//输入一个字节
System.out.println(bis.read());
//输入一个字节数组
byte[] arr = new byte[3];
System.out.println(bis.read(arr));//读取到的字节个数
System.out.println(Arrays.toString(arr));//读取到的内容
int len;
while ((len = bis.read(arr)) != -1){
System.out.print(new String(arr,0,len));
}
//关流
bis.close();
2.3字符缓冲流
构造方法:
方法 | 说明 |
public BufferedReader(Reader in) | 创建一个字符缓冲输入流 |
public BufferedWriter(Writer out) | 创建一个字符缓冲输出流 |
特有方法:
方法 | 说明 |
public String readLine() | BufferedReader的方法,读一行文字 |
public void newLine() | BufferedWriter的方法,写换行,由系统属性定义符号 |
字符缓冲输出流代码示例:
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("src\\study\\bufferedStream\\test01.txt"));
//输出一个字符
bw.write('我');
//换行
bw.newLine();
//输出一个字符数组
char[] arr = {'我','爱'};
bw.write(arr);
bw.write(arr,1,1);
//输出一个字符串
bw.write("java");
bw.write("今天星期一", 2, 3);
//刷新
bw.flush();
//关流
bw.close();
字符缓冲输出流代码示例:
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("src\\study\\bufferedStream\\test01.txt"));
//输入一个字符
System.out.println((char)br.read());
//输入一个字符数组
char[] arr = new char[4];
System.out.println(br.read(arr));
System.out.println(new String(arr));
//读取一行
System.out.println(br.readLine());
int len;
while ((len = br.read(arr)) != -1){
System.out.println(new String(arr,0,len));
}
//关流
br.close();
2.4缓冲流总结
字节缓冲流
没有特殊方法,只提高效率
字符缓冲流
提高效率
特殊方法:
读取一整行 readLine()
写出换行符 newLine()
3.转换流
3.1编码表
3.2输出转换流OutputStreamWriter类
构造方法:
方法 | 说明 |
OutputStreamWriter(OutputStream out) | 创建一个使用默认字符集的字符流 |
OutputStreamWriter(OutputStream out, String charsetName) | 创建一个指定字符集的字符流 |
输出转换流代码演示:
//输出转换流
//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("src\\study\\inputStream\\test01.txt"));
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("src\\study\\inputStream\\test01.txt",true),"GBK");
//获取编码集
System.out.println(osw.getEncoding());
//输出一个字节
osw.write(98);
//输出一个字节数组
char[] arr = {99,'你',100,'我',101,'他'};
osw.write(arr);
osw.write(arr,1,3);
//刷新
osw.flush();
//关流
osw.close();
3.3输入转换流InputStreamReader类
构造方法:
方法 | 说明 |
InputStreamReader(InputStream in) | 创建一个使用默认字符集的字符流 |
InputStreamReader(InputStream in,String charsetName) | 创建一个指定字符集的字符流 |
输入转换流代码演示:
//创建输入转换流对象
//InputStreamReader isr = new InputStreamReader(new FileInputStream("src\\study\\inputStream\\test01.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("src\\study\\inputStream\\test01.txt"),"GBK");
//获取编码集
System.out.println(isr.getEncoding());
//读取一个字符
System.out.println((char)isr.read());
//读取一个字符数组
char[] arr = new char[3];
isr.read(arr);
System.out.println(new String(arr));
int len;
while ((len = isr.read(arr)) != -1){
System.out.println(new String(arr,0,len));
}
//关流
isr.close();
3.4转换流总结
转换流的本质也是字符流,所以可以调用字符流的方法
转换流用于指定编码表的情况
在idea上普通流不能指定码表,默认都是UTF-8
4.序列流
4.1介绍
序列流可以操作对象。
序列化:把对象从内存保存到文件中。
反序列化:把对象从文件读取到内存中。
4.2对象输出流ObjectOutputStream类
构造方法:
方法 | 说明 |
public ObjectOutputStream(OutputStream out) | 创建一个对象输出流 |
写出对象方法:
方法 | 说明 |
public final void writeObject(Object obj) | 将指定对象写出 |
代码示例:
//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\study\\objectStream\\test01.txt"));
//创建对象
Person person = new Person("玖玖", 1);
//输出对象
oos.writeObject(person);
//关流
oos.close();
注意:
要想对象经过IO传递,需要实现Serializable接口。这个接口是标记型接口,没有任何方法。
输出乱码,因为电脑没有查看对象的方式。
4.3对象输入流ObjectInputStream类
构造方法:
方法 | 说明 |
public ObjectInputStream(InputStream in) | 创建一个对象输入流对象 |
读取对象方法:
方法 | 说明 |
public final Object readObject() | 读取一个对象 |
代码示例:
//创建对象输入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\study\\objectStream\\test01.txt"));
//读取对象
Person person = (Person) ois.readObject();
System.out.println(person);
//关流
ois.close();
4.4对象操作流的作用
对象操作流作用就是输出输入对象类型,别的流都是只能操作文本。
4.5对象操作流补充知识点
ransient关键字
transient表示瞬态,被瞬态修饰的成员变量不会被序列化。
private transient int age;
serialVersionUID问题
每个类都有一个UID编号,每次修改类,编号都会随机改变,如果类在序列化和反序列化之间编号不同,反序列化会失败。如果中间要修改这个类,需要在序列化之前手动指定一个UID。
private static final long serialVersionUID = 1234567890987654L;
序列化多个对象
readObject()方法在读取到末尾的时候会直接抛出EOFException,不建议读取多次。
如果想要保存多个对象,建议把多个对象放在一起一次保存(用集合存储)。
代码示例:
//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\study\\objectStream\\test02.txt"));
//创建对象
Person person1 = new Person("玖玖", 1);
Person person2 = new Person("tiki", 2);
Person person3 = new Person("饼饼", 3);
ArrayList<Person> list = new ArrayList<>();
list.add(person1);
list.add(person2);
list.add(person3);
//输出对象
oos.writeObject(list);
//关流
oos.close();
//创建对象输入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\study\\objectStream\\test02.txt"));
//读取对象
ArrayList<Person> list = (ArrayList<Person>) ois.readObject();
System.out.println(list);
//关流
ois.close();
5.打印流
5.1介绍
打印流帮助程序把数据用打印的方式来输出。
5.2构造方法
方法 | 说明 |
public PrintStream(String fileName) | 使用指定文件的文件名创建一个打印流对象 |
5.3代码示例
//创建打印流对象
PrintStream ps = new PrintStream("src\\study\\printStream\\test01.txt");
//以打印的方式来输出,你写啥就是啥
ps.print(97);
ps.print(98);
ps.print(1);
ps.print(3.14);
ps.print("哈哈哈");
ps.println('a');
ps.println('b');
ps.println('c');
//在控制台输出数据
//System.out.println这个语句的底层就是使用了打印流
//out是PrintStream的静态方法
System.out.println("111");
//输出语句使用ps这个对象作为打印流 改变打印位置 调用setOut方法后,System.out.println语句的输出不会打印在控制台,而是流文件中
System.setOut(ps);
System.out.println("玖玖");
//关流
ps.close();
以上就是部分Properties类以及IO流的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!