全职法师第二季3云一二季百度云百度免费的

RandomAccessFile(转) -
- ITeye技术网站
博客分类:
RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在API中关于RandomAccessFile的描述如下:
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针
输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开
始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer
方法读取,并通过 seek
方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException
(是一种 IOException
)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException
,而不是 EOFException
。需要特别指出的是,如果流已被关闭,则可能抛出 IOException
以下是两个RandomAccessFile的写入和读取的简单例子:
将字节流写入到磁盘中
private static void testCreateFile(){
String directory = “D:/program/test”;
String name = “t.gen”;
File f = new File(directory, name);
RandomAccessFile file =
file = new RandomAccessFile(f, “rw”);
byte[] b = {5,10,15,20};
//如果没有这行,文件也会生成,只是文件为空
file.write(b,0,4);
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
if (null!=file){
file.close();
} catch (IOException e) {
e.printStackTrace();
从磁盘文件中读取字节流
private static void testReadFile(){
String directory = “D:/program/luceneDemo3.0/test”;
String name = “t.gen”;
File f = new File(directory, name);
RandomAccessFile file =
file = new RandomAccessFile(f, “rw”);
byte[] b = new byte[4];
long len = file.length();
file.read(b);
//设置要读取的字节位置
file.seek(1);
System.out.println(file.readByte()+”&&FilePointer&&”+file.getFilePointer());
for (int i=0;i&b.i++){
System.out.println(“&&&”+b[i]);
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
if (null!=file){
file.close();
} catch (IOException e) {
e.printStackTrace();
这个类依我看来,用来处理字节流(byte)是很好的,如果用来处理字符(串)或其他数据类型,比如int、long,我试了感觉效果并不好,尤其是处理中文字符串的时候,那简直就是一个灾难,你会又碰上纠缠不清的乱码!
seek(long pos)方法
是在读取的时候用来设置读取到哪一个字节的,比如在例子中有5,10,15,20字节,在byte数组中分别对应0、1、2、3位置,同样在文件
file = new RandomAccessFile(f,
“rw”);中,也对应着0、1、2、3位置,所以如果设置file.seek(1);就表示通过file.readByte()读取的时候,读取的是第
1位置的数据,也就是10了。
getFilePointer()方法
在通过上面说的seek
(long pos)设置后,getFilePointer()得到的就是当前文件中的字节位置,也就是所说的偏移量了。比如在这个例子中,getFilePointer()的值就是1.
4、文件模式
“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
“rws” 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备。
关闭此随机访问文件流并释放与该流关联的所有系统资源。
FileChannel
getChannel
返回与此文件关联的唯一 FileChannel 对象。
FileDescriptor
返回与此流关联的不透明文件描述符对象。
getFilePointer
返回此文件中的当前偏移量。
返回此文件的长度。
从此文件中读取一个数据字节。
(byte[] b)
将最多 b.length 个数据字节从此文件读入 byte 数组。
(byte[] b, int off, int len)
将最多 len 个数据字节从此文件读入 byte 数组。
readBoolean
从此文件读取一个 boolean。
从此文件读取一个有符号的八位值。
从此文件读取一个字符。
readDouble
从此文件读取一个 double。
从此文件读取一个 float。
(byte[] b)
将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。
(byte[] b, int off, int len)
将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。
从此文件读取一个有符号的 32 位整数。
从此文件读取文本的下一行。
从此文件读取一个有符号的 64 位整数。
从此文件读取一个有符号的 16 位数。
readUnsignedByte
从此文件读取一个无符号的八位数。
readUnsignedShort
从此文件读取一个无符号的 16 位数。
从此文件读取一个字符串。
(long pos)
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
(long newLength)
设置此文件的长度。
尝试跳过输入的 n 个字节以丢弃跳过的字节。
(byte[] b)
将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
(byte[] b, int off, int len)
将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。
向此文件写入指定的字节。
writeBoolean
(boolean v)
按单字节值将 boolean 写入该文件。
按单字节值将 byte 写入该文件。
writeBytes
(String s)
按字节序列将该字符串写入该文件。
按双字节值将 char 写入该文件,先写高字节。
writeChars
(String s)
按字符序列将一个字符串写入该文件。
writeDouble
(double v)
使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。
writeFloat
使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。
按四个字节将 int 写入该文件,先写高字节。
按八个字节将 long 写入该文件,先写高字节。
writeShort
按两个字节将 short 写入该文件,先写高字节。
(String str)
使用 modified
UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
hybxiaodao
浏览: 194802 次
来自: 福州
[color=orange][/color][size=x-s ...
if(action.failureType == 'serve ...程序一:public class Test08 { public static void main(String[] args) throws Exception {
RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
int max=Integer.MAX_VALUE;
long lon=Long.MAX_VALUE;
raf.writeInt(max);
raf.seek(0);
System.out.println(raf.readInt());
System.out.println(raf.getFilePointer());
//插入代码raf.seek(4);
raf.writeLong(lon);
System.out.println(raf.readLong()); }}执行结果:4Exception in thread "main" java.io.EOFException at java.io.RandomAccessFile.readInt(Unknown Source) at java.io.RandomAccessFile.readLong(Unknown Source) at day06.Test08.main(Test08.java:23)程序二:public class Test08 { public static void main(String[] args) throws Exception {
RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
int max=Integer.MAX_VALUE;
long lon=Long.MAX_VALUE;
raf.writeInt(max);
raf.writeLong(lon);
raf.seek(0);
System.out.println(raf.readInt());
System.out.println(raf.getFilePointer());
System.out.println(raf.readLong()); }}结果:44775807两者只是
raf.writeLong(lon); 位置不同,为什么一个包异常,一个正常运行,程序一插入代码任有问题,这是为何啊?
问题出在readLong()和writeLong()这个两个方法,在JDK API文档中提到过readLong()方法会从当前指针位置开始向后面读取八个字节,如果在读取八个字节之前此文件已到达末尾会抛出EOFException异常。你第一个程序在使用writeLong()之后,文件指针指向了最后一位,此时你再使用readLong()就会在读取八位之前就到达文尾部。第二个程序没有报错是因为你在readLong()之前使用seek()把文件指针移动到了0号位置,此时再使用readLong()就能读完八个字节而不报错了。如果为题主解了惑的话,请采纳
已被提问者采纳
你还没有登录,请先登录或注册慕课网帐号
12371人关注
65276人关注
Copyright (C)
All Rights Reserved | 京ICP备 号-2

我要回帖

更多关于 全职法师第一季百度云 的文章

 

随机推荐