知识点:RandomAccessFile (随机访问文件)类

(一)描述

前一篇博客中https://www.cnblogs.com/shuaifing/p/11490160.html,主要描述FileInputStream/FileOutPutStream、FileReader/FileWriter、BufferedInputStream/BufferedOutputStream、BufferedReader/BufferedWriter的使用,文件时,都是从文件的开头写入数据,第二次执行写操作时,会覆盖文件之前的内容,那么如果我们想,在访问一个文件时,在某个指定的位置写入数据,可以使用RandomAccessFile(随机访问文件)类。

RandomAccessFile(String name,String mode):name为文件名,model操作模式

“r” : 只读

“rw” : 读写,支持文件读取或者写入,文件不存在,创建

“rws” : s为synchronous 同步 (每次同步更新到潜在的设备中去),更新文件内容而且更新元数据(metadata),因此至少要求1次低级别的I/O操作

“rwd” : 每次同步更新到潜在的设备中去

(二)实例

(1)在文本的一行中的,某个位置插入字符串

文本文档test6.txt

//文本文档,中hello后面加上ab字符串
@Test
public void testRandomAccessFileInsertLine(){
RandomAccessFile raf2=null;
try {
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
//插入 ab
raf2.seek(5);//指针指向5的位置
String str= raf2.readLine();//读取文本的5位置开始第一行数据,指针指向第一行数据的末尾
raf2.seek(5);//指针从新指向5的位置
raf2.write("ab".getBytes());//在5的位置写入ab字符串
raf2.write(str.getBytes());//在ab字符串后面写入之前读取的第一行后面的数据
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
} 结果:
如果文本中有多行数据,则会显现问题如下
原文本内容:
执行代码后:

(2)在文本文档中的,任意一行的某个位置插入字符串

//文本文档,任意一行的某个位置插入字符串
@Test
public void testRandomAccessFileInsertAll(){
RandomAccessFile raf2=null;
try {
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
//插入 ab
raf2.seek(5);//指针指向位置5
byte[] b=new byte[20];
int len;
StringBuffer sb=new StringBuffer();//指针5位置后面的数据存放到 sb中
if((len = raf2.read(b))!=-1){
sb.append(new String(b,0,len));
}
raf2.seek(5);//指针从新指向5的位置
raf2.write("ab".getBytes());//在5的位置写入ab字符串
raf2.write(sb.toString().getBytes());//将存放到sb中的数据写入文本文件中
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

效果:

(3)文件复制

//文件读写
@Test
public void testRandomAccessFile1(){
RandomAccessFile raf1=null;
RandomAccessFile raf2=null;
try {
raf1=new RandomAccessFile(new File("E:/test/io/test.txt"),"r");
raf2=new RandomAccessFile(new File("E:/test/io/test6.txt"),"rw");
byte[] b=new byte[10];
int len;
while((len=raf1.read(b))!=-1){
raf2.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(raf2!=null) {
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf1!=null) {
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

java中的io流总结(二)——RandomAccessFile类的更多相关文章

  1. Java中的IO流(二)

    上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...

  2. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  3. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  4. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  5. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  6. Java中的IO流(四)

    上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...

  7. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  8. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  9. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  10. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

随机推荐

  1. 如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture

    如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture [困扰?疑问?]: 您是否正受到:如何将网页保存为图片的困扰?网页很高很长截图截不全 ...

  2. MATLAB知识-解决因缺少libsvm 而运行出现Y must be a vector or a character array.

    matlab版本R2014b 最近运行一个使用svmtrain的程序,出现以下错误: 这是因为是在设定路径里面没有libsvm.辛亏有一位师姐的电脑里面有libsvm的包,我直接用了,这样就不需要下载 ...

  3. vue 强制组件重新渲染

    参考链接:https://blog.csdn.net/zyx1303031629/article/details/86656785

  4. Vue Router路由管理器介绍

    参考博客:https://www.cnblogs.com/avon/p/5943008.html 安装介绍:Vue Router 版本说明 对于 TypeScript 用户来说,vue-router@ ...

  5. VBA来实现已存在的数据库,取得所有表的结构

    问题描述 用VBA来取出MySQL数据库中的所有表的结构后生成一个Excel的文档 首先创建MySQL的数据源,如何创建数据源在前章已经写过,之后把下面的信息填写上即可 在window7 64位系统上 ...

  6. gcc/clang编译带pthread.h头文件的源码时需要的参数

    今天敲了一个小程序,编译时出现错误:undefined reference pthread_create 原来由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a, ...

  7. webstorm对引入的css资源进行提示

  8. Redis 5.0.5 Install manual

    Redis 5.0.5 安装文档(Install manual) 一.单实例安装 标题 内容 测试环境 Centos 7 虚拟机 vbox redis版本 redis 5.0.5 1.编译安装redi ...

  9. java模拟from表单提交,上传图片

    /** * java上传表单,有图片 * @param urlStr 上传地址 * @param textMap 表单参数 * @param fileMap 文件参数 key:文件名称 value:文 ...

  10. linux破解navicat for mysql

    第一次执行start_navicat时,会在用户主目录下生成一个名为.navicat64的隐藏文件夹. cd ~/.navicat64 此文件夹下有一个system.reg文件 rm system.r ...