Java学习-10-韩顺平老师
Java-文件与IO流02
目录:
01-节点流和处理流
02-对象流
03-标准输入输出流
04-转换流
05-propreties类
节点流和处理流
基本概念:
1.节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter。
2.处理流(也叫包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序
提供更强大的读写功能,如BufferedReader,BufferedWriter。
节点流和处理流一览图:
两者的区别和联系:
1.节点流是底层流/低级流,直接跟数据源相接。
2.处理流包装节点流,既可以消除不同节点流之间的差异,也可以提供更加
方便的方法来完成输入和输出。
3.处理流(也叫包装流)对节点流进行包装,使用修饰器设计模式,不会直接与
数据源相连。
4.处理流的功能主要体现在以下两个方面:
1)性能方面:主要以缓存的方式来提高输入输出效率。
2)操作的便捷:处理流可以提供一些更加便捷的方法来一次输入输出大批量的数据。
字节流对应的处理流
BufferedOutputStream && BufferedInputStream
public class Buffered_ {
public static void main(String[] args) throws IOException {
String str = "hello,world"; // 定义一个字符写入
// 创建一个 BufferedOutputStream对象,传入一个FileOutputStream对象,以追加形式写入
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:\\a.txt", true));
bos.write(str.getBytes());
// 读取文件
byte[] buf = new byte[8];
int len = 0;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:\\a.txt"));
while ((len = bis.read(buf)) != -1){
System.out.print(new String(buf,0,len));
}
bos.close();
bis.close();
}
}
字符流对应的处理流
BufferedWriter && BufferedReader
public class Buffered_ {
public static void main(String[] args) throws IOException {
// 创建一个BufferedWriter,传入一个FileWriter对象
BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\a.txt"));
// 写入字符串
bw.write("hello,word");
bw.newLine();
bw.write("hello,word");
bw.close();
String line = "";
// 创建一个BufferedReader,传入一个FileReader对象
BufferedReader br = new BufferedReader(new FileReader("e:\\a.txt"));
// 遍历输出
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
}
}
对象流
序列化和反序列化
1.序列化就是在保存数据时,保存数据的值和数据的类型。
2.反序列化就是在恢复数据时,恢复数据的值和数据的类型。
3.需要让某个对象支持序列化机制,则必须让其类是可以序列化的,让类序列化可以实现以下接口:
1)Serializable // 这是一个接口标记
2)Externalizable
ObjectOutputStream && ObjectInputStream
public class ObjectFile_ {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 通过ObjectOutputStream将对象序列化存储
ObjectOutputStream oop = new ObjectOutputStream(new FileOutputStream("e:\\a.dat"));
// 必须写入可序列化的对象
oop.writeInt(100); // int -> Integer对象
oop.writeDouble(33.3);// double -> Double对象
oop.writeFloat(20.2f);// float -> Float
oop.writeChar('A'); // char -> Character
// 写入自己定义的对象时,该对象必须实现了Serializable接口
oop.writeObject(new Dog("旺财",3)); //
oop.close();
// 通过反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:\\a.dat"));
// 反序列读取的时候必须和写入顺序一致,并且如果序列化了对象,
// 那么反序列的时候,也必须要保证能访问到该对象
System.out.println(ois.readInt());
System.out.println(ois.readDouble());
System.out.println(ois.readFloat());
System.out.println(ois.readChar());
System.out.println(ois.readObject());
ois.close();
}
}
class Dog implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
标准输入输出流
基本介绍:
类型 默认设备
System.in InputStream 键盘
System.out PrintStream 显示器
public class System_ {
public static void main(String[] args) {
System.out.println(System.in.getClass());
PrintStream out = System.out;
out.println("我爱写代码");
}
}
转换流
基本概念:
1.InputStreamReader:Reader的子类,可以将InputStream(字节流)转换成Reader(字符流)。
2.InputStreamReader:Writer的子类,可以将OutputStream(字节流)转换成Reader(字符流)。
3.当处理纯文本问题的时候,如果使用字符流效率更高,并且可以有效的解决中文问题,建议使用转换流。
InputStreamReader && OutputStreamWriter
public class Transformation_ {
public static void main(String[] args) throws IOException {
// OutputStreamWriter可以将字节输出流转转换成字符输出流,并且设置编码格式,解决中问乱码问题
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("e:\\a.txt"),"gbk"));
bw.write("hello,我爱写代码");
bw.close(); // 释放资源
String line ="";
// InputStreamReader 可以将字节输入流转换成字符输入流,提高了效率,解决了中文乱码问题
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\a.txt"), "gbk"));
// 遍历输出
while ((line =br.readLine())!= null){
System.out.println(line);
}
}
}
Properties类
基本介绍和常用方法:
作用:用来便捷的管理xxx.properties配置文件
方法:
1.load:加载配置文件的键值对到Properties对象。
2.list:将数据显示到指定设备。
3.getProperty:获取键值对。
4.setProperty:设置键值对到Properties对象。
5.store:将Properties中的键值对存储到配置文件,保存信息到配置文件,
如果有中文,会存储unicode码。
public class Properties_ {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
// 写入文件
properties.setProperty("user","tom");
properties.setProperty("psw","11111");
properties.setProperty("age","10");
properties.store(new FileOutputStream("src\\mysql.properties"),null);
// 读取 文件
properties.load(new FileInputStream("src\\mysql.properties"));
System.out.println(properties.getProperty("user")); // tom
// 修改文件内容
properties.setProperty("user","jack");
// 显示信息到默认显示屏
properties.list(System.out);
}
}