Java Tutorial/File/RandomAccessFile
Содержание
- 1 Appending data to existing file
- 2 Employs RandomAccessFile to store ints and changes the value of the third int.
- 3 Getting FileChannel from RandomAccessFile
- 4 RandomAccessFile Introduction
- 5 Seek in RandomAccessFile
- 6 Test file pointer manipulation between FileChannel and RandomAccessFile objects.
- 7 Use RandomAccessFile to reverse a file
- 8 Use RandomAccessFile to save and read
- 9 Write int to RandomAccessFile using FileChannel
Appending data to existing file
<source lang="java">
import java.io.File; import java.io.RandomAccessFile; public class Main {
public static void append(String fileName, String text) throws Exception { File f = new File(fileName); long fileLength = f.length(); RandomAccessFile raf = new RandomAccessFile(f, "rw"); raf.seek(fileLength); raf.writeBytes(text); raf.close(); } public static void append(String fileName, byte[] bytes) throws Exception { File f = new File(fileName); long fileLength = f.length(); RandomAccessFile raf = new RandomAccessFile(f, "rw"); raf.seek(fileLength); raf.write(bytes); raf.close(); } public static void main(String[] args) throws Exception { append("c:\\tmp.txt", "Appended Data"); append("c:\\tmp.bin", "Appended Data".getBytes()); }
}</source>
Employs RandomAccessFile to store ints and changes the value of the third int.
<source lang="java">
import java.io.IOException; import java.io.RandomAccessFile; public class MainClass {
public static void main(String[] args) { try { RandomAccessFile raf = new RandomAccessFile("c:\\temp\\RAFsample.txt", "rw"); raf.writeInt(10); raf.writeInt(43); raf.writeInt(88); raf.writeInt(455); // change the 3rd integer from 88 to 99 raf.seek((3 - 1) * 4); raf.writeInt(99); raf.seek(0); // go to the first integer int i = raf.readInt(); while (i != -1) { System.out.println(i); i = raf.readInt(); } raf.close(); } catch (IOException e) { } }
}</source>
Getting FileChannel from RandomAccessFile
<source lang="java">
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class MainClass {
private static final int BSIZE = 1024; public static void main(String[] args) throws Exception { FileChannel fc = new RandomAccessFile("data.txt", "rw").getChannel(); fc.position(fc.size()); fc.write(ByteBuffer.wrap("Some more".getBytes())); fc.close(); }
}</source>
RandomAccessFile Introduction
- A RandomAccessFile employs an internal pointer that points to the next byte to read.
- This pointer is zero-based and the first byte is indicated by index 0.
- When first created, a RandomAccessFile points to the first byte.
- You can change the pointer"s position by invoking the seek method.
- The skipBytes method moves the pointer by the specified number of bytes.
- If skipping offset number of bytes would pass the end of file, the internal pointer will only move to as much as the end of file.
- The skipBytes method returns the actual number of bytes skipped.
When opening a file using a RandomAccessFile, you can choose whether to open it read-only or read write.
<source lang="java">
public RandomAccessFile (File file, String mode) throws FileNotFoundException public RandomAccessFile (String filePath, String mode) throws FileNotFoundException</source>
Seek in RandomAccessFile
<source lang="java">
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class MainClass {
public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile(new File("temp.tmp"), "rw"); raf.writeInt(1); for (int i = 0; i < 10; i++) { raf.seek(raf.length() - 4); raf.writeInt(raf.readInt()); } raf.close(); }
}</source>
Test file pointer manipulation between FileChannel and RandomAccessFile objects.
<source lang="java">
import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; public class MainClass {
public static void main(String[] argv) throws IOException { RandomAccessFile randomAccessFile = new RandomAccessFile("test.dat", "r"); randomAccessFile.seek(1000); FileChannel fileChannel = randomAccessFile.getChannel(); // This will print "1000" System.out.println("file pos: " + fileChannel.position()); randomAccessFile.seek(500); // This will print "500" System.out.println("file pos: " + fileChannel.position()); fileChannel.position(200); // This will print "200" System.out.println("file pos: " + randomAccessFile.getFilePointer()); }
}</source>
Use RandomAccessFile to reverse a file
<source lang="java">
import java.io.RandomAccessFile; public class Main {
public static void main(String[] argv) throws Exception { RandomAccessFile raf = new RandomAccessFile("a.dat", "rw"); int x, y; for (long i = 0, j = raf.length() - 1; i < j; i++, j--) { raf.seek(i); x = raf.read(); raf.seek(j); y = raf.read(); raf.seek(j); raf.write(x); raf.seek(i); raf.write(y); } raf.close(); }
}</source>
Use RandomAccessFile to save and read
<source lang="java">
import java.io.IOException; import java.io.RandomAccessFile; public class MainClass {
public static void main(String[] args) throws IOException { RandomAccessFile rf = new RandomAccessFile("test.dat", "rw"); for (int i = 0; i < 10; i++) rf.writeDouble(i * 1.414); rf.close(); rf = new RandomAccessFile("test.dat", "rw"); rf.seek(5 * 8); rf.writeDouble(47.0001); rf.close(); rf = new RandomAccessFile("test.dat", "r"); for (int i = 0; i < 10; i++) System.out.println("Value " + i + ": " + rf.readDouble()); rf.close(); }
}</source>
Write int to RandomAccessFile using FileChannel
<source lang="java">
import java.io.IOException; import java.io.RandomAccessFile; import java.nio.IntBuffer; import java.nio.channels.FileChannel; public class MainClass {
public static void main(String[] args) throws IOException { FileChannel fc = new RandomAccessFile("temp.tmp", "rw").getChannel(); IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer(); for (int i = 0; i < 10; i++) ib.put(i); fc.close(); }
}</source>