JavaでIOストリームを理解する方法-合理化

目次

前書き

バッファリングされたストリーム 

バイトバッファストリーム 

文字バッファストリーム 

ストリームの変換 

文字入力変換ストリーム 

文字出力変換ストリーム 

シリアル化および逆シリアル化 

オブジェクトのシリアル化 

オブジェクトの逆シリアル化 

印刷ストリーム 

プロパティ


 

前書き

以前の簡単な調査で、ファイルの操作について一般的な理解を得ることができましたが、他の操作を実行する際にはまだいくつかの不便さをはっきりと感じることができるので、今日はさらに4つのIOストリームを学習します。ファイルを操作する場合、これらの4つのストリームは、バッファリングストリーム変換ストリームシリアル化、および印刷ストリームです。さて、これ以上苦労することなく、今日の勉強を始めましょう!

 

 

バッファリングされたストリーム 

  • バッファリングされたストリーミングは、効率的なストリーミングまたは高度なストリーミングとも呼ばれます。以前に学習したバイトストリームは、rawストリームと呼ぶこともできます。
  • 機能:バッファストリームには独自のバッファがあり、元のバイトストリームと文字ストリームからデータを読み取るパフォーマンスを向上させることができます。
  • 画像の例:ファイルの入力操作と出力操作を水を輸送するプロセスとして想像すると、最初は水(データ)が直接水道管に輸送されますが、バッファーフローの違いは水が水道管に接続する必要はありません。水道管の前にある給水タンクにドッキングするだけで、輸送効率が向上します。
  • バッファストリームには、バイトバッファストリームと文字バッファストリームの2種類があります。それらは、BufferedInputStream(バイトバッファ入力ストリーム)BufferedOuputStream(バイトバッファ出力ストリーム)BufferedReader(文字バッファ入力ストリーム)BufferedWriter(文字バッファ出力ストリーム)です。 

バイトバッファストリーム 

  • バイトバッファ入力ストリーム:BufferedInputStream、バイト入力ストリームからのデータ読み取りのパフォーマンスを向上させ、読み取りおよび書き込み機能は変更されていません
  • バイトバッファ出力ストリーム:BufferedOutputStreamは、バイト出力ストリームからのデータ読み取りのパフォーマンスを向上させ、読み取りおよび書き込み機能に変更はありません。
コンストラクタ 説明する

public BufferedInputStream(InputStream is)

低レベルのバイト入力ストリームを高レベルのバイトバッファ入力ストリームパイプラインにラップできるため、バイト入力ストリームからのデータ読み取りのパフォーマンスが向上します。
public BufferedOutputStream(OutputStream os) 低レベルのバイト出力ストリームを高レベルのバイトバッファ出力ストリームパイプラインにラップできるため、データの書き込みパフォーマンスが向上します。
InputStream is = new FileInputStream("File//data.txt");
InputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("File//data01.txt");
OutputStream bos = new BufferedOutputStream(os);
int len;
byte []buffer = new byte[1024];
while ((len = bis.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();

バイトバッファストリームを介して、あるファイルの内容を別のファイルにコピーします。

 

文字バッファストリーム 

文字バッファ入力ストリーム:BufferedReaderは、行ごとにデータを読み取る機能に加えて、データを読み取る文字入力ストリームのパフォーマンスを向上させます。

コンストラクタ 説明する
public BufferedReader(Reader r) 低レベルの文字入力ストリームを高レベルのバッファリングされた文字入力ストリームパイプラインにラップできるため、文字入力ストリームからのデータ読み取りのパフォーマンスが向上します。
方法 説明する
public String readLine() データの行を読み取って返します。読み取りが完了していない場合は、読み取ってnullを返す行がありません。
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);//由于是子类独有的功能,所有不能使用多态创建
        String s;
        byte []buffer = new byte[1024];
        while ((s = br.readLine())!=null){
            System.out.println(s);
        }
//正常情况下会将文件中的数据依次输出;
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);
        br.readLine();
        br.readLine();
//若文件中的数据不足两行:
//kdirvingJamesJame
//null

文字バッファ出力ストリーム:改行関数に加えて、データを書き込む文字出力ストリームのパフォーマンスを向上させるBufferedWriter 

コンストラクタ 説明する
public BufferedWriter(ライターw) 低レベルの文字出力ストリームを高レベルのバッファリングされた文字出力ストリームパイプラインにパッケージ化できるため、文字出力ストリームへのデータ書き込みのパフォーマンスが向上します。
方法 説明する
public void newLine() アクションを実行する
        Writer w = new FileWriter("File//data.txt",true);
        BufferedWriter bw = new BufferedWriter(w);//由于是子类独有的功能,所有不能使用多态创建
        bw.write("石原里美");
        bw.newLine();
        bw.write("工藤静香");
        bw.newLine();
        bw.flush();

ファイルの書き込み時にファイルを追加する場合は、BufferedWriterオブジェクトではなく、Writerオブジェクトにtrueを設定する必要があることに注意してください。

 

ストリームの変換 

変換ストリームについて学習する前に、コードエンコーディングとファイルエンコーディングに一貫性がないかどうかを理解する必要があります。文字ストリームを使用して直接読み取ると文字が文字化けするため、文字化けが発生しないようにコードエンコーディングとファイルエンコーディングの一貫性を保つ必要があります。変換ストリームの外観は、このようなことが起こらないようにするためのものです。 。 

 

文字入力変換ストリーム 

1つ目は、文字化けした文字の問題について簡単なアイデアを提供することです。

1.文字入力を使用してストリームを変換します。

2.ファイルの元のバイトストリーム(異なるエンコーディング)を抽出でき、元のバイトに問題はありません。

3.バイトストリームを指定されたエンコーディングの文字入力ストリームに変換して、文字入力ストリームの文字が文字化けしないようにします。

文字入力変換ストリーム:InputStreamReader。指定されたエンコーディングに従って元のバイトストリームを文字入力ストリームに変換できます。

コンストラクタ 説明する
public InputStreamReader(InputStreamは) 元のバイトストリームは、コードのデフォルトのエンコーディングに従って文字入力ストリームに変換できます。めったに
public InputStreamReader(InputStream is、String charset) 元のバイトストリームは、指定されたエンコーディングに従って文字入力ストリームに変換できるため、文字ストリーム内の文字が文字化けすることはありません。

        InputStream is = new FileInputStream("File//data.txt");
        InputStreamReader isr = new InputStreamReader(is);
        InputStreamReader isr = new InputStreamReader(is,"GBK");

上記のコードでは、data.txtファイルのエンコード形式がGBKに設定されており、コードのエンコードがutf-8であることがわかっているため、エンコードの一貫性を保つためにストリームを変換する必要があります。1つのコンストラクターのデフォルトはutf-8ですが、これは明らかに受け入れられません。2つ目は、エンコードを指定し、元のバイト入力ストリームを文字入力ストリームに変換して、GBKの形で読み取ることです。

文字出力変換ストリーム 

文字出力変換ストリーム:OutputStreamWriter。指定されたエンコーディングに従ってバイト出力ストリームを文字出力ストリームに変換できます。

コンストラクタ 説明する
public OutputStreamWriter(OutputStream os) 元のバイト出力ストリームは、コードのデフォルトのエンコーディングに従って文字出力ストリームに変換できますが、ほとんど使用されません。
public OutputStreamWriter(OutputStream os、String charset) 指定されたエンコーディングに従って、元のバイト出力ストリームを文字出力ストリームに変換できます

まず、文字出力変換ストリームが実際にどのようなものであるかを知る必要があります。現時点では、GBKとしてエンコードされたファイルを渡す必要があります。

        OutputStream os = new FileOutputStream("File//data.txt");
        Writer osw = new OutputStreamWriter(os);
        Writer osw = new OutputStreamWriter(os,"GBK");

上記のコードでは、最初のコードはデフォルトのutf-8であるためほとんど役に立たず、2番目のコードは顧客が必要とするエンコードファイル形式を指定することです。

 

シリアル化および逆シリアル化 

オブジェクトのシリアル化 

  • オブジェクトバイト出力ストリーム、ObjectOutputStream
  • 機能:メモリに基づいて、オブジェクトをメモリ内のディスクファイルに保存します。これはオブジェクトのシリアル化と呼ばれます。
コンストラクタ 説明する
public ObjectOutputStream(OutputStream os) 低レベルのバイト出力ストリームを高レベルのオブジェクトバイト出力ストリームにラップします

1つ目は、単純に学生クラスStudentを作成することです。Javaでオブジェクトのシリアル化を指定する場合、クラスはSerializableインターフェース を実装する必要があることに注意してください

public class Student implements Serializable {
    private String name;
    private int age;
    private String number;
    private String classroom;
}

次のステップは、オブジェクトのシリアル化を実装することです。

        Student s = new Student("石原里美",18,"001","智能一班");
        OutputStream os = new FileOutputStream("File//data.txt");
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(s);
        oos.close();

さらに、オブジェクト内の一部のデータをシリアル化に参加させたくない場合は、「プライベート一時文字列名」などの一時的なデータを変更できます。この操作を実行した後、データは逆シリアル化されるとnullを表示します。 。

オブジェクトの逆シリアル化 

  • オブジェクトバイト入力ストリーム、ObjectInputStream
  • 機能:メモリに基づいて、ディスクファイルに保存されているオブジェクトデータをメモリ内のオブジェクトに復元します。これは、オブジェクトの逆シリアル化と呼ばれます。
コンストラクタ 説明する
public ObjectInputStream(InputStream is) 低レベルのバイト入力ストリームを高レベルのオブジェクトバイト入力ストリームにラップします
メソッド名 説明する
public Object readObject() ディスクファイルに保存されているオブジェクトデータをメモリ内のオブジェクトに復元し、
        InputStream is = new FileInputStream("File//data.txt");
        ObjectInputStream ois = new ObjectInputStream(is);
        Object s = ois.readObject();
        System.out.println(s);
//输出结果:
//Student{name='石原里美', age=18, number='001', classroom='智能一班'}

さらに、別の知識ポイントがあります。クラスを定義するときにバージョンのシリアル番号を定義できます。シリアル番号を逆シリアル化するときは、「private static final long serialVersionUID」のように、シリアル番号を正常に読み取る前に一貫している必要があります。 = 1; "

クラスのバージョンシリアル番号が最初のシリアル化の後に変更された場合、逆シリアル化は2番目の再シリアル化の前にエラーを報告します。

 

印刷ストリーム 

  • 機能:印刷ストリームは、ファイルへの便利で効率的なデータの印刷を実現できます。通常、PrintStream、WriteStreamの2つのクラスを指します
  • 印刷できるデータは、たとえば、整数97を印刷し、それを書き出すことは97であり、ブール値を真に印刷し、それを書き出すことは真であるデータです。
コンストラクタ 説明する
public PrintStream(OutputStream os) 印刷ストリームは、バイト出力ストリームパイプに直接送られます
public PrintStream(ファイルf) 印刷ストリームはファイルオブジェクトに直接送られます
public PrintStream(String filepath) 印刷ストリームはファイルパスに直接送られます
メソッド名 説明する
public void print(Xxx xx) あらゆる種類のデータを印刷する

//三种构造器的使用
PrintStream ps = new PrintStream("File//data01.txt");
PrintStream ps1 = new PrintStream(new File("File//data.txt"));
PrintStream ps2 = new PrintStream(new FileOutputStream(new          File("File//data.txt")));
ps.print(11);
ps.print("凯里·欧文");

PrintStreamとWriterStreamの違い

  • データを印刷する機能はまったく同じで、使いやすく、パフォーマンスが効率的です。
  • PrintStreamは、バイト出力ストリームOutputStreamを継承し、バイトデータを書き込むためのメソッドをサポートします
  • PrintWriterは、文字出力ストリームWriterを継承し、文字の書き込みをサポートします

プロパティ

  • 機能:プロパティは、キーと値のペア情報を独自のオブジェクトのプロパティファイルに格納できるプロパティファイルを表します
  • プロパティファイル:サフィックスは.propertiesで終わるファイルであり、その内容はkey = valueであり、後でシステム構成情報に使用されます。

コンストラクタ 説明する
void load(InputStream is) 入力バイトストリームから属性(キーと値のペア)のリストを読み取ります
ボイドロード(リーダーr) 入力文字ストリームから属性(キーと値のペア)のリストを読み取ります
void store(OutputStream os、文字列コメント) このプロパティのリスト(キーと値のペア)をこのプロパティに書き込んで、load(InputStream)メソッドの使用に適した形式でバイトストリームを出力します
ボイドストア(ライターw、文字列コメント) このプロパティのリスト(キーと値のペア)をこのプロパティに書き込み、load(reader)メソッドの使用に適した形式で文字のストリームを出力します
public Object setProperty(String key、String value) キーと値のペアを保存(put)
public String getProperty(String key) 使用此属性列表中指定的键搜索属性值(get)
public Set<String> stringPropertyNames() 所有键的名称的集合(keySet())
        Properties properties = new Properties();
        properties.setProperty("石原里美","18");
        properties.setProperty("工藤静香","19");
        properties.setProperty("朱茵","20");
        System.out.println(properties);
        //第一个参数是文件存储路径,第二个是对文件的注释
        properties.store(new FileWriter("File//Baby.properties"),"这些都是绝世美女,不接受反驳哈哈哈");

        Properties properties = new Properties();
        properties.load(new FileReader("File//Baby.properties"));
        System.out.println(properties);
//输出结果:
//{"石原里美"=18,"工藤静香"=19,"朱茵"=20}

创作不易,给个三连吧

 

 

 

おすすめ

転載: blog.csdn.net/weixin_50635856/article/details/125633381