JavaはよくAPIを使います。ファイルは指針に基づいてRandomAccess File類を読み書きます。

7333 ワード

java.io.RandomAccess Fileはファイルデータを読み書きするクラスであり、ポインタに基づいてファイルデータを読み書き操作(バイナリバイト)する。
    Random Access Fileは2つのモードを作成しています。
        r:読み取り専用モードで、ファイルデータのみ読み取り専用で、内容は書き込みません。
        rw:読み書きモードで、ファイルに対して読み書きもできます。
    よくある構造方法:
        Random Access File(String path,String mode)
        Random Access File(File file,String mode)
        mode:r or rw
    現在のディレクトリのraf.datファイルを読み書きします。rwモードでないと自動的に作成されます。ファイルが存在しない場合は異常FileNotFoundExceptionをスローします。
      void write(int d):ファイルにバイトを書き込み、所定のint値に対応する2進数で8桁低い書き込みをします。
      000000 0000 000000 00001
public class RandomAccessFileDemo {

   public static void main(String[] args) throws IOException { 

     RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");  

     raf.write(1);

     System.out.println("    ");

     raf.close();

   }

}
int read():ファイルからバイトを読み出し、int形式で戻ります。戻り値が-1であれば、ファイルの最後まで読んだことを示します。
public class ReadDemo {

   public static void main(String[] args) throws IOException {

     /** raf.dat     1   */

     RandomAccessFile raf=new RandomAccessFile("raf.dat", "r");

     /**

      * 0-255

      * 00000000 00000000 00000000 00000001

      * 00000000 00000000 00000000 11111111(255)

      */

     int d=raf.read();

     System.out.println(d);

     d=raf.read();

     System.out.println(d);

     raf.close();

   }

}
バイトでコピー:
public class CopyDemo {

   public static void main(String[] args) throws IOException {

     RandomAccessFile src=new RandomAccessFile("RandomAccessFile .docx", "r");

     RandomAccessFile desc=new RandomAccessFile("RandomAccessFile _cp.docx", "rw");

     int d=-1;

     while ((d=src.read())!=-1) {

          desc.write(d);

     }

     System.out.println("over");

     src.close();

     desc.close();

   }

}
    従来の機械ハードディスクは、その物理的特性により、単バイトの読み書き効率が悪くなりますが、ブロック読み書き効率は保証されます。ですから、私たちは毎回読み込むデータ量を上げることで、実際の読み書きの回数を減らすことができ、読み書きの効率を高めることができます。
    ランダムな読み書き:通常はシングルバイトの読み書きモードです。
    ブロック読み書き:バイトのセットを一度に読んで書きます。
     int read(byte[]data):与えられたバイト配列をファイルから一括で読み出す
     void write(byte[]data):…
     void write(byte[]data,int start,int len)
     長さが与えられたバイト量を合計して、読み取ったバイトを配列に保存します。戻り値は実際に読み取ったバイト量であり、戻り値が−1であるとファイルの最後まで読んだことを示していますが、今回は内容が読めませんでした。
      byte:-128-127
      1 b:0000
      1 kb=1024 byte
      1 mb=1024 kb
      ハードディスクは1000換算で
public class CopyDemo2 {

   public static void main(String[] args) throws IOException {

     RandomAccessFile src=new RandomAccessFile("RandomAccessFile .docx", "r");

     RandomAccessFile desc=new RandomAccessFile("RandomAccessFile _cp2.docx", "rw");

     byte[]data=new byte[1024*10];

     //          

     int len=-1;

     while ((len=src.read(data))!=-1) {

        desc.write(data,0,len);

     }

     System.out.println("over");

     src.close();

     desc.close();

   }

}
    テキストデータを書き出す:
    Stringは文字列を文字に変換する方法を提供しています。byte[]getByttes()
    システムのデフォルト文字セットに従って、現在の文字列を対応するバイトに変換しますが、このような方法は推奨されません。
    byte[]getBytes(String csn);csn:charset name
    指定された文字セットでバイトのセットに変換します。
    共通文字セット:
    GBK:国際コード、英語1バイト、中国語2バイト。
    UTF-8:unicodeの文字セットコードは、英語1バイト、中国語3バイトです。UTF-8は世界で流行しているすべての文字をサポートしていますので、万国コードにもなりました。
    ISO 8859-1:ヨーロッパのコードブックで、中国語に対応していません。
 
public class WriteStringDemo {

   public static void main(String[] args) throws IOException {

     RandomAccessFile raf=new RandomAccessFile("raf.txt", "rw");

     String str=" ";

     byte[]data=str.getBytes("utf-8");

     raf.write(data);

     str=" ?";

     data=str.getBytes("utf-8");

     raf.write(data);

     System.out.println("finished");

     raf.close();

   }

}
テキストデータを読み出す:
public class ReadStringDemo {

   public static void main(String[] args) throws IOException {

     /**            */

     RandomAccessFile raf=new RandomAccessFile("raf.txt", "r");

     byte[]data=new byte[(int)raf.length()];

     raf.read(data);

     /**         ,         

      * String(byte[]data):

      *                

      * String(byte[]data,String csn):

      *                     */

     String string=new String(data, "utf-8");

     System.out.println(string);

     raf.close();

   }

}



    簡易メモツール:プログラム起動後、ユーザーにファイル名の入力を要求し、ファイルの書き込み操作を開始した後、ユーザーが入力する文字列ごとにこのファイルに書き込みを要求し、ユーザーが単語「exit」を入力した場合、プログラムは終了します。
public class Note {

public static void main(String[] args) throws IOException {

     Scanner scanner=new Scanner(System.in);

     System.out.println("       :");

     String fileName=scanner.nextLine();

     RandomAccessFile raf=new RandomAccessFile(fileName, "rw");

     String content="";

     while (true) {

        System.out.println("     :");

        content=scanner.nextLine();

        if (content.equals("exit")) {

           break;

        }

        byte[]data=content.getBytes();

        raf.write(data);

        System.out.println();

     }

     System.out.println("    ");

     scanner.close();

     raf.close();

   }

}   
    基本データを読み书き、RAFはポインタに基づいてどうやって読み书きますか?
public class Demo2 {

   public static void main(String[] args) throws IOException {

     RandomAccessFile raf=new RandomAccessFile("raf4.txt","rw");

     /** long getFilePointer()         */

     long pos=raf.getFilePointer();

     System.out.println(pos);//0

     int max=Integer.MAX_VALUE;

     raf.write(max>>>24);

     System.out.println(raf.getFilePointer());//1

     raf.write(max>>>16);

     System.out.println(raf.getFilePointer());//2

     raf.write(max>>>8);

     System.out.println(raf.getFilePointer());//3

     raf.write(max);

     System.out.println(raf.getFilePointer());//4

     /**

      * void writeInt(Int d)

      *      4  ,    int   

      */

     raf.writeInt(max);

     System.out.println(raf.getFilePointer());//8

     raf.writeDouble(123.23);

     System.out.println(raf.getFilePointer());//16

     raf.writeLong(123L);

     System.out.println(raf.getFilePointer());//24

     System.out.println("finished");

     System.out.println(raf.read());//-1

     /**

      * void seek(long pos):          

       * int readInt():   4   ,   int , 

      *                ,       

      *      :EOFException

      * double readDouble()

      */

     raf.seek(0);

     System.out.println(raf.getFilePointer());//0

     System.out.println(raf.readInt());//2147483647

     System.out.println(raf.getFilePointer());//4

     //     double       ,  double 

     raf.seek(8);

     System.out.println(raf.readDouble());//123.23

     System.out.println(raf.readLong());//123

     System.out.println(raf.getFilePointer());//24

     //         

     raf.seek(8);

     raf.writeDouble(567.567);

     raf.seek(8);

     System.out.println(raf.readDouble());

     raf.seek(16);

     System.out.println(raf.readLong());  

     System.out.println(raf.read());

    

     raf.close();

   }

}