RandomAccessFile类——高效快捷地读写文件

个人总结:

getFilePointer()和seek()方法是一个相同的指针

代码里的read()和write都会使这个指针移动

====================================================================

RandomAceessFile类

RandomAccessFile类是一个专门读写文件的类,封装了基本的IO流,在读写文件内容方面比常规IO流更方便、更灵活。但也仅限于读写文件,无法像IO流一样,可以传输内存和网络中的数据。

RandomAccessFile常用方法和使用方式

  • getFilePointer() :获取当前文件的记录指针位置
  • seek(long pos):把记录指针移到pos处
  • read()和write():读取内容和写入内容
  • readXxx()和writeXxx():用于处理各种值类型
  • writeBytes()和writeChars()可以写入字符串,编码不一致会造成乱码。所以推荐String.getBytes(),用write()来写入。

总体来说,如果只处理文件的话,使用RandomAccessFile很方便,而且读写方法和IO流都差不多,只是针对不同类型数据进行扩展,使用简单明了。最重要的就是该类的seek()方法,该方法可以指定读写的位置。还有该类构造器需要一个参数来确定使用什么模式。 

r:只读模式

rw:读写模式

rwd:和rw差不多,但需要对文件内容每个更新都进行同步。

代码示例:

(一)RandomAccessFile读取文件内容

        //rw : 设置模式为读写模式
        RandomAccessFile raf = new RandomAccessFile("D:\\reviewIO\\runtime.txt","rw");
        System.out.println("当前记录指针位置:" + raf.getFilePointer());
        byte[] buf = new byte[1024];
        int    len = 0;
        while((len = raf.read(buf)) != -1) {
            System.out.println(new String(buf));
        }

 

 

(二)RandomAccessFile写入数据到文件中

public class Test {
    public static void main(String[] args) throws IOException {
        //要读写的数据源
        File f = new File("D:\\reviewIO\\RandomAccessFileTest.txt");
        //键盘输入作为数据来源
        Scanner sc = new Scanner(System.in);
        //指定文件不存在就创建同名文件
        if(!f.exists())    f.createNewFile(); 
        
        //rw : 设为读写模式
        RandomAccessFile raf = new RandomAccessFile(f,"rw");
        System.out.println("当前记录指针位置:" + raf.getFilePointer());
        
        while(true) {
            String str = sc.next();
            raf.writeBytes(str);
            System.out.println("当前记录指针位置:" + raf.getFilePointer());
            //输入end结束循环
            if(str.equals("end")) break;
        }
        
    }
}

 

  • 使用小结:RandomAccessFile写入数据到文件中不会覆盖文件内容。只要程序每运行一次,该类的记录指针总是为0,这意味着从文件最前端开始读写,所以需要注意。

(三)RandomAccessFile的记录指针放在文件尾部,用于添加内容

 

public class Test {
    public static void main(String[] args) throws IOException {
        //读写的数据源
        File f = new File("D:\\reviewIO\\RAF.txt");
        //指定文件不存在就创建同名文件
        if(!f.exists())    f.createNewFile();         
        //rw : 设为读写模式
        RandomAccessFile raf = new RandomAccessFile(f,"rw");
        System.out.println("当前记录指针位置:" + raf.getFilePointer());
        //记录指针与文件内容长度相等
        raf.seek(raf.length());    
        System.out.println("当前文件长度:" + raf.length());
        //以字节形式写入字符串
        raf.write("ABCDEFG写入尾部".getBytes());
        System.out.println("当前记录指针位置:" + raf.getFilePointer());            
    }    
}
  • 使用小结:如果使用RandomAccessFile添加内容,要把记录指针设为同文件一样的长度,保证在文件的尾部进行写入数据。write()写入中文,使用String.getByte(),保证两者编码一致。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RandomAccessFile提供了一种方便的方式来进行分块和随机读写文件。下面是一个简单的示例,演示如何使用RandomAccessFile来实现这些功能: ```java import java.io.*; public class FileHandler { private static final int BLOCK_SIZE = 1024; // 分块大小 public static void main(String[] args) { try { // 创建一个RandomAccessFile对象,指定文件路径和读写模式 RandomAccessFile file = new RandomAccessFile("path/to/file.txt", "rw"); // 分块读取文件 byte[] buffer = new byte[BLOCK_SIZE]; long fileSize = file.length(); long blocks = (fileSize % BLOCK_SIZE == 0) ? fileSize / BLOCK_SIZE : fileSize / BLOCK_SIZE + 1; for (int i = 0; i < blocks; i++) { file.seek(i * BLOCK_SIZE); int bytesRead = file.read(buffer); // 处理读取到的数据 // ... } // 随机写入文件 String data = "Hello, World!"; long position = 100; // 要写入的位置 file.seek(position); file.write(data.getBytes()); // 关闭RandomAccessFile对象 file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们首先创建一个RandomAccessFile对象,指定文件路径和读写模式。然后,我们可以使用`seek()`方法将文件指针移动到指定位置,并使用`read()`方法读取指定大小的数据块。对于分块读取文件,我们可以使用一个循环来读取每个数据块。在随机写入文件时,我们可以使用`seek()`方法将文件指针移动到要写入的位置,并使用`write()`方法将数据写入文件。 需要注意的是,`seek()`方法用于设置文件指针的位置,`read()`方法用于从当前文件指针位置读取数据,`write()`方法用于在当前文件指针位置写入数据。在使用RandomAccessFile时,需要确保正确设置文件指针的位置,以便进行正确的读写操作。 希望这个示例对你有所帮助!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值