1 数据输入输出流 DataInputStream、DataOutputStream
特点: 可以写基本数据类型,可以读取基本数据类型
// 写基本数据类型
dos.writeInt(45) ;
dos.writeChar('中');
dos.writeUTF("你好");
// 读取数据
int a = dis.readInt() ;
System.out.println(a);
char ch = dis.readChar() ;
System.out.println(ch);
String str = dis.readUTF() ;
System.out.println(str);
2 打印流
打印流的特点
a: 打印流只能操作目的地,不能操作数据源(不能进行读取数据)
b: 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
c: 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
public PrintWriter(OutputStream out, boolean autoFlush) 启动 自动刷新
public PrintWriter(Writer out, boolean autoFlush) 启动自动刷新
d: 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径)
public PrintWriter(File file)
public PrintWriter(String fileName)
PrintWriter pw = new PrintWriter("printWriter.txt");
案例演示:PrintWriter实现自动刷新和换行
PrintWriter pw = new PrintWriter(new FileWriter("printWriter2.txt") , true) ;
pw.println(true) ;
pw.println(100) ;
pw.println("中国") ;
打印流复制文本文件,这个打印流只能进行写数据,不能进行读取数据,
那么我们应该找一个可以读取文本文件中的的数据的流对象进行读取操作.
而我们非常喜欢高效的流对象,于是我们可以使用BufferedReader进行读取数据.
BufferedReader br = new BufferedReader(new FileReader("PrintStreamDemo.java")) ;
PrintWriter pw = new PrintWriter(new FileWriter("copyFile.java") , true) ;
// 频繁的读写操作
// 一次读取一行
String line = null ;
while((line = br.readLine()) != null){
pw.println(line);
}
pw.close() ;
br.close() ;
3 标准输入输出流
public static final InputStream in: 标准输入流, 对应的设备是键盘
public static final PrintStream out: 标准输出流 , 对应的设备就是显示器
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的孙子类FilterOutputStream 的子类.
二种键盘输入模式
A:Scanner
B:BufferedReader的readLine方法。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
4 随机访问流
RandomAccessFile概述 最大特点 能读能写
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
支持对随机访问文件的读取和写入。
RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据.
我们可以通过getFilePointer方法获取文件指针,并且可以通过seek方法设置文件指针
// 创建对象
RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
// 写数据
raf.writeInt(100) ;
raf.writeChar('中') ;
raf.writeUTF("你好") ;
// 释放资源
raf.close() ;
// 创建对象
RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
// 读取数据
int a = raf.readInt() ;
System.out.println(a);
System.out.println(raf.getFilePointer());//4 获取文件指针 按字节获取的 写了个int 所以是4
char ch = raf.readChar() ;
System.out.println(ch);
System.out.println(raf.getFilePointer());// 获取文件指针
String result = raf.readUTF() ;//这里会多读两个字节 是因为writeUTF("你好") 会多写两个字节
System.out.println(result);
System.out.println(raf.getFilePointer());
// 设置文件指针的位置 可以往回读
raf.seek(4) ;
ch = raf.readChar() ;
System.out.println(ch);
// 释放资源
raf.close() ;
5 序列化流和反序列化流(也就是对象操作流)
A:序列化流的概述
所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化
反序列化:就是把文件中存储的对象以流的方式还原成对象
序列化流: ObjectOutputStream
反序列化流: ObjectInputStream
像这样一个接口中如果没有方法,那么这样的接口我们将其称之为标记接口(用来给类打标记的,相当于猪肉身上盖个章)
一个对象可以被序列化的前提是这个对象对应的类必须实现Serializable接口
序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt")) ;
Student s = new Student("刘亦菲" , 18) ;
oos.writeObject(s) ;
oos.close() ;、
--------------------------------------------------
反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")) ;
Object obj = ois.readObject() ;
Student s = (Student)obj ;
System.out.println(s.getName() + "----" + s.getAge());
ois.close() ;
private transient int age ;// 可以阻止成员变量的序列化使用transient
6 Properties
Properties 类表示了一个持久的属性集。
Properties 可保存在流中或从流中加载。
属性列表中每个键及其对应值都是一个字符串
属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型
Properties的特殊功能
public Object setProperty(String key,String value)
public String getProperty(String key)
public Set<String> stringPropertyNames()
Properties的load()和store()功能
public void load(Reader reader): 读取键值对数据把数据存储到Properties中
public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释
Properties prop = new Properties() ;
// 添加元素
prop.setProperty("张三", "23") ;
prop.setProperty("李四", "24") ;
prop.setProperty("王五", "25") ;
// public void store(Writer writer, String comments)
//把Properties集合中的键值对数据写入到文件中, comments注释
// 创建输出流对象
FileWriter fw = new FileWriter("userInfo.txt") ;
prop.store(fw, "姓名和年龄对应信息") ;
// 释放资源
fw.close() ;
7 总结