今天学习了字符输出流,缓冲流,转换流,序列流,properties类虽然学的有点多但是都很简单,把学过的代码敲一遍就好了
时间:2022/4/23
字符输出流父类Writer
方法 | 说明 |
---|---|
close() | 关闭流资源 |
flush() | 刷新 |
write(int c) | 输出一个字符 |
write(char[] cbuf) | 输出字符数组 |
write(char[] b, int off, int len) | 输出字符数组的一部分 |
write(String str) | 输出一个字符串(跟字节数组的区别) |
FileWriter类(必须关闭才能见到内容)
方法 | 说明 |
---|---|
FileWriter(File file) | 创建字符输出流指向文件路径 |
FileWriter(String fileName) | 创建字符输出流指向文件路径 |
FileWriter(File file,boolean b) | 创建字符输出流指向文件路径,续写 |
FileWriter(String fileName,boolean b) | 创建字符输出流指向文件路径,续写 |
刷新和关闭:
字符输出流在用完之后必须要记住关流close()
关流的方法内部会帮我们先调用刷新,把缓冲器中的数据刷新到的硬盘上
缓冲流
有哪些缓冲流:
每个普通文件流都有对应的缓冲流:
FileInputStream —> BufferedInputStream[没用]
FileOutputStream —> BufferedOutputStream[没用]
FileReader —> BufferedReader[特殊方法]
FileWriter —> BufferedWriter[特殊方法]
字节缓冲流[了解]
字节缓冲流,和普通字节流方法完全一致, 设计的效果是为了提高效率,但是我们其实不用他
public BufferedInputStream(InputStream in) :创建一个新的缓冲输入流。 public BufferedOutputStream(OutputStream out) :创建一个新的缓冲输出流。
字符缓冲流
public BufferedReader(Reader in) :创建一个新的缓冲输入流。
public BufferedWriter(Writer out) :创建一个新的缓冲输出流。
字符缓冲流特有方法:
BufferedReader:
public String readLine() : 读一行文字。
BufferedWriter:
public void newLine() : 写换行,由系统属性定义符号
/*
* abc.txt的内容
* abc
*我你他
* */
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("day21\\abc.txt"));
//String s;
//while ((s=bufferedReader.readLine()) != null) {
// System.out.println(s);
//}
//上面效果与下面相同
// String s1 = bufferedReader.readLine();
// System.out.println(s1);
// String s2 = bufferedReader.readLine();
// System.out.println(s2);
// bufferedReader.close();
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("day21\\abc.txt"));
bufferedWriter.write(97);
bufferedWriter.newLine();
bufferedWriter.write("我");
bufferedWriter.close();
}
转换流
编码表
idea默认使用的码表是UTF-8
windows10之后默认使用的码表也是UTF-8 有些window7默认使用的码表有可能是GBK
构造方法
InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流
OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流
public static void main(String[] args) throws IOException {
// InputStreamReader gbk = new InputStreamReader(new FileInputStream("day21\\abc.txt"), "UTF-8");
// int i;
// while ((i= gbk.read()) != -1) {
// System.out.println(((char) i));
// }
// gbk.close();
OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("day21\\abc.txt"), "GBK");
gbk.write(97);
gbk.write("我");
gbk.write("你");
gbk.close();
InputStreamReader gbk1 = new InputStreamReader(new FileInputStream("day21\\abc.txt"), "UTF-8");
int i;
while ((i = gbk1.read()) != -1) {
System.out.println(((char) i));
}
gbk1.close();
}
注意输入和输出的编码必须保持一直否则会乱码,如下图所示输出位GBK,输入位UTF-8
序列流
序列化:
把java中的对象输出到硬盘文件中保存
反序列化:
把硬盘文件中的对象读取到java中来
ObjectOutputStream类
构造方法:
public ObjectOutputStream(OutputStream out) : 创建一个指定的ObjectOutputStream
写出对象的方法:
public final void writeObject (Object obj) : 将指定的对象写出。
ObjectInputStream类
构造方法:
public ObjectInputStream(InputStream in) :创建一个指定的ObjectInputStream
读取对象的方法:
public final Object readObject() : 读取一个对象。
什么时候用序列流
要把对象类型的数据输出到文件中就需要用序列流
比如单机游戏的存档。
对象操作流的注意问题
Serializable是序列化接口。
这个接口里面没有抽象方法,把这种没有方法的接口叫标记型接口
实现了这个接口,系统自动给这个类分配一个随机的序列号
transient关键字
transient叫瞬态关键字,如果给变量加瞬态,表示这个变量不会被序列化
private transient int age;
serialVersionUID编号
每个类都有一个序列号,这个类每次修改都会自动改变序列号。
如果序列化和反序列化的编号不一致,反序列化就会出错。
我们可以手动给类写一个序列号,让类的序列号固定。不会再系统随机分配了
private static final long serialVersionUID = -684923423527710L;
Properties类
Properties其实是一个双列集合。
Properties是Hashtable的子类。
Properties不写泛型,他的键值对都是字符串.
Properties可以和IO流配合和硬盘传输键值对的数据
xxx.properties是一种配置文件格式,专门用来保存键值对数据。
配置文件就是保存软件的一些软件信息的文件
构造方法
构造方法 | 说明 |
---|---|
new Properties() | 创建一个空的属性列表。 |
常用方法
方法 | 说明 |
---|---|
String getProperty(String key) | 根据键获取值 |
load(输入流) | 读取文件的键值对数据 |
font=console
size=18
public static void main(String[] args) throws IOException {
//读取文件中的键值对到java中
//创建Properties对象
Properties p = new Properties();
//读取文件中数据
p.load(new FileReader("day11\\config.properties"));
//读取完之后文件中的键值对就已经到集合中
//通过键获取值
String font = p.getProperty("font");
String size = p.getProperty("size");
//输出
System.out.println("字体是" + font);
System.out.println("大小是" + size);
}