首页 > 代码库 > RandomAccessFile

RandomAccessFile

RandomAccessFile 是不属于 InputStream 和 OutputStream 类系的既可以输入也可以输出),它的唯一父类是 Object

RandomAccessFile 类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件(其实我更愿意叫它“随意访问”)
----支持只访问文件的部分内容
----可以向已存在的文件后追加内容

RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos位置

创建 RandomAccessFile 类实例需要指定一个 mode参数,该参数指定 RandomAccessFile 的访问模式:
r:以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入,同步文件内容的更新
rws:打开以便读取和写入,同步文件内容和元数据的更新

JDK 1.4后很多 RandomAccessFile 的功能被转到“内存映射文件”里了,可以考虑使用 memory-mapped files 

下面举例说明(注意:直接在指针后 write 将会是覆盖操作,这里只演示插入操作)
  1. // 文本文件的复制(实现读写)
  2. @Test
  3. public void test1() {
  4. RandomAccessFile rafin = null;
  5. RandomAccessFile rafout = null;
  6. try {
  7. rafin = new RandomAccessFile("C:/Users/59929/Desktop/test1.txt", "r");
  8. rafout = new RandomAccessFile("C:/Users/59929/Documents/test.txt", "rw");
  9. int len;
  10. byte[] b = new byte[1024];
  11. while ((len = rafin.read(b)) != -1) {
  12. rafout.write(b, 0, len);
  13. }
  14. } catch (FileNotFoundException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (rafout != null) {
  20. try {
  21. rafout.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. if (rafin != null) {
  27. try {
  28. rafin.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. // 实现文本文件的插入操作
  36. @Test
  37. public void test2() {
  38. RandomAccessFile raf = null;
  39. try {
  40. raf = new RandomAccessFile("C:/Users/59929/Desktop/test2.txt", "rw");
  41. System.out.println("现在指针位置为:" + raf.getFilePointer());
  42. raf.seek(16);
  43. System.out.println("移到要修改的位置,现在指针位置为:" + raf.getFilePointer());
  44. int len;
  45. byte[] b = new byte[10];
  46. StringBuffer sb = new StringBuffer();
  47. while ((len = raf.read(b)) != -1) {
  48. sb.append(new String(b, 0, len));
  49. }
  50. System.out.println("读完后现在指针位置为:" + raf.getFilePointer());
  51. raf.seek(16);
  52. System.out.println("再次移到要修改的位置,现在指针位置为:" + raf.getFilePointer());
  53. raf.write("c".getBytes());
  54. raf.write(sb.toString().getBytes());
  55. } catch (FileNotFoundException e) {
  56. e.printStackTrace();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. } finally {
  60. if (raf != null) {
  61. try {
  62. raf.close();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. }

RandomAccessFile