Using FileChannel to random access to a File : FileChannel « File « Java Tutorial






import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.LongBuffer;
import java.nio.channels.FileChannel;

public class MainClass {
  public static void main(String[] args) throws Exception {
    createFile();

    File aFile = new File("C:/primes.bin");
    FileInputStream inFile = new FileInputStream(aFile);

    FileChannel inChannel = inFile.getChannel();

    final int PRIMESREQUIRED = 10;
    ByteBuffer buf = ByteBuffer.allocate(8 * PRIMESREQUIRED);

    long[] primes = new long[PRIMESREQUIRED];
    int index = 0; // Position for a prime in the file

    // Count of primes in the file
    final int PRIMECOUNT = (int) inChannel.size() / 8;

    // Read the number of random primes required
    for (int i = 0; i < PRIMESREQUIRED; i++) {
      index = 8 * (int) (PRIMECOUNT * Math.random());
      inChannel.read(buf, index); // Read the value
      buf.flip();
      primes[i] = buf.getLong(); // Save it in the array
      buf.clear();
    }

    for (long prime : primes) {
      System.out.printf("%12d", prime);
    }
    inFile.close(); // Close the file and the channel

  }

  private static void createFile() throws Exception {
    long[] primes = new long[] { 1, 2, 3, 5, 7 };
    File aFile = new File("C:/primes.bin");
    FileOutputStream outputFile = new FileOutputStream(aFile);
    FileChannel file = outputFile.getChannel();
    final int BUFFERSIZE = 100;
    ByteBuffer buf = ByteBuffer.allocate(BUFFERSIZE);
    LongBuffer longBuf = buf.asLongBuffer();
    int primesWritten = 0;
    while (primesWritten < primes.length) {
      longBuf.put(primes, primesWritten, min(longBuf.capacity(), primes.length - primesWritten));
      buf.limit(8 * longBuf.position());

      file.write(buf);
      primesWritten += longBuf.position();
      longBuf.clear();
      buf.clear();
    }
    System.out.println("File written is " + file.size() + "bytes.");
    outputFile.close();
  }

  private static int min(int a, int b) {
    if (a > b) {
      return b;
    } else {
      return a;
    }

  }
}
File written is 40bytes.
           3           5           1           7           7           5           7           1           7           1








11.51.FileChannel
11.51.1.Get FileChannel from FileInputStream
11.51.2.Using FileChannel to read text file
11.51.3.Using FileChannel to random access to a File
11.51.4.Writing and Appending a ByteBuffer to a File
11.51.5.A channel for a physical file
11.51.6.Using a Channel to Write a String to a File
11.51.7.Writing a String as Bytes
11.51.8.Writing Varying Length Strings to a File
11.51.9.Writing Numerical Data to a File
11.51.10.Writing Mixed Data to a File
11.51.11.The Gathering Write
11.51.12.Copying Files using FileChannel
11.51.13.New IO Copier
11.51.14.New IO Duplicator
11.51.15.Locking Copier
11.51.16.File concatenation based on new IO
11.51.17.New IO Transfer
11.51.18.Save and read text using FileChannel with UTF-16BE encoding
11.51.19.Save and read text using FileChannel without encoding
11.51.20.Using transferTo() between channels
11.51.21.Test overlapping locks on different file channels
11.51.22.Lock a FileChannel and release the lock
11.51.23.Create a read-only memory-mapped file
11.51.24.Create a read-write memory-mapped file
11.51.25.Copying a file using channels and buffers