RandomAccessFile详解.doc_第1页
RandomAccessFile详解.doc_第2页
RandomAccessFile详解.doc_第3页
RandomAccessFile详解.doc_第4页
RandomAccessFile详解.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 RandomAccessFile1. RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它即可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile 支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读写数据。注意:“随机访问”错误的理解是:随机访问是具有不确定性的:具有一会儿访问这里、一会儿访问哪里的意思! RandomAccess的含义:应该是任意访问,而不是随机访问,也就是说RAM(随机存取存储器)是可以自由访问任意的存储点的存储器(与磁盘、磁带等需要寻道、倒带才可以访问指定存储点等存储器区分);而RandomAccessFile的含义是可以自由访问文件的任意地方(与InputStream、Reader需要依次向后读取区分),所以,RandomAccessFile的含义不是“随机访问”,而应该是“任意访问”。由于这个原因,如果我们希望只访问文件部分内容,而不是把文件从头到尾,使用RandomAccessFile将是更好的选择。2.RandomAccessFile类有两个构造器,其实两个构造器基本相同,只是指定文件的形式不同而已:一个使用String参数来指定文件名,一个使用File参数来指定文件本身。RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在API中关于RandomAccessFile的描述如下:此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException,文件结尾了还继续读文件,就导致这个错误抛出。本来EOF的数值就是-1,但是是一种用于错误标识的记号)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。以下是两个RandomAccessFile的写入和读取的简单例子:1、 将字节流写入到磁盘中private static void testCreateFile()String directory = “D:/program/test”;String name = “t.gen”;File f = new File(directory, name);RandomAccessFile file = null;try file = new RandomAccessFile(f, “rw”);byte b = 5,10,15,20;try /如果没有这行,文件也会生成,只是文件为空file.write(b,0,4); catch (IOException e) e.printStackTrace(); catch (FileNotFoundException e) e.printStackTrace();finallyif (null!=file)try file.close(); catch (IOException e) e.printStackTrace(); 2、 从磁盘文件中读取字节流private static void testReadFile()String directory = “D:/program/luceneDemo3.0/test”;String name = “t.gen”;File f = new File(directory, name);RandomAccessFile file = null;try file = new RandomAccessFile(f, “rw”);byte b = new byte4;try long len = file.length();file.read(b);/设置要读取的字节位置file.seek(1);System.out.println(file.readByte()+”FilePointer”+file.getFilePointer();for (int i=0;i”+bi); catch (IOException e) e.printStackTrace(); catch (FileNotFoundException e) e.printStackTrace();finallyif (null!=file)try file.close(); catch (IOException e) e.printStackTrace(); 输出结果:10FilePointer2 5 10 15 20说明:1、 这个类,用来处理字节流(byte)是很好的,如果用来处理字符(串)或其他数据类型,比如int、long,感觉效果并不好,尤其是处理中文字符串的时候,那简直就是一个灾难,你会又碰上纠缠不清的乱码!2、 seek(longpos)方法是在读取的时候用来设置读取到哪一个字节的,比如在例子中有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了。3、 getFilePointer()方法在通过上面说的seek(longpos)设置后,getFilePointer()得到的就是当前文件中的字节位置,也就是所说的偏移量了。比如在这个例子中,getFilePointer()的值就是1.4、文件访问模式“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。“rws” 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。“rwd” 打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备。附录:voidclose()关闭此随机访问文件流并释放与该流关联的所有系统资源。FileChannelgetChannel()返回与此文件关联的唯一 FileChannel 对象。FileDescriptorgetFD()返回与此流关联的不透明文件描述符对象。longgetFilePointer()返回此文件中的当前偏移量。longlength()返回此文件的长度。intread()从此文件中读取一个数据字节。intread(byteb)将最多 b.length 个数据字节从此文件读入 byte 数组。intread(byteb, intoff, intlen)将最多 len 个数据字节从此文件读入 byte 数组。booleanreadBoolean()从此文件读取一个 boolean。bytereadByte()从此文件读取一个有符号的八位值。charreadChar()从此文件读取一个字符。doublereadDouble()从此文件读取一个 double。floatreadFloat()从此文件读取一个 float。voidreadFully(byteb)将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。voidreadFully(byteb, intoff, intlen)将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。intreadInt()从此文件读取一个有符号的 32 位整数。StringreadLine()从此文件读取文本的下一行。longreadLong()从此文件读取一个有符号的 64 位整数。shortreadShort()从此文件读取一个有符号的 16 位数。intreadUnsignedByte()从此文件读取一个无符号的八位数。intreadUnsignedShort()从此文件读取一个无符号的 16 位数。StringreadUTF()从此文件读取一个字符串。voidseek(longpos)设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。voidsetLength(longnewLength)设置此文件的长度。intskipBytes(intn)尝试跳过输入的 n 个字节以丢弃跳过的字节。voidwrite(byteb)将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。voidwrite(byteb, intoff, intlen)将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。voidwrite(intb)向此文件写入指定的字节。voidwriteBoolean(booleanv)按单字节值将 boolean 写入该文件。voidwriteByte(intv)按单字节值将 byte 写入该文件。voidwriteBytes(String s)按字节序列将该字符串写入该文件。voidwriteChar(intv)按双字节值将 char 写入该文件,先写高字节。voidwriteChars(String s)按字符序列将一个字符串写入该文件。voidwriteDouble(doublev)使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。voidwriteFloat(floatv)使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论