JAvaファイルフローとパイプフロー

9881 ワード

ファイルフロー
ファイル・ストリームとは、データ・ソース内のファイルを操作するために特化したストリームで、主にFileInputStream、FileOutStream、FileReader、FileWriterの4つのクラスがあります.
例を挙げる
1.例えばバイトストリームでファイルを読み込む
public static void main(String[] args) throws IOException {
        FileInputStream fin = null;
        try {
            fin = new FileInputStream(" .txt");
            int i;
            while ((i = fin.read()) != -1) {
                System.out.print((char) i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fin.close();
        }

    }
}

结果はまさにファイルの中の内容aaaaa bbbbbbbbcccですが、ファイルの中に保存されているのは英语で、中国语なら文字化けして、印刷して山ほど???
2.例えばバイトストリームでファイルを書く
public static void main(String[] args) {
        FileOutputStream fos = null;
        String s = "      ";
        try {
            fos = new FileOutputStream(" .txt");
            int i;
            fos.write(s.getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

結果:バイトストリームで書かれた
注意:このwrite()カッコの中はバイト型なので、変換が必要です.fos=new FileOutputStream(「詩.txt」)ではカッコの中にtrueがないので、実行するたびにファイルを書き直します.
3.たとえば文字ストリームでファイルを書く
public static void main(String[] args) throws IOException {
        FileWriter fw = null;
        try {
            fw = new FileWriter(" .txt");
            fw.write("      ");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fw.close();
        }

    }
}

注意:FileWriterクラスのwrite()メソッドには文字列型のパラメータがあります.
4.例えば文字ストリームでファイルを読む
public static void main(String[] args) throws IOException {
        FileReader fin = null;
        try {
            fin = new FileReader(" .txt");
            int i;
            while ((i = fin.read()) != -1) {
                System.out.print((char) i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fin.close();
        }

    }
}

結果:文字ストリームで書かれた
5.バッファフローと文字フローでファイルを書く
public static void main(String[] args) throws IOException {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter(" .txt"));
            bw.write("          ");
            bw.newLine();  //      
            bw.write("   ");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bw.flush();
            bw.close();
        }
    }
}

6.バッファフローと文字フローでファイルを読み込む
public static void main(String[] args) {
        BufferedReader br = null;
        try {
            String s = null;
            br = new BufferedReader(new FileReader(" .txt"));
            while ((s = br.readLine()) != null) {
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果:バッファフローと文字フローで書くのが便利
ランダム・アクセス・ファイル・フロー
ファイルの読み取りと書き込みを同時に行い、RandomAccessFileクラスを使用します.それは以下の2つの特徴があります:1.1つのファイルに対して同時に読み書きの操作を行うことができます;2.ファイル内の指定された場所でデータを読み込んだり、書き込んだりすることができます.
RandomAccessFileクラスは、ファイルポインタの概念を使用してファイルランダムアクセス方式を実現し、ファイルポインタは配列内の下付き文字のように現在の読み書きデータの位置を指定します.読み取り専用方式の場合、ファイルポインタは1つしかなく、データを読み取る位置を表す.読み書き方式では、ファイルポインタが2つあり、それぞれデータの読み取り位置と書き込み位置を表す.ファイルポインタは暗黙的で、宣言を必要とせず、Javaによって自動的に管理されます.ファイルを開くと、ファイル読み込みポインタのデフォルトの位置式ファイルの先頭の最初の要素の位置が表示されます.ファイル書き込みポインタのデフォルトの位置はファイルの末尾です.データを読み書きすると、ファイルの読み書きポインタが自動的に要素の位置を後ろに移動します.一般に、読み書きデータの場所を特に指定する必要はなく、特別な必要がある場合はgetFilePointer()またはseek()メソッドを呼び出してファイルポインタの位置を取得または設定できます.
入出力ストリーム操作の一般的な手順は、(1)導入文を使用してjava.ioパッケージを導入する:import java.io.*;(2)異なるデータソースと入出力タスクに基づいて、バイトストリームまたは文字ストリームオブジェクトを確立する.(3)バイトまたは文字ストリーム情報の組織をデータとして加工する必要がある場合は、構築されたバイトストリームまたは文字ストリームオブジェクト上にデータストリームオブジェクトを構築する.(4)入出力ストリームオブジェクトクラスのメンバメソッドで読み書きを行う.(5)ストリームオブジェクトを閉じる.
パイプ流
パイプフローは、オブジェクト間でデータを転送する基本的な手段を提供します.出力ストリームと入力ストリームに分けられます.バイトストリームでも文字ストリームでも構いません.転送操作には、2つのパイプフローオブジェクト、1つの入力フローオブジェクト、1つの出力フローオブジェクトが必要であり、2つのパイプフローオブジェクトは接続を確立する必要があります.その後、1つのオブジェクトはパイプ出力フローオブジェクトにデータを書き込むことができ、もう1つのオブジェクトはパイプ入力フローオブジェクトからデータを読み出すことができます.パイプフローには、バイトフローPipedInputStreamクラス、PipedOutputStreamクラス、および文字フローPipedReaderクラス、PipedWriterクラスがあります.2つの接続方法:
(1)構造方法でPipedInputStream pis=new PipedInputStream()を接続する.PipedOutputStream pos = new PipedOutputStream(pis);
(2)接続をconnect()メソッドで行うPipedInputStream pis=new PipedInputStream()PipedOutputStream pos = new PipedOutputStream(); pis.connect(pos);
例として、PipedInputStremクラスとPipedOutputStreamクラスがパイプフローを作成する例を示します.
public static void main(String[] args) {
        byte a1 = 123, a2 = 111;
        PipedInputStream pis = null;
        PipedOutputStream pos = null;
        pis = new PipedInputStream();
        try {
            pos = new PipedOutputStream(pis);
            pos.write(a1);
            pos.write(a2);
            System.out.println(pis.read());
   pis.available()!=-1    pis.read()!=-1         ,   PipedInputStream  PipedOutputStream               。
            System.out.println(pis.read());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

結果は本例の検証に限られ、同じスレッドでJavaを書くことはできません.jdkドキュメントでは、1つのスレッドでPipeInpuStreamとPipeOutputStreamを同時に使用しないことを説明しています.これにより、デッドロックが発生します.123,111
もじかんろながれ
PipedWriterとPipedReaderは、スレッド間で文字情報を転送します.PipedOutputStreamやPipedInputStreamと同様にPipedWriterはWriterの直接サブクラス、PipedReaderはReaderの直接サブクラスである.PipedWriterには、入力パイプ文字ストリームを指定できるコンストラクションメソッドがあり、PipedReaderには、出力パイプ文字ストリームを指定できるコンストラクションメソッドがあります.これにより、PipedWriterとPipedReaderがペアで出現し、組み合わせて使用されることが多い.
標準入出力ストリームとエラーストリーム
System.out:デフォルトの表示(通常はディスプレイ)に出力を送るSystem.in標準入力から入力(通常はキーボード)を取得するSystem.errデフォルトの表示にエラーメッセージを送るSystemはfinalクラス、in,out,errはSystemの静的メンバー変数なので、System.inなどの形でそのまま使用できます.outの使い方はよく知られていますが、errの使い方はoutと同じです.