java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 Java RandomAccessFile 指定位置实现文件读取与写入的相关资料, 需要的朋友可以参考下
RandomAccessFile 是属于随机读取类, 是可以对文件本身的内容直接随机进行操作的, 可以在文件的指定位置的读取和写入内容, 这在很多时候都是很方便的
RandomAccessFile 是用来访问那些保存数据记录的文件的, 你就可以用 seek( )方法来访问记录, 并进行读写了这些记录的大小不必相同; 但是其大小和位置必须是可知的但是该类仅限于操作文件
RandomAccessFile 不属于 InputStream 和 OutputStream 类系的实际上, 除了实现 DataInput 和 DataOutput 接口之外 (DataInputStream 和 DataOutputStream 也实现了这两个接口), 它和这两个类系毫不相干, 甚至不使用 InputStream 和 OutputStream 类中已经存在的任何功能; 它是一个完全独立的类, 所有方法(绝大多数都只属于它自己) 都是从零开始写的这可能是因为 RandomAccessFile 能在文件里面前后移动, 所以它的行为与其它的 I/O 类有些根本性的不同总而言之, 它是一个直接继承 Object 的, 独立的类
基本上, RandomAccessFile 的工作方式是, 把 DataInputStream 和 DataOutputStream 结合起来, 再加上它自己的一些方法, 比如定位用的 getFilePointer( ), 在文件里移动用的 seek( ), 以及判断文件大小的 length( )skipBytes()跳过多少字节数此外, 它的构造函数还要一个表示以只读方式 ("r"), 还是以读写方式("rw") 打开文件的参数 (和 C 的 fopen( )一模一样)它不支持只写文件
只有 RandomAccessFile 才有 seek 搜寻方法, 而这个方法也只适用于文件 BufferedInputStream 有一个 mark( )方法, 你可以用它来设定标记 (把结果保存在一个内部变量里), 然后再调用 reset( ) 返回这个位置, 但是它的功能太弱了, 而且也不怎么实用
实例代码:
- import java.io.IOException;
- import java.io.RandomAccessFile;
- /**
- * RandomAccessFile 是属于随机读取类, 是可以对文件本身的内容直接随机进行操作的, 就是说可以指定位置
- * 的读取和写入内容
- * @author andy
- *
- */
- public class RandomAccessFileTest {
- public static void main(String args[]) throws IOException {
- write();
- read();
- }
- public static void write() throws IOException {
- // 以读写的方式来访问该文件
- RandomAccessFile raf = new RandomAccessFile("D:\\test.txt", "rw");
- raf.writeBytes("Hello World!");
- raf.writeBoolean(true);
- raf.writeInt(30);
- raf.writeDouble(3.56);
- raf.close();
- }
- public static void read() throws IOException {
- RandomAccessFile raf = new RandomAccessFile("D:\\test.txt", "r");
- raf.seek(12);// 设置指针的位置
- boolean booleanValue = raf.readBoolean();
- int intValue = raf.readInt();
- double doubleValue = raf.readDouble();
- raf.seek(0);// 设置指针的位置为文件的开始部分
- byte[] bytes = new byte[12];
- for (int i=0; i<bytes.length; i++)
- bytes[i] = raf.readByte();// 每次读一个字节, 并把它赋值给字节 bytes[i]
- String stringValue = new String(bytes);
- raf.skipBytes(1);// 指针跳过一个字节
- int intValue2 = raf.readInt();
- raf.close();
- System.out.println(booleanValue);
- System.out.println(intValue);
- System.out.println(doubleValue);
- System.out.println(stringValue);
- System.out.println(intValue2);
- }
- }
来源: http://www.phperz.com/article/18/0219/358979.html