java io进修(二十五) RandomAccessFile
副标题#e#
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)”,“数据拥有者”,“数据拥有群组”,“会见权限”等等。
#p#副标题#e#
(02) "rw", "rws", "rwd" 的区别。
当操纵的文件是存储在当地的基本存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 而且 操纵的是基本存储设备上的文件;那么,每次“变动文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,城市将这些改变同步到基本存储设备上。
当模式是 "rwd" 而且 操纵的是基本存储设备上的文件;那么,每次“变动文件内容[如write()写入数据]”时,城市将这些改变同步到基本存储设备上。
当模式是 "rw" 而且 操纵的是基本存储设备上的文件;那么,封锁文件时,会将“文件内容的修改”同步到基本存储设备上。至于,“变动文件内容”时,是否会当即同步,取决于系统底层实现。
2. 演示措施
源码如下:
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintStream;;
import java.io.RandomAccessFile;
import java.io.IOException;/**
* RandomAccessFile 测试措施
*
* 运行功效(输出如下):
* c1=a
* c2=b
* buf=9876543210
*
* 另外,
* (01) 在源文件地址目次生成了file.txt。
* (02) 留意RandomAccessFile写入boolean, byte, char, int,所占的字符个数。
*
* @author skywang
*/
public class RandomAccessFileTest {private static final String FileName = "file.txt";
public static void main(String[] args) {
// 若文件“file.txt”存在,则删除该文件。
File file = new File(FileName);
if (file.exists())
file.delete();testCreateWrite();
testAppendWrite();
testRead();
}/**
* 若“file.txt”不存在的话,则新建文件,并向文件中写入内容
*/
private static void testCreateWrite() {
try {
// 建设文件“file.txt”对应File工具
File file = new File(FileName);
// 建设文件“file.txt”对应的RandomAccessFile工具
RandomAccessFile raf = new RandomAccessFile(file, "rw");// 向“文件中”写入26个字母+回车
raf.writeChars("abcdefghijklmnopqrstuvwxyz\n");
// 向“文件中”写入"9876543210"+回车
raf.writeChars("9876543210\n");raf.close();
} catch(IOException e) {
e.printStackTrace();
}
}/**
* 向文件末端追加内容
*/
private static void testAppendWrite() {
try {
// 建设文件“file.txt”对应File工具
// 查察本栏目运行功效:
c1=a
c2=b
buf=9876543210
功效说明:
措施会在源文件地址目次生成file.txt;file.txt的内容如下:
file.txt对应的16进制内容如下:
来历:http://www.cnblogs.com/skywang12345/p/io_26.html