本文主要介绍 RandomAccessFile。

转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_26.html

更多内容请参考:java io系列01之 "目录"

RandomAccessFile

RandomAccessFile 是随机访问文件(包括读/写)的类。它支持对文件随机访问的读取和写入,即我们可以从指定的位置读取/写入文件数据。
需要注意的是,RandomAccessFile 虽然属于java.io包,但它不是InputStream或者OutputStream的子类;它也不同于FileInputStream和FileOutputStream。 FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 同时支持文件的读和写,并且它支持随机访问。

RandomAccessFile 函数列表

  1. RandomAccessFile(File file, String mode)
  2. RandomAccessFile(String fileName, String mode)
  3.  
  4. void close()
  5. synchronized final FileChannel getChannel()
  6. final FileDescriptor getFD()
  7. long getFilePointer()
  8. long length()
  9. int read(byte[] buffer, int byteOffset, int byteCount)
  10. int read(byte[] buffer)
  11. int read()
  12. final boolean readBoolean()
  13. final byte readByte()
  14. final char readChar()
  15. final double readDouble()
  16. final float readFloat()
  17. final void readFully(byte[] dst)
  18. final void readFully(byte[] dst, int offset, int byteCount)
  19. final int readInt()
  20. final String readLine()
  21. final long readLong()
  22. final short readShort()
  23. final String readUTF()
  24. final int readUnsignedByte()
  25. final int readUnsignedShort()
  26. void seek(long offset)
  27. void setLength(long newLength)
  28. int skipBytes(int count)
  29. void write(int oneByte)
  30. void write(byte[] buffer, int byteOffset, int byteCount)
  31. void write(byte[] buffer)
  32. final void writeBoolean(boolean val)
  33. final void writeByte(int val)
  34. final void writeBytes(String str)
  35. final void writeChar(int val)
  36. final void writeChars(String str)
  37. final void writeDouble(double val)
  38. final void writeFloat(float val)
  39. final void writeInt(int val)
  40. final void writeLong(long val)
  41. final void writeShort(int val)
  42. final void writeUTF(String str)

1. RandomAccessFile 模式说明

RandomAccessFile共有4种模式:"r", "rw", "rws"和"rwd"。

  1. "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
  2. "rw" 打开以便读取和写入。
  3. "rws" 打开以便读取和写入。相对于 "rw""rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。
  4. "rwd" 打开以便读取和写入,相对于 "rw""rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。

说明
(01) 什么是“元数据”,即metadata?
英文解释如下:

  1. The definition of metadata is "data about other data." With a file system, the data is contained in its files and directories, and the metadata tracks information about each of these objects: Is it a regular file, a directory, or a link? What is its size, creation date, last modified date, file owner, group owner, and access permissions?

大致意思是:
metadata是“关于数据的数据”。在文件系统中,数据被包含在文件和文件夹中;metadata信息包括:“数据是一个文件,一个目录还是一个链接”,“数据的创建时间(简称ctime)”,“最后一次修改时间(简称mtime)”,“数据拥有者”,“数据拥有群组”,“访问权限”等等。

(02) "rw", "rws", "rwd" 的区别。
当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。
当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。
当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于系统底层实现。

2. 演示程序

源码如下

  1. import java.io.File;
  2. import java.io.FileDescriptor;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.BufferedInputStream;
  6. import java.io.BufferedOutputStream;
  7. import java.io.PrintStream;;
  8. import java.io.RandomAccessFile;
  9. import java.io.IOException;
  10.  
  11. /**
  12. * RandomAccessFile 测试程序
  13. *
  14. * 运行结果(输出如下):
  15. * c1=a
  16. * c2=b
  17. * buf=9876543210
  18. *
  19. * 此外,
  20. * (01) 在源文件所在目录生成了file.txt。
  21. * (02) 注意RandomAccessFile写入boolean, byte, char, int,所占的字符个数。
  22. *
  23. * @author skywang
  24. */
  25. public class RandomAccessFileTest {
  26.  
  27. private static final String FileName = "file.txt";
  28.  
  29. public static void main(String[] args) {
  30. // 若文件“file.txt”存在,则删除该文件。
  31. File file = new File(FileName);
  32. if (file.exists())
  33. file.delete();
  34.  
  35. testCreateWrite();
  36. testAppendWrite();
  37. testRead();
  38. }
  39.  
  40. /**
  41. * 若“file.txt”不存在的话,则新建文件,并向文件中写入内容
  42. */
  43. private static void testCreateWrite() {
  44. try {
  45. // 创建文件“file.txt”对应File对象
  46. File file = new File(FileName);
  47. // 创建文件“file.txt”对应的RandomAccessFile对象
  48. RandomAccessFile raf = new RandomAccessFile(file, "rw");
  49.  
  50. // 向“文件中”写入26个字母+回车
  51. raf.writeChars("abcdefghijklmnopqrstuvwxyz\n");
  52. // 向“文件中”写入"9876543210"+回车
  53. raf.writeChars("9876543210\n");
  54.  
  55. raf.close();
  56. } catch(IOException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60.  
  61. /**
  62. * 向文件末尾追加内容
  63. */
  64. private static void testAppendWrite() {
  65. try {
  66. // 创建文件“file.txt”对应File对象
  67. File file = new File(FileName);
  68. // 创建文件“file.txt”对应的RandomAccessFile对象
  69. RandomAccessFile raf = new RandomAccessFile(file, "rw");
  70.  
  71. // 获取文件长度
  72. long fileLen = raf.length();
  73. // 将位置定位到“文件末尾”
  74. raf.seek(fileLen);
  75.  
  76. // 以下向raf文件中写数据
  77. raf.writeBoolean(true); // 占1个字节
  78. raf.writeByte(0x41); // 占1个字节
  79. raf.writeChar('a'); // 占2个字节
  80. raf.writeShort(0x3c3c); // 占2个字节
  81. raf.writeInt(0x75); // 占4个字节
  82. raf.writeLong(0x1234567890123456L); // 占8个字节
  83. raf.writeFloat(4.7f); // 占4个字节
  84. raf.writeDouble(8.256);// 占8个字节
  85. raf.writeUTF("UTF严"); // UTF-8格式写入
  86. raf.writeChar('\n'); // 占2个字符。“换行符”
  87.  
  88. raf.close();
  89. } catch(IOException e) {
  90. e.printStackTrace();
  91. }
  92. }
  93.  
  94. /**
  95. * 通过RandomAccessFile读取文件
  96. */
  97. private static void testRead() {
  98. try {
  99. // 创建文件“file.txt”对应File对象
  100. File file = new File(FileName);
  101. // 创建文件“file.txt”对应的RandomAccessFile对象,以只读方式打开
  102. RandomAccessFile raf = new RandomAccessFile(file, "r");
  103.  
  104. // 读取一个字符
  105. char c1 = raf.readChar();
  106. System.out.println("c1="+c1);
  107. // 读取一个字符
  108. char c2 = raf.readChar();
  109. System.out.println("c2="+c2);
  110.  
  111. // 跳过54个字节。
  112. raf.seek(54);
  113.  
  114. // 测试read(byte[] buffer, int byteOffset, int byteCount)
  115. byte[] buf = new byte[20];
  116. raf.read(buf, 0, buf.length);
  117. System.out.println("buf="+(new String(buf)));
  118.  
  119. raf.close();
  120. } catch(IOException e) {
  121. e.printStackTrace();
  122. }
  123. }
  124. }

运行结果
c1=a
c2=b
buf=9876543210
结果说明
程序会在源文件所在目录生成file.txt;file.txt的内容如下:

file.txt对应的16进制内容如下:

java io系列26之 RandomAccessFile的更多相关文章

  1. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

  2. java io系列

    java io系列01之 "目录" java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream) java io系列03之 ...

  3. Java IO系列之一:IO

    1. 概述 Java IO一般包含两个部分: 1.java.io包中堵塞型IO: 2.java.nio包中的非堵塞型IO,通常称为New IO. java.io包下,分为四大块近80个类: 1.基于字 ...

  4. java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

    本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...

  5. java io系列07之 FileInputStream和FileOutputStream

    本章介绍FileInputStream 和 FileOutputStream 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_07.html File ...

  6. java io系列20之 PipedReader和PipedWriter

    本章,我们学习PipedReader和PipedWriter.它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信. PipedWriter 是字符管 ...

  7. java io系列16之 PrintStream(打印输出流)详解

    本章介绍PrintStream以及 它与DataOutputStream的区别.我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:htt ...

  8. java io系列06之 序列化总结(Serializable 和 Externalizable)

    本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...

  9. java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例

    本章介绍DataOutputStream.我们先对DataOutputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblog ...

随机推荐

  1. mysql 自带的性能压力测试工具

    mysqlslap -h127.0.0.1 -uroot -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate ...

  2. 使用ROME解析rss,如何获取icon图标

    问题 网站使用SpringMVC框架,实现了RSS订阅,但是在阅读器里面,只有网站的标题,没有网站的图标. 分析 ROME会从<channel>标签下指定的<link>地址中, ...

  3. POI如何自动调整Excel单元格中字体的大小

    问题 目的是要将Excel中的文字全部显示出来,可以设置对齐格式为[缩小字体填充],但是这样的话只能展示出一行数据,字体会变得很小.还有一种办法,设置对齐格式为[自动换行],然后让单元格中的字体自动调 ...

  4. Django 调用报错 " ImportError: Couldn't import Django. "

    系统炸了导致不得已重装 安装 Django后 利用ORM 创建表的时候报错 Traceback (most recent call last): File "manage.py", ...

  5. c# Redis 使用

    1.服务端两个版本窗口版与安装windows服务版 1.1.窗口版 下载地址:https://github.com/dmajkic/redis/downloads redis-server.exe:服 ...

  6. VS编译LESS插件

    1. LESS   用LESS写CSS可以用写程序代码的习惯写CSS.用了之后写CSS的效率会提高很多. 2.解释LESS 写出来的文件扩展名是.less,要运行的话,先解释成正常的CSS文件. 3. ...

  7. BZOJ3456 城市规划 【多项式求ln】

    题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...

  8. Postman的一个使用技巧----设置环境变量

    相同的api接口因为部署环境不同,分为test和pre_production 打开Postman,建两个测试集,分别测试测试环境test和演练环境pre_production 下面来介绍一下Postm ...

  9. redux源码解析-redux的架构

    redux很小的一个框架,是从flux演变过来的,尽管只有775行,但是它的功能很重要.react要应用于生成环境必须要用flux或者redux,redux是flux的进化产物,优于flux. 而且r ...

  10. Windows下安装flask虚拟环境

    前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...