随机文件读写 序列化

序列化读取存储(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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值