快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京_龟发之家论坛



RandomAccessFile

RandomAccessFile 是随机造访文件(包括读/写)的类。它支持对文件随机造访的读取和写入,即我们可以从指定的位置读取/写入文件数据。

必要留意的是,RandomAccessFile 虽然属于java.io包,但它不是InputStream或者OutputStream的子类;它也不合于FileInputStream和FileOutputStream。 FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;然则,RandomAccessFile 同时支持文件的读和写,并且它支持随机造访。

RandomAccessFile 函数列表

RandomAccessFile(File file, String mode)

RandomAccessFile(String fileName, String mode)

voidclose()synchronized final FileChannelgetC澳门新葡新京hannel()

final FileDescriptorgetFD()longgetFilePointer()

longlength()intread(byte[] buffer, int byteOffset, int byteCount)

intread(byte[] buffer)intread()

final booleanreadBoolean()final bytereadByt澳门新葡新京e()

final charreadChar()final doublereadDouble()

final floatreadFloat()final voidreadFully(byte[] dst)

final voidreadFully(byte[] dst, int offset, int byteCount)final intreadInt()

final StringreadLine()final longreadLong()

final shortreadShort()final StringreadUTF()

final intreadUnsignedByte()final intreadUnsignedShort()

voidseek(long offset)voidsetLength(long newLength)

intskipBytes(int count)voidwrite(int oneByte)

voidwrite(byte[] buffer, int byteOffset, int byteCount)voidwrite(byte[] buffer)

final voidwriteBoolean(boolean val)final voidwriteByte(int val)

final voidwriteBytes(String str)final voidwriteChar(int val)

final voidwriteChars(String str)final voidwriteDouble(double val)

final voidwriteFloat(float val)final voidwriteInt(int val)

final voidwriteLong(long val)final voidwriteShort(int val)

final voidwriteUTF(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. 演示法度榜样

源码如下:

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工具File file = new File(FileName);

// 创建文件“file.txt”对应的RandomAccessFile工具RandomAccessFile raf = new RandomAccessFile澳门新葡新京(file, "rw");

// 获取文件长度

long fileLen = raf.length();// 将位置定位到“文件末端”

raf.seek(fileLen);

// 以下向raf文件中写数据raf.writeBoolean(true); // 占1个字节

raf.writeByte(0x41);// 占1个字节raf.writeChar('a');// 占2个字节

raf.writeShort(0x3c3c); // 占2个字节raf.writeInt(0x75);// 占4个字节

raf.writeLong(0x1234567890123456L); // 占8个字节raf.writeFloat(4.7f);// 占4个字节

raf.writeDouble(8.256);// 占8个字节raf.writeUTF("UTF严"); // UTF-8款式写入

raf.writeChar('\n');// 占2个字符。“换行符”

raf.close();} catch(IOException e) {

e.printStackTrace();}

}

/奸淫 经由过程RandomAccessFile读取文件

*/private static void testRead() {

try {// 创建文件“file.txt”对应File工具

File file = new File(FileName);// 创建文件“file.txt”对应的RandomAccessFile工具,以只读要领打开

RandomAccessFile raf = new RandomAccessFile(file, "r");

// 读取一个字符char c1 = raf.readChar();

System.out.println("c1="+c1);// 读取一个字符

char c2 = raf.readChar();System.out.println("c2="+c2);

// 跳过54个字节。

raf.seek(54);

// 测试read(byte[] buffer, int byteOffset, int byteCount)byte[] buf = new byte[20];

raf.read(buf, 0, buf.length);System.out.println("buf="+(new String(buf)));

raf.close();澳门新葡新京

} catch(IOException e) {e.printStackTrace();

}}

}

运行结果:

c1=a

c2=b

buf=9876543210

结果阐明:

法度榜样会在源文件所在目录天生file.txt;file.txt的内容如下:

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

您可能还会对下面的文章感兴趣: