Java基础——输入/输出(三)
一.RandomAccessFile
RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,她既可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile支持“随机访问”的方式,程序可以直接转到任意位置来读写文件。
因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件部分内容,而不是全部,使用RandomAccessFile将是最好的选择。
RandomAccessFile对象也包括一个记录指针,用于标示当前读写处的位置,但程序创建了一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写n个总结后,文件指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针,既可以向前移动,也可以向后移动。
RandomAccessFile提供如下方法来操作文件记录指针:
long getFilePointer(); 返回文件记录指针的当前位置 void seek(long pos); 将文件记录指针定位到pos位置
下面程序使用RandomAccessFile来访问指定的中间部分数据
import java.io.*; public class RandomAccessFileTest { public static void main(String[] args) { try( RandomAccessFile raf = new RandomAccessFile( "src/RandomAccessFileTest.java" , "r")) { // 获取RandomAccessFile对象文件指针的位置,初始位置是0 System.out.println("RandomAccessFile的文件指针的初始位置:" + raf.getFilePointer()); // 移动raf的文件记录指针的位置 raf.seek(300); byte[] bbuf = new byte[1024]; // 用于保存实际读取的字节数 int hasRead = 0; // 使用循环来重复“取水”过程 while ((hasRead = raf.read(bbuf)) > 0 ) { // 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入! System.out.print(new String(bbuf , 0 , hasRead )); } } catch (IOException ex) { ex.printStackTrace(); } } }
运行结果:
RandomAccessFile的文件指针的初始位置:0 domAccessFile的文件指针的初始位置:" + raf.getFilePointer()); // 移动raf的文件记录指针的位置 raf.seek(300); byte[] bbuf = new byte[1024]; // 用于保存实际读取的字节数 int hasRead = 0; // 使用循环来重复“取水”过程 while ((hasRead = raf.read(bbuf)) > 0 ) { // 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入! System.out.print(new String(bbuf , 0 , hasRead )); } } catch (IOException ex) { ex.printStackTrace(); } } }