JAvaにおけるjava.io.RandomAccessFileの適用シーンおよび使用例

12839 ワード

適用シーン:
  1、10 Gファイルの末尾に指定内容を挿入するか、指定ポインタ位置に内容を挿入または変更します.   2、ブレークポイントの継続、seek()メソッドを使用してダウンロードリソースの場所を絶えず更新します.
概要:
JavaのRandomAccessFileは、ファイルの読み書き機能を提供します.RandomAccessFileはjava.ioの下のクラスに属するが、InputStreamまたはOutputStreamのサブクラスではない.FileInputStreamとFileOutputStreamとは異なります.FileInputStreamはファイルの読み取りのみを行い、FileOutputStreamはファイルの書き込みのみを行う.しかし、RandomAccessFileが入力ストリームと出力ストリームと異なる点は、RandomAccessFileがファイルの任意の場所にアクセスし、ファイルの読み取りと書き込みを同時にサポートし、ランダムアクセスをサポートすることである.RandomAccessFileにはInputStreamの3つのreadメソッドとOutputStreamの3つのwriteメソッドが含まれています.同時にRandomAccessFileは一連のreadXxxとwriteXxxメソッドを含んで入出力を完了します.   RandomAccessFile親:java.lang.Object    すべてのインタフェース実装:Closeable,DataInput,DataOutput,AutoCloseable
コンストラクション関数:
ファイル・フローにランダム・アクセスを作成し、Fileパラメータで指定したファイルから読み込み、ファイルへの書き込みを選択します. RandomAccessFile(File file, String mode)
ランダム・アクセス・ファイル・ストリームを作成し、指定した名前のファイルから読み込み、ファイルへの書き込みを選択します. RandomAccessFile(String name, String mode)
コンストラクション関数のmodeパラメータの値の説明:
rは、指定されたファイルを読み取り専用で開くことを表す.
rwは指定ファイルを読み書きで開きます.
rwsは読み書き方式で開き、コンテンツまたはメタデータを下位ストレージデバイスに同期して書き込む.
rwd読み書き方式が開き、ファイルコンテンツの更新が同期して最下位のストレージデバイスに更新されます.
現在のストリームの読み書き位置を識別するRandomAccessFileは、ファイル記録ポインタを操作するための2つの方法を含むオブジェクト記録ポインタを含む.ファイルポインタはgetFilePointerメソッドで読み取り、seekメソッドで設定できます.
long getFilePoint():ファイルポインタのオフセットを設定し、そのファイルの先頭から測定し、次の読み取りまたは書き込みが発生します.(前はドキュメント原文翻訳です.一般的には、ファイル記録ポインタの現在の位置を返し、ポインタの位置を指定しないデフォルトは0です.)void seek(long pos):ファイルポインタのオフセットを設定し、そのファイルの先頭から測定し、次の読み取りまたは書き込みが発生します.(前はドキュメントの原文翻訳です.一般的には、ファイル記録ポインタをposの位置に配置します.)ファイルの読み込みと書き込みの例を次に示します.
1、指定されたファイルの内容を読み、コンソールを出力する:
    public static void main(String[] args) throws Exception{
        RandomAccessFile raf=new RandomAccessFile("G:\\java-lambda\\work.txt","r");
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = raf.read(buff,0,1024))!=-1){
            System.out.println(new String(buff,0,len));
        }
     }

2、記録ポインタの位置とスキップしたバイト数を指定することで、内容を出力する
public static void RandomAccess(String path,String mode,long seek,int skipBytes){
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(path,mode);
            raf.writeBytes("If you interesting to me,please give the kiss to me!");
            raf.seek(seek);//         
            //System.out.println(raf.readLine());//  seek    0,readLine      
            raf.getFilePointer();//       
            raf.skipBytes(skipBytes);//      
            byte[] buff = new byte[1024];
            int len = 0;
            while ((len = raf.read(buff))>0){
                System.out.println(new String(buff,0,len));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(raf != null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

3、内容の後ろに文字列を挿入し、出力する
public static void RandomAccessTem(String path,String mode,long seek,int skipBytes){
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(path,mode);
            raf.writeBytes("If you interesting to me,please give the kiss to me!");
            raf.seek(raf.length());//  raf.length()     ,        
            raf.write("oh yes!".getBytes());//     oh yes!s
            raf.seek(0);//          
            byte[] buff = new byte[1024];
            int len = 0;
            while ((len = raf.read(buff))>0){
                System.out.println(new String(buff,0,len));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(raf != null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

4、一時ファイルで内容を挿入する
public static void RandomAccessTemp(String path,String mode){
        File tempFile = null;
        RandomAccessFile raf = null;
        FileOutputStream out = null;
        FileInputStream input = null;
        try {
            //      
            tempFile =File.createTempFile("temp","_temp");
            // JVM           ,           
            tempFile.deleteOnExit();
            //                   
            out = new FileOutputStream(tempFile);
            input=new FileInputStream(tempFile);
            //           
            raf = new RandomAccessFile(path,mode);
            //raf.writeBytes("If you interesting to me,please give the kiss to me!");
            //          
            raf.seek(0);
            byte[] buff = new byte[1024];
            int len = 0;
            //           
            //    ,      buff,            len,     buff    
            while ((len = raf.read(buff))>0){
                //              
                out.write(buff,0,len);
                System.out.println(new String(buff,0,len));
            }
            //          
            raf.seek(0);
            //      
            raf.writeBytes("my name's Toms!");
            //            
            while ((len = input.read(buff))>0){
                raf.write(buff,0,len);
            }
            out.close();
            input.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(raf != null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

メソッドの概要
void close():このランダムアクセスファイルストリームを閉じ、ストリームに関連付けられたすべてのシステムリソースを解放します.
FileChannel getChannel():このファイルに関連付けられている唯一のFileChannelオブジェクトを返します.
FileDescriptor getFD():このストリームに関連付けられた不透明なファイル記述子オブジェクトを返します.
long getFilePointer():このファイルの現在のオフセット量を返します.
long length():このファイルの長さを返します.
int read():このファイルからデータバイトを読み出します.
int read(byte[]b):最大b.length個のデータバイトをこのファイルからbyte配列に読み込む.
int read(byte[]b,int off,int len):最大len個のデータバイトをこのファイルからbyte配列に読み込む.
boolean readBoolean():このファイルからbooleanを読み込みます.
byte readByte():このファイルからシンボル付き8ビット値を読み出します.
char readChar():このファイルから文字を読み込みます.
double readDouble():このファイルからdoubleを読み込みます.
float readFloat():このファイルからfloatを読み込みます.
void readFully(byte[]b):b.lengthバイトをこのファイルからbyte配列に読み込み、現在のファイルポインタから開始します.
void readFully(byte[]b,int off,int len):ちょうどlenバイトをこのファイルからbyte配列に読み込み、現在のファイルポインタから開始します.
int readInt():このファイルからシンボル付き32ビット整数を読み出します.
String readLine():このファイルからテキストの次の行を読み込みます.
long readLong():このファイルからシンボル付き64ビット整数を読み出します.
short readShort():このファイルからシンボル付き16ビット数を読み出します.
int readUnsignedByte():このファイルからシンボルのない8桁のビット数を読み込みます.
int readUnsignedShort():このファイルから符号のない16桁のビット数を読み込みます.
String readUTF():このファイルから文字列を読み込みます.
void seek(long pos):このファイルの先頭で測定したファイルポインタのオフセット量を設定し、その位置で次の読み取りまたは書き込み操作が発生します.
void setLength(long newLength):このファイルの長さを設定します.
int skipBytes(int n):入力したnバイトをスキップしてスキップしたバイトを破棄しようとします.
void write(byte[]b):b.lengthバイトを指定したbyte配列からこのファイルに書き込み、現在のファイルポインタから開始します.
void write(byte[]b,int off,int len):指定したbyte配列からlenバイトをこのファイルに書き込み、オフセットoffから開始します.
void write(int b):指定したバイトをこのファイルに書き込みます.
void writeBoolean(boolean v):booleanを1バイト値でファイルに書き込みます.
void writeByte(int v):byteを1バイト値でファイルに書き込みます.
void writeBytes(String s):文字列をバイト順にファイルに書き込みます.
void writeChar(int v):charを2バイト値でファイルに書き込み、高バイトを先に書きます.
void writeChars(String s):文字列を文字列でファイルに書き込みます.
void writeDouble(double v):DoubleクラスのdoubleToLongBitsメソッドを使用して二重精度パラメータを1つのlongに変換し、8バイトの数でファイルに書き込み、まず高バイトを設定します.
void writeFloat(float v):FloatクラスのfloatToIntBitsメソッドを使用して浮動小数点パラメータをintに変換し、4バイトの数でint値をファイルに書き込み、高バイトを書きます.
void writeInt(int v):intを4バイトでファイルに書き込み、高バイトを先に書きます.
void writeLong(long v):8バイトでlongをファイルに書き込み、まず高バイトを書きます.
void writeShort(int v):shortを2バイトでファイルに書き込み、高バイトを先に書きます.
void writeUTF(String str):modified UTF-8符号化を使用して、マシンに関係なく文字列をファイルに書き込む.
転載:https://blog.csdn.net/qq496013218/article/details/69397380