randomAccessFile
RandomAccessFileは、データレコードを保存するファイルにアクセスするために使用されます。 SEEK()メソッドを使用して、レコードにアクセスして読み書きできます。これらのレコードのサイズは同じである必要はありません。ただし、サイズと位置を知っている必要があります。ただし、このクラスはファイルの操作に限定されています。
RandomAccessFileは、inputStreamおよびoutputStreamクラスに属していません。実際、DatainputおよびDataOutputインターフェイスの実装(DatainputStreamとDataOutputStreamもこれらの2つのインターフェイスを実装している)に加えて、これら2つのクラスとは何の関係もありません。それは完全に独立したクラスであり、すべての方法(ほとんどはそれ自体に属します)はゼロから書かれています。これは、ランダムアクセスファイルがファイル内で前後に移動できるため、その動作は他のI/Oクラスとは多少根本的に異なるためかもしれません。要するに、それはオブジェクトを直接継承する別のクラスです。
基本的に、randomAccessFileの作業方法は、DatainputStreamとdataoutputStreamを組み合わせて、getFilePointer()などの独自の方法を追加して、ファイルを移動するために()を探す()、ファイルサイズの長さ()を決定し、スキップするためのスキップ()をスキップすることです。さらに、そのコンストラクターには、読み取り専用モード( "r")またはread-writeモード( "rw")でファイルを開くかどうかを示すパラメーターもあります(cのfopen()とまったく同じ)。ファイルの作成のみをサポートしていません。
RandomAccessFileのみにSEEK検索方法があり、この方法はファイルにのみ適用できます。 BufferedInputStreamにはMARK()メソッドがあり、マークを設定するために使用できます(結果を内部変数に保存)し、RESET()を呼び出してこの位置に戻りますが、その機能は弱すぎて実用的ではありません。
すべてではなく、ランダムアクセスファイルの関数のほとんどは、JDK 1.4の「メモリマップされたファイル」に置き換えられています。 RandomAccessFileの代わりに「メモリマップされたファイル」を使用するかどうかを検討する必要があります。
java.io.ioexceptionをインポートします。 java.io.randomaccessfileをインポートします。 public class testrandomaccessfile {public static void main(string [] args)throws ioexception {randomaccessfile rf = new randomaccessfile( "rtest.dat"、 "rw"); for(int i = 0; i <10; i ++){//基本型ダブルデータrf.writedouble(i * 1.414); } rf.close(); rf = new RandomAccessFile( "rtest.dat"、 "rw"); //ファイルポインターを5番目のダブルデータrf.seek(5 * 8)に直接移動します。 // 6番目のダブルデータrf.writedouble(47.0001)を上書きします。 rf.close(); rf = new RandomAccessFile( "rtest.dat"、 "r"); for(int i = 0; i <10; i ++){system.out.println( "value" + i + ":" + rf.readdouble()); } rf.close(); }}メモリマップされたファイル
メモリマッピングされたファイルを使用すると、大きすぎてメモリに入れることができないファイルを作成および変更できます。メモリマッピングされたファイルを使用すると、ファイルがメモリに読み込まれていると考えることができ、非常に大きな配列としてアクセスできます。このソリューションは、ファイルを変更するコードを大幅に簡素化できます。
filechannel.map(felechannel.mapmodeモード、長位置、長いサイズ)このチャネルのファイル領域を直接メモリにマップします。マップの範囲からどこからマップし、どのくらいの大きさであるかを示す必要があることに注意してください。つまり、大きなファイルの小さな断片をマップすることもできます。
MappedByteBufferはByteBufferのサブクラスであるため、ByteBufferのすべての方法を備えていますが、バッファーのコンテンツをストレージデバイスに強制的に更新するために新しい力()が追加されます。ここでは、put()およびget()メソッドを簡単に実証します。さらに、ascharbuffer()などのメソッドを使用して、対応する基本タイプデータのバッファービューを取得することもできます。
java.io.randomaccessfileをインポートします。 java.nio.mappybytebufferをインポートします。 java.nio.channels.filechannelをインポートします。 public class largemappedfiles {static int length = 0x8000000; // 128 MB public static void main(string [] args)スロー例外{//読み取り可能な書き込み可能な方法でファイルを開くために、ここではファイルを作成するためにランダムアクセスファイルが使用されます。 filechannel fc = new RandomAccessFile( "test.dat"、 "rw")。getChannel(); //読み取り可能で書き込み可能なファイルチャネルは、読み取り可能なファイルストリーム自体に基づいている必要があることに注意してください。 mappedbytebuffer out = fc.map(filechannel.mapmode.read_write、0、length); //(int i = 0; i <length; i ++){out.put((byte) 'x'); } system.out.println( "finisht writing"); //ファイルの中央の6バイトを読み取ります(int i = length / 2; i <length / 2+6; i ++){system.out.print((char)out.get(i)); } fc.close(); }}FileOutputStreamはマッピングの書き込みに使用されているようですが、マッピングファイルのすべての出力はRandomAccessFileを使用する必要がありますが、FileInputStreamのみを読み取る必要がある場合は、マッピングファイルを書き込むときはランダムアクセスファイルを使用する必要があります。書くときに読む理由かもしれません。
プログラムは128MBファイルを作成します。一度にメモリを読んだ場合、メモリオーバーフローを引き起こす可能性がありますが、ここにアクセスすると、ほんの少しの部分しかメモリに移され、残りはスワップファイルに配置されるためです。これにより、超大型ファイル(最大2 GB)を簡単に変更できます。 Javaは、パフォーマンスを改善するためにオペレーティングシステムの「ファイルマッピングメカニズム」を呼び出すことに注意してください。
randomAccessFileクラスのアプリケーション:
/ * *プログラム関数:randomAccessFileクラスの操作を実証し、ファイルコピー操作を実装します。 */パッケージcom.lwj.demo; java.io.*をインポートします。 public class randomaccessfiledemo {public static void main(string [] args)throws exception {randomaccessfile file = new RandomAccessFile( "file"、 "rw"); //次のファイルにデータを書き込みfile.writeint(20); // 4バイトfile.writedouble(8.236598); // 8 bytes file.writeutf( "これはutf文字列"); file.writeboolean(true); // 1 byte file.writeshort(395); // 2 bytes file.writelong(2325451l); // 8 bytes file.writeutf( "別のutf string"); file.writefloat(35.5f); // 4バイトfile.writechar( 'a'); // 2バイトfile.seek(0); //ファイルの開始にファイルポインター位置を設定します//次のファイルからデータを読み取ることです。ファイルの位置Pointer system.out.println( " - ` - - 、、、、 `be、` bemyly.out.out.println(file.readint()); system.out.println(file.readdouble(); system.out.out.print.println(file.readutf(); file.skipby(3/////.skip);この場合、ブール値と短い値がスキップされます。 System.out.println(file.readfloat()); (バイト番号)b = file.write.out.println(b); RandomAccessFile挿入の記述例:
/ **** @paramスキップデータをスキップするバイト数* @param string* @param filenameファイルパス*/ public static void beiju(long skip、string str、string filename){try {randomaccessfile raf = new randomaccessfile(filename、 "rw"); if(skip <0 || skip> raf.length()){system.out.println( "スキップ数のスキップ数は無効です");戻る; } byte [] b = str.getBytes(); raf.setlength(raf.length() + b.length); for(long i = raf.length() - 1; i> b.length + skip -1; i-){raf.seek(i -b.length); byte temp = raf.readbyte(); raf.seek(i); raf.writebyte(temp); } raf.seek(skip); raf.write(b); raf.close(); } catch(Exception e){e.printstacktrace(); }}RandomAccessFileを使用して、ファイルのマルチスレッドダウンロードを実現します。つまり、複数のスレッドがファイルをダウンロードすると、ファイルがいくつかのピースに分割され、各ピースは別のスレッドでダウンロードされます。ファイルを作成するときにマルチスレッドを使用する例を以下に示します。ファイルに必要なスペースが事前にアロークされ、その後割り当てられたスペースでチャンキングされ、次のように書かれています。
java.io.filenotfoundexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.io.randomaccessfileをインポートします。 /***ファイルライティング操作にマルチスレッドを使用したテスト*/public class test {public static void main(string [] args)throws exception {//指定されたサイズのファイルは、ディスクランダムアクセスファイルraf = new RandomAccessfile( "d:/abc.txt"、 "rw"); raf.setlength(1024*1024); //事前にアロークされた1MファイルSpace Raf.Close(); //文字列s1 = "first string"を記述するファイルコンテンツ。文字列s2 = "second string";文字列S3 = "3番目の文字列";文字列s4 = "4番目の文字列";文字列s5 = "5番目の文字列"; //複数のスレッドを使用してファイルを同時に書き込みます新しいfilewritethread(1024*1、s1.getBytes())。start(); //ファイルの1024バイトからデータを書き込む新しいfilewritethread(1024*2、s2.getbytes())。start(); //ファイルの2048バイトからデータを書き込む新しいfilewritethread(1024*3、s3.getBytes())。start(); //ファイルの3072バイトからデータを書き込む新しいfilewritethread(1024*4、s4.getBytes())。start(); //ファイルの4096バイトからデータを書き込む新しいfilewritethread(1024*5、s5.getBytes())。start(); //ファイルの5120バイトからデータを書き込む} //スレッドを使用して、ファイルの指定された場所で指定されたデータを書き込むstatic class filewriteThread extendsスレッド{private int skip;プライベートバイト[]コンテンツ; public filewritethread(int skip、byte [] content){this.skip = skip; this.content = content; } public void run(){randomAccessfile raf = null; try {raf = new RandomAccessFile( "d://abc.txt"、 "rw"); raf.seek(スキップ); raf.write(content); } catch(filenotfoundexception e){e.printstacktrace(); } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); }最後に{try {raf.close(); } catch(例外e){}}}}}}}上記のJava RandomAccessFileの使用法の詳細な説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。