文件指针操作
文件指针操作
1. getFilePointer方法
RandomAccessFile的读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。
RandomAccessFile提供了一个可以获取当前指针位置的方法:
long getFilePointer()
RandomAccessFile在创建时默认指向文件开始(第一个字节),通过getFilePointer方法获取指针位置时值是"0"。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”); System.out.println(raf.getFilePointer());//0 raf.write(‘A’);//写出一个字节后,指针自动向后移动到下一个字节位置 System.out.println(raf.getFilePointer());//1 raf.writeInt(3); System.out.println(raf.getFilePointer());//5 raf.close();
2. seek方法
RandomAccessFile的提供了一个方法用于移动指针位置。
void seek(long pos)
使用该方法可以移动指针到指定位置。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”); System.out.println(raf.getFilePointer());//0 raf.write(‘A’);//指针位置1 raf.writeInt(3);//指针位置5 raf.seek(0);//将指针移动到文件开始处(第一个字节的位置) System.out.println(raf.getFilePointer());//0 raf.close();
3. skipBytes方法
RandomAccessFile的提供了一个方法可以尝试跳过输入的 n 个字节以丢弃跳过的字节,方法定义为:
int skipBytes(int n)
该方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过n个字节之前已到达文件的末尾只是其中的一种可能。此方法不抛出 EOFException。返回跳过的实际字节数。如果 n 为负数,则不跳过任何字节。
/** * 获取游标位置以及对基本类型进行操作的方法 * @author Administrator * */ class TestRandomAccessFileDemo{ public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile("data.bat", "rw"); raf.write('a'); // 写一个字节 //将int最大值写入文件 raf.writeInt(Integer.MAX_VALUE); raf.writeDouble(3.141592612); System.out.println(raf.getFilePointer());//13 /* * RandomAccessFile 提供一个写字符串的方法 * 使UTF-8编码将字符串转换为字节后写出 * void writeUTF(String str) */ String str ="你好啊"; //24 UTF-8 多写两个字节 raf.writeUTF(str); } }
class TestRandomAccessFileDemo7{ public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile("data.bat", "r"); int d = raf.read(); char c= (char)d; System.out.println(c);//a System.out.println(raf.getFilePointer());//1 /* * int readInt() * 连续读取4个字节,并转换为对应的int值 */ int max =raf.readInt(); System.out.println(max);//Integer.MAX_VALUE 2147483647 System.out.println(raf.getFilePointer()); //5 //跳过double 8字节 raf.seek(13); String str =raf.readUTF(); System.out.println(str);//你好啊 //读取double的内容 raf.seek(5); double dou = raf.readDouble(); System.out.println(dou); } }
class TestRandomAccessFile8{ public static void main(String[] args) throws IOException { /* * 写之前先将游标移动到文件末尾在进行写操作 * 这样就是追加内容 */ RandomAccessFile raf= new RandomAccessFile("append.txt", "rw"); /* * RandomAccessFile 同样支持Length * 用于获取文件的字节量 */ raf.skipBytes(20); //跳过下面20个 raf.seek(raf.length()); raf.write("药".getBytes("UTF-8")); raf.close(); } }