【IO】RandomAccessFile 迷南。 2022-05-31 07:27 205阅读 0赞 # 前言 # Github:[https://github.com/yihonglei/jdk-source-code-reading][https_github.com_yihonglei_jdk-source-code-reading](java-io) # 一 RandomAccessFile 概述 # RandomAccessFile允许随机读写文件操作,可以读取指定位置的内容,或在指定位置写入内容。 # 二 RandomAccessFile 使用分析 # **构造方法:** public RandomAccessFile(File file, String mode)throws FileNotFoundException; public RandomAccessFile(String name, String mode) throws FileNotFoundException; 通过构造器创建随机读写文件流,以供读写操作,但均需要设置模式,模式如下: r: 以只读方式打开指定文件,调用任何的写方法,都会抛出IOException; rw: 以读写方式打开指定文件,如果此文件不存在,则会自动创建; rws: 以读写方式打开,与"rw"一样,并对文件内容或元数据的每一次更新都同步写入底层存储设备; rwd: 以读写方式打开,与"rw"一样,并对文件内容的每一次更新都同步写入底层存储设备; **常用方法:** public int read() throws IOException; // 每次从流中读取一个字节。 public int read(byte\[\] b) throws IOException; // 将内容读取到一个byte数组之中。 public int read(byte\[\] b, int off, int len) throws IOException; // 将内容从off位置读取len长度存入缓冲字节数组中。 public void write(int b) throws IOException; // 每次写入一个字节到当前文件输出流中。 public void write(byte\[\] b) throws IOException; // 每次写入一个字节数组到当前文件输出流中。 public void write(byte\[\] b,int off,int len) throws IOException; // 每次写入指定字节数组长度到当前文件输出流中。 public void close() throws IOException; public void seek(long pos) throws IOException; public int skipBytes(int n) throws IOException; ...... 更多方法可以参考JDK API文档。 **随机读eg:** RandomAccessFile中的任何一个read()方法都可以读取RandomAccessFile的数据。 read()方法返回当前RandomAccessFile实例的文件指针指向的位置中包含的字节内容。 read()方法在读取完一个字节之后,会自动把指针移动到下一个可读字节。 这意味着使用者在调用完read()方法之后不需要手动移动文件指针。 package com.jpeony.io.charstream; import java.io.File; import java.io.RandomAccessFile; /** * @author yihonglei */ public class RandomAccessFileSimple { public static void main(String[] args) { File file = new File("C:\\mycode\\hello.txt"); /* * model各个参数详解 * r 代表以只读方式打开指定文件 * rw 以读写方式打开指定文件 * rws 读写方式打开,并对内容或元数据都同步写入底层存储设备 * rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备 */ try (java.io.RandomAccessFile raf = new java.io.RandomAccessFile(file, "r")) { //获取RandomAccessFile对象文件指针的位置,初始位置是0 System.out.println("RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); //移动文件指针位置 raf.seek(0); byte[] buff = new byte[1024]; //用于保存实际读取的字节数 int hasRead = 0; //循环读取 while ((hasRead = raf.read(buff)) > 0) { //打印读取的内容,并将字节转为字符串输入 System.out.println(new String(buff, 0, hasRead)); } } catch (Exception e) { e.printStackTrace(); } } } **随机写eg:** RandomAccessFile 中的任何一个 write() 方法都可以往 RandomAccessFile 中写入数据。 与 read() 方法类似,write() 方法在调用结束之后自动移动文件指针, 所以我们不需要频繁地把指针移动到下一个将要写入数据的位置。 package com.jpeony.io.random; import java.io.File; import java.io.RandomAccessFile; /** * @author yihonglei */ public class RandomAccessFileWriteSimple { public static void main(String[] args) { File file = new File("C:\\mycode\\hello.txt"); /* * model各个参数详解: * r 以只读方式打开指定文件,调用任何的写方法,都会抛出IOException; * rw 以读写方式打开指定文件,如果此文件不存在,则会自动创建; * rws 以读写方式打开,与"rw"一样,并对文件内容或元数据的每一次更新都同步写入底层存储设备; * rwd 以读写方式打开,与"rw"一样,并对文件内容的每一次更新都同步写入底层存储设备; */ try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) { /* ------------------写入数据-------------- */ String str = "Test random write!"; byte[] writeData = str.getBytes(); raf.write(writeData); /* -----------------读取数据--------------- */ // 获取RandomAccessFile对象文件指针的位置,默认初始位置是0 System.out.println("RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); // 设置文件指针偏移量,下一次读写时从该位置开始 raf.seek(0); // 用于保存实际读取的字节数 byte[] dataRead = new byte[1024]; int hasRead = 0; // 循环读取 while ((hasRead = raf.read(dataRead)) > 0) { // 打印读取的内容,并将字节转为字符串输入 System.out.println(new String(dataRead, 0, hasRead)); } } catch (Exception e) { e.printStackTrace(); } } } [https_github.com_yihonglei_jdk-source-code-reading]: https://github.com/yihonglei/jdk-source-code-reading
还没有评论,来说两句吧...