java学习————I/O流补充RandomAccessFile&序列化(Object)

RandomAccessFile

随机文件读写操作类,它是输入输出体系中功能最为全面的访问类。最大的特点是程序可以跳到任意地点来读写数据(虽说是随机文件读取,其实就是你不用如其他类一般的需要从头写或读,可以到指定的地点进行读写操作,一般是用在大型文件中插入数据),RandomAccessFile有一个类似指针的东西,当确定n个字节后,记录指针会后移n位,因此它能进行指定位置的读写操作。
注意: RandomAccessFile只能读写文件,不可以读写其他IO节点。未指定位置的情况下输入的数据会从头开始覆盖原数据。此类还可以通过多线程来进行多线的同时输入数据。
2个较为重要的类:

方法名方法的操作情况
getFilePointer()返回文件记录指针的当前位置
seek(long pos)将文件记录指针定位到pos的位置
length()返回文件的长度
read(xxx)可以直接读取,和规定byte数组缓存来读取,还可以指定起始结束来读取

RandomAccess的read方法有很多,深入学习建议可以看一看API文档

示例:

@Test			//要修改的文件路径,要修该的内容
public void show(String path ,String content){
	boolean state = INcontent(path,content,1000);//设定为boolean,值是为了判断有没有成功,成功方法中就会返回true
	System.out.println("插入有没有成功"+state);
}
	public boolean INcontent(String path ,String content,int pointer){//输入出入的文件,要插入的内容和插入的位置
		bollean flag = false;//设定为否,不成功直接返回
		/*
			RandomAccessFile(File f,String mode)
			第二个参数是来说明随机流的操作方式:  "rw","rws","rwd"
		*/
		try(RandomAccessFile raf = new RandomAccessFile(path , "rw")){//创建随机文件流的对象,操作
			raf.seek(pointer);//确定指针位置
			raf.write(content.getBytes());//将输入的String类型转为byte类型的(为了这样显示的内容正常)
			flag = true;//能够创建成功则为true;没有成功那么则try catch 在异常的地方会接着跳出进行异常提醒,不会进行异常下面的操作
		} catch(Exception e){
			e.printStackTrace();
		}
		return false;
	
	}

RandomAccessFile(File f/String name,String mode) 有四种模式:R,RW,RWD,RWS

r只读
rw读写
rwd模式可用于减少执行的I / O操作数
rws需要更新要写入的文件的内容及其元数据

序列化

java是面向对象的语言,所以也就会有存储转化对象状态的需求,而序列化就是将Java对象转换为字节的过程(进行打乱字节,保存为文件,进行加密),而反序列化就是将序列文件再转化为java对象。
序列化接口serializable,序列化必须要实现的接口(使用ObjectOutputStream,ObjectInputStream,ObjectOutput,ObjectInput)
使用场景:

  1. 再没有数据库时,将对象保存在文件中
  2. 要把内存中的对象写入硬盘时
  3. 可以保存后读取配置文件
  4. 网络传输对象时使用
    注意事项:
    序列对象状态而不管方法。父类实现序列化时子类自动实现

式例:

public void save(){
	System.out.println("使用序列化将对象保存");
	Person person =new Person(10,"sss","aaa",321,"便利啦");//随意创建一个实例对象
	//准备序列化对象,		方法返回boolean值来判断是否成功
	boolean state =saveObject(new Object() ,"文件目录");//传入要序列化的对象,还有要序列化到的文件目录
	System.out.println("是否成功"+state);
	System.out.println("============================================================");
	System.out.println("开始进行反序列化,转化为对象");
	Person person = (Person)readObject("这里要写反序列化后文件的目录及文件名");//读取后为Object类型,需要强转为Person类型
}
//反序列化(read)
public Object readObject(String FileName){
	Object obj = null;
	ObjectInputStream objIn=null;//不需要释放,所以可以将读取的方法的对象写入再try后用()括起来写
	try{
		objIn = new ObjectInptuStream(new FileInputStream(FileName));
		obj = objIn.readObject();
	}catch(Exception e){
		e.printStackTrace();
	}
	return obj;
}

public boolean saveObject(Object obj ,String FileName){
	boolean st = flase;
	if(null == obj){		//如果要序列化的对象为空,那么就没有序列化的必要了
		return flase;
	}
	//准备《《对象输出流》》
	ObjectOutPutStream objOut = null;//放在try catch 外以便随喜准备关闭对象流
	try{		//创建任何流的时候都可能产生异常,用try catch 抛出异常
		objOut = new ObjectOutPutStream(new FileOutPutStream(FileName));
		objOut.writeObject(Obj);//使用对象流,输出对象
		st=true;
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		try {
				objOut.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	return st;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值