分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutStream PipedReader PipedWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类 FilterInputStream FilterOutputSteam FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream
-----------------------------------------------------------------------------------------------------------------------------------------------
对象流:资料来自尚硅谷
1.1 对象的序列化
对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。
序列化是RMI(Remote Method Invoke - 远程方法调用) 过程的参数和返回值都必须实现的机制,而RMI是javaEE的举出。因此序列化机制是JAVAEE平台的基础。
如果需要让某一个对象支持序列化机制,则必须让该类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
--Serializable
--Externalizable
1.2 使用对象流序列化对象
* 若某个类实现了Serializable 接口,该类的对象就是可序列化的:
--创建一个ObjectOutputStream
-- 调用ObjectOutputStream 对象的writeObject()方法输出可序列对象
* 反序列化
--创建一个ObjectInputStream
--调用readObject()方法读取对象
注意:如果某个类的字段不是基本数据类型或String类型,而是另一个引用类型,那么这个引用类型必须也是可序列化的,否则拥有该类性的Field 的类也不能序列化。
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import org.junit.Test;
public class IOTest2 {
@Test
public void test() throws IOException{
//指定输出目标文件,创建输出流
OutputStream out = new FileOutputStream("person.txt");
//创建对象输出流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
//创建要输出对象
Object object = new Person("Tom",24);
//调用对象输出流的writeObject(Object obj)方法,输出序列化对象
objectOutputStream.writeObject(object);
//关闭流
out.close();
objectOutputStream.close();
}
@Test
public void test2() throws IOException, ClassNotFoundException{
//指定序列化对象在硬盘上的存储文件,创建输入流
InputStream in = new FileInputStream("person.txt");
//创建对象输入流
ObjectInputStream objectInputStream = new ObjectInputStream(in);
//调用对象输入流的readObject()方法,读入对象(反序列化操作)
Object obj = objectInputStream.readObject();
//显式读入的对象
System.out.println(obj);
//关闭流
in.close();
objectInputStream.close();
}
}
创建Personl类,实现Serializable接口
package test;
import java.io.Serializable;
public class Person implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
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 Person(){}
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person=[name =" +name +", age ="+ age +" ]";
}
}
-------------------------------------------------------------------------------------------------------------------
RandomAccessFile类
-- RndomAccessFile类既可以读取文件内容,也可以向文件输出数据
-- RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读写文件
--支持只访问文件的部分内容
--可以向已经存在的文件后追加内容
--RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile类可以自由的移动记录指针:
-- long getFilePoint() :获取文件记录指针的当前位置
-- void seek(long pos) :将文件记录指针定位到pos位置
-- 创建RandomAccessFile类可以指定一个mode参数,该参数指定R俺都没AccessFile的访问模式:
-- r :以只读方式打开
-- rw :以读写方式打开
下面举例说明RandomAccessFile类的使用:
demo.txt 内容:
1234567890
java
hello world
abcdefghijklmnop
代码:
package test;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.junit.Test;
public class IOTest3 {
/*
* 在demo.txt文件中的第二行写入数据:"I lOVE YOU",不能覆盖原有数据
*/
@Test
public void test1() throws IOException{
//创建RandomAccessFile对象
RandomAccessFile random = new RandomAccessFile("demo.txt", "rw");
//先读取一行
String line = random.readLine();
//将剩余内容读入byte数组中
byte[] buffer = new byte[(int) (random.length()-line.length())];
random.read(buffer);
//将指针移回第一行结束位置
random.seek(line.length());
//写入数据
random.writeBytes("\nI LOVE YOU\n");
//将buffer中缓存的数据写入
random.write(buffer);
//关闭流
random.close();
}
}
运行完之后的demo.txt内容:
1234567890
I LOVE YOU
java
hello world
abcdefghijklmnop