java io系列26之 RandomAccessFile

简介: 本文主要介绍 RandomAccessFile。 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_26.html 更多内容请参考:java io系列01之 "目录"   RandomAccessFile RandomAccessFile 是随机访问文件(包括读/写)的类。

本文主要介绍 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 函数列表

复制代码
RandomAccessFile(File file, String mode)
RandomAccessFile(String fileName, String mode)

void     close()
synchronized final FileChannel getChannel() final FileDescriptor getFD() long getFilePointer() long length() int read(byte[] buffer, int byteOffset, int byteCount) int read(byte[] buffer) int read() final boolean readBoolean() final byte readByte() final char readChar() final double readDouble() final float readFloat() final void readFully(byte[] dst) final void readFully(byte[] dst, int offset, int byteCount) final int readInt() final String readLine() final long readLong() final short readShort() final String readUTF() final int readUnsignedByte() final int readUnsignedShort() void seek(long offset) void setLength(long newLength) int skipBytes(int count) void write(int oneByte) void write(byte[] buffer, int byteOffset, int byteCount) void write(byte[] buffer) final void writeBoolean(boolean val) final void writeByte(int val) final void writeBytes(String str) final void writeChar(int val) final void writeChars(String str) final void writeDouble(double val) final void writeFloat(float val) final void writeInt(int val) final void writeLong(long val) final void writeShort(int val) final void writeUTF(String str)
复制代码

 

1. RandomAccessFile 模式说明

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

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

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

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进制内容如下:

 

相关文章
|
10月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
291 0
|
7月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
296 1
|
9月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
10月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
211 3
|
9月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
604 23
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
507 0
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
322 10
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
510 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)