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)
使用场景:
- 再没有数据库时,将对象保存在文件中
- 要把内存中的对象写入硬盘时
- 可以保存后读取配置文件
- 网络传输对象时使用
注意事项:
序列对象状态而不管方法。父类实现序列化时子类自动实现
式例:
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;
}