ランダム読み出しフローについて

1656 ワード

JAVAで大きなデータ量のファイルを操作すると、FileReaderを利用してすべての内容をメモリにロードしますので、意味がありません.BIOを使うなら、java.io.Random Access Fileを使って、一部の情報を読み取ることをおすすめします.NIOを使うなら、java.nio.cnnes.FileChanelを使って、仮想メモリを使ってMapping大ファイルを使うことを提案します.
メモリファイルマッピング技術で問題を解決できる場合があります.1.ファイル中のすべてのデータをコピーしないでください.ファイルの一部のデータを変更するだけです.2.並列\セグメント処理の大きなファイル.
import java.nio.channels.FileChannel;

public class ChangeFile {
	/**
	 *                :            
	 * 
	 * @param fName
	 *            :        
	 * @param start
	 *            :    
	 * @param len
	 *            :        
	 * @return :      
	 * @throws Exception
	 *             :          
	 * @author javaFound
	 */
	public static boolean changeFile(String fName, int start, int len)
			throws Exception {
		//             
		java.io.RandomAccessFile raf = new java.io.RandomAccessFile(fName, "rw");
		long totalLen = raf.length();
		System.out.println("       : " + totalLen);
		//         
		java.nio.channels.FileChannel channel = raf.getChannel();
		//                      
		java.nio.MappedByteBuffer buffer = channel.map(
				FileChannel.MapMode.READ_WRITE, start, len);
		//       
		for (int i = 0; i < len; i++) {
			byte src = buffer.get(i);
			buffer.put(i, (byte) (src - 31));//   Buffer        
			System.out.println("           :" + src);
		}
		buffer.force();//     , buffer         
		buffer.clear();
		channel.close();
		raf.close();
		return true;
	}

	//      
	public static void main(String[] args) throws Exception {
		changeFile("E:\\a.txt", 0, 2);
		System.out.println(" change OK... ");
	}
}
JAvaNIOローカル修正ファイルに指定された位置の部分データを以下のコードで示します.