システム学習Java IO(四)----ファイルの読み書きとランダムアクセスFileInputStream/FileOutputStream&RandomAccessFile


ディレクトリ:システム学習Java IO----ディレクトリ、概要
ファイル入力ストリームFileInputStream
簡単なFileInputStreamの例です.
InputStream input = new FileInputStream("D:\\input.txt");
int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);
  data = input.read();
}
input.close();

注意:コードが明確であるため、ここでは異常の処理を考慮していないが、IO異常処理には専門的な紹介がある.
FileInputStreamコンストラクタ
FileInputStreamクラスには、FileInputStreamインスタンスの作成に使用できる3つの異なる構造関数があります.
  • コンストラクション関数は、ファイルシステムで読み込むファイルが存在するパスStringをパラメータとして含む:FileInputStream fileInputStream = new FileInputStream( "D:\\1.txt");パスには、Java文字列のエスケープ文字であるため、パスにはダブルスラッシュ\\が必要であることに注意してください.Unixでは、ディレクトリ区切り記号として正のスラッシュString path = "/home/czwbig/data/thefile.txt";を使用することに注意してください.これはunix上でファイルパスを記述する方法です.実際、Javaは、Windowsで/をディレクトリ区切り記号として使用することも理解します.例えば、/
  • コンストラクタはFileオブジェクトをパラメータとします.Fileオブジェクトは、読み込むファイルを指す必要があります.これは例です.
  • String path = "D:\\out.txt";
    File   file = new File(path);
    FileInputStream fileInputStream = new FileInputStream(file);
    

    どのコンストラクション関数を使用するかは、FileInputStreamを開く前にパスを持つ形式によって異なります.StringまたはFileが既にある場合は、そのまま使用します.StringをFileに変換したり、FileをStringに変換したりするメリットは特にありません.
  • public FileInputStream(FileDescriptor fdObj)ファイル記述子fdObjを使用して、ファイルシステム内の実際のファイルへの既存の接続を表すFileInputStreamを作成します.あまり使われません.

  • read(byte[])
    InputStreamのサブクラスとして、FileInputStreamには2つのread()メソッドがあり、バイト配列にデータを読み込むことができます.私のInputStreamに関する文章で読むことができて、展開しません.
    close()
    tryを使用して自動的に閉じることをお勧めします.IO異常処理章を参照してください.
    ファイル出力ストリームFileOutput Stream
    簡単なFileOutputStreamの例です.
    OutputStream output = new FileOutputStream("D:\\out.txt");
    while(moreData) {
      int data = getMoreData();
      output.write(data);
    }
    output.close();
    

    FileOutputStreamコンストラクタ
    FileInputStreamの3つのコンストラクタとは差が少ないので、上記を参考にしてください.さらに2つの構造方法が追加されました.
  • FileOutputStream(File file, boolean append) ;
  • FileOutputStream(String name, boolean append) ; パラメータappend:appendパラメータが指定されていない場合、その値はデフォルトfalse、すなわちデフォルトはオーバーライドモードです.trueの場合、ファイルの先頭ではなくファイルの末尾にバイトを書き込むことで、ファイルを上書きせずにコンテンツを追加できます.したがって、FileOutputStreamオブジェクトを新規作成する場合は、appendをtrueとして指定しない限り、FileOutputStreamオブジェクトが正常に作成される限り、対応するファイルはすぐに空になります.コード:new FileInputStream("D:/out.txt")のように、実行後に対応する1.txtファイル(存在する場合)は、OutputStreamを呼び出すwrite()メソッドがあるかどうかにかかわらず、すぐに空になります.

  • write(…) and flush()
    OutputStreamを参照してください.
    RandomAccessFileを使用してファイルにランダムにアクセス
    ここでのランダムアクセスとは、任意の場所を指定してアクセスできることを意味する.不確定なランダムアクセスではなく、場所にアクセスします.RandomAccessFileクラスを使用する前に、インスタンス化する必要があります.次の2つのコンストラクタがあります.
  • RandomAccessFile(File file, String mode)
  • RandomAccessFile(String name, String mode)

  • 例:
    RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
    

    パラメータ:file、name-ファイルオブジェクトmode-アクセスモード、次の表に示します.

    意味を含む
    “r”
    読み取り専用で開きます.結果オブジェクトを呼び出すwriteメソッドは、IOExceptionを放出します.
    “rw”
    読み取りと書き込みのために開きます.ファイルがまだ存在しない場合は、ファイルを作成します.
    “rws”
    「rw」+「sync」は、ファイルの内容やメタデータの更新ごとに、最下位のストレージデバイスに同期して書き込む必要がある.
    “rwd”
    「rw」+「data」は、また、ファイルコンテンツの更新ごとに、最下位のストレージデバイスに同期して書き込む必要がある.
    「rwd」モード
    「rwd」を使用すると、書き込み先のファイルの内容だけを更新する必要があります.「rws」を使用すると、通常は少なくとも1つ以上の低レベルI/O操作が必要な書き込み対象ファイルの内容とそのメタデータを更新する必要があります.
    「rws」モードと「rwd」モード
    ファイルがローカルストレージデバイス上にある場合、このようなメソッドの呼び出しを返すと、このファイルに対する呼び出しによって行われたすべての変更がデバイスに書き込まれることを保証できます.これは、システムがクラッシュしたときに重要な情報が失われないようにするのに特に役立ちます.ファイルがローカルデバイスにない場合は、このような保証は提供されません.
    ファイル内をジャンプ
    RandomAccessFile内の特定の場所で読み取りまたは書き込みを行うには、まずファイルポインタを読み取りまたは書き込みの場所に置く必要があります.これはseek()メソッドを用いて完成した.getFilePointer()メソッドを呼び出すことで、ファイルポインタの現在の位置を取得できます.read()メソッドは、読み込んだばかりのバイトを指すファイルの次のバイトにファイルポインタをインクリメントします.これは、ファイルポインタを手動で移動することなくread()を呼び出し続けることができることを意味します.次の例を示します.
    public class RandomAccessFileExample {
        public static void main(String[] args) throws IOException {
            // out.txt          "123456789"
            RandomAccessFile file = new RandomAccessFile("D:\\out.txt", "rw");
    
            System.out.println("pointer: " + file.getFilePointer()); //    pointer: 0
            System.out.println("char: " + (char) file.read()); //    char: 1
            System.out.println("pointer: " + file.getFilePointer()); //    pointer: 1
    
            file.seek(4); //     0    ,      5    
    
            System.out.println("pointer: " + file.getFilePointer()); //    pointer: 4
            System.out.println("char: " + (char) file.read()); //    char: 5
            System.out.println("pointer: " + file.getFilePointer()); //    pointer: 5
            file.close();
        }
    }
    

    read & write
    RandomAccessFileからの読み込みは、その多くのread()メソッドの1つを使用して行われます.
    方法
    説明
    read(byte[] b)
    最大b.length個のデータバイトをこのファイルからbyte配列に読み込みます.
    readByte()
    このファイルからシンボル付きの8ビット値を読み込みます.
    readChar()
    このファイルから文字を読み込みます.
    readFully(byte[] b)
    b.lengthバイトをこのファイルからbyte配列に読み込み、現在のファイルポインタから開始します.
    readLine()
    このファイルからテキストの次の行を読み込みます.
    skipBytes(int n)
    入力したnバイトをスキップしてスキップしたバイトを破棄しようとします.
    setLength(long newLength)
    このファイルの長さを設定します.
    writeChars(String s)
    文字列を文字列順にファイルに書き込みます.