序列化读取存储(Serializable)
public class ObjectInputStream
extends InputStream implements ObjectInput, ObjectStreamConstants
public class ObjectOutputStream
extends OutputStream implements ObjectOutput, ObjectStreamConstants
类必须实现Serializable接口
```java
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
//序列化编号,也可以省略
public static long getSerialversionuid() {
return serialVersionUID;
}
private int id;
private String name;
private String sex;
private int age;
private String address;
//构造方法 getter setter省略
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class TestSerializable {
@Test
public void save() {
System.out.println("===========使用序列化将对象保存到文件===============");
Person person = new Person(1001, "zhangsan", "男", 18, "广东省广州市");
//序列化对象
boolean state = saveObject(person,"D:"+File.separator+"IO"+File.separator+"File"+File.separator+"person.data");
System.out.println("是否序列化成功:"+state);
System.out.println("==============使用序列化进行反序列化转换为对象==============");
Person per = (Person) readObject("D:"+File.separator+"IO"+File.separator+"File"+File.separator+"person.data");
System.out.println("用户ID:"+per.getId()+" ,姓名:"+per.getName());
}
private Object readObject(String fileName) {
Object obj = null;
try(ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(fileName))) {
//使用对象输入流,将文件序列化为对象
obj = objIn.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
private boolean saveObject(Object obj, String fileName) {
boolean state = false;
if(null==obj)
return false;
//准备对象输出流,将对象序列化
ObjectOutputStream objOut = null;
try {
objOut = new ObjectOutputStream(new FileOutputStream(fileName));
objOut.writeObject(obj); //使用对象输出流,输出对象
state = true;
} catch (Exception e) {
e.printStackTrace();
}finally { //finally 表示不管是否出现异常,finally中的内容都必须执行
try {
objOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return state;
}
}
随机文件读写
推荐阅读
https://blog.csdn.net/qq_31615049/article/details/88562892
Class RandomAccessFile
java.lang.Object
java.io.RandomAccessFile
All Implemented Interfaces:
Closeable , DataInput , DataOutput , AutoCloseable
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable
该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。
在这个类中的所有读取例程通常都是如果在读取所需的字节数之前到达文件结尾,则抛出一个EOFException (这是一种IOException )。 如果任何字节由于除文件末尾之外的任何原因而无法读取,则抛出IOException以外的EOFException 。 特别地,如果流已经被关闭,则可以抛出IOException 。
r | 以只读的方式打开文本,也就意味着不能用write来操作文件 |
rw | 读操作和写操作都是允许的 |
rws | 每当进行写操作,同步的刷新到磁盘,刷新内容和元数据 |
rwd | 每当进行写操作,同步的刷新到磁盘,刷新内容 |
https://blog.csdn.net/attilax/article/details/50881526
RandomAccessFile(File file, String mode)
创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。
RandomAccessFile(String name, String mode)
创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
import java.io.File;
import java.io.RandomAccessFile;
import org.junit.Test;
public class TestRandomIO {
//RandomAccessFile随机文件流读写操作(一般操作与大型文件,在其中插入一段内容)
@Test
public void show() {
String path = "D:\\IO\\File\\test.txt";
String content = "今天天气凉爽,适合泡吧\n";
boolean state = insertContent(path,content,1000);
System.out.println("是否插入内容成功:"+state);
}
private boolean insertContent(String path, String content, int pointer) {
boolean flag = false;
//第二个参数为:随机文件流的操作方式 只读 读写 只写方式
try(RandomAccessFile raf = new RandomAccessFile(path, "rw");) {
// File temp = File.createTempFile(String.valueOf(System.currentTimeMillis()),null);
// temp.deleteOnExit();
//设置插入位置
raf.seek(pointer);
raf.write(content.getBytes());
flag = true;
System.out.println("光标所在位置为:"+raf.getFilePointer());
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
}