package net.tools.random; import java.io.FileInputStream; import java.io.IOException; import java.nio.CharBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.ArrayList; import java.util.List; public class MemoryMappingReader { private String fileName; private List lines; public static void main(String s[]) { if (s.length != 1) { System.out.println("Usage: java MemoryMappingReader "); System.exit(1); } try { MemoryMappingReader mmr = new MemoryMappingReader(s[0]); mmr.load(); mmr.print(); } catch (Exception e) { e.printStackTrace(); } } public MemoryMappingReader(String fileName) { this.fileName = fileName; lines = new ArrayList(); } public void load() throws IOException { FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); MappedByteBuffer mbb = null; Charset cs = Charset.forName("ISO-8859-1"); CharsetDecoder decoder = cs.newDecoder(); StringBuilder sb = new StringBuilder(); long bs = 1024L; // block size long fs = fc.size(); // file size long t = 0L; // total size if (fs != 0) { while (t < fs) { if (t + bs > fs) { bs = fs - t; } mbb = fc.map(FileChannel.MapMode.READ_ONLY, t, bs); CharBuffer cb = decoder.decode(mbb); while (cb.hasRemaining()) { char c = cb.get(); if (c == '\n') { lines.add(sb.toString()); sb = new StringBuilder(); } else if (c == '\r') { // Windows continue; } else { sb.append(c); } } t += bs; } // The last line may not have ended with \n if (sb.length() > 0) { lines.add(sb.toString()); } } } public void print() { for (String line : lines) { System.out.println(line); } } }