IOストリーム [IOストリーム技術入門、IOストリームの古典記述、IOストリームの新文法の古典記述、Javaにおけるストリームの概念細分化](1) - 包括的詳細解説(学習のまとめ --- 入門から深化まで)

 

目次

IOストリームテクノロジーの紹介

最初の単純な IO ストリーム プログラム 

 IOストリームを記述する古典的な方法

 IO ストリーム 新しい文法 古典的な書き方

Java におけるストリームの概念的な内訳 

 JavaのIOストリームクラスの仕組み


 

IOストリームテクノロジーの紹介

 IOとは何ですか

入力 (Input)とは、プログラムが外部システムからデータを取得できることを指します (主な意味は「読み取り」、外部データを読み取ることです)。出力(Output)とは、外部システムを動作させるために、プログラムが外部システムにデータを出力することを指します(中心的な意味は「書き込み」であり、外部システムにデータを書き込むことです)。java.io パッケージは、すべての外部システム上で入出力操作を実装するための関連 API を提供します。これは、この章で学習するテクノロジです。

 データソースとは何ですか

データ ソース データの元の媒体を提供するデータ ソース。一般的なデータ ソースには、データベース、ファイル、その他のプログラム、メモリ、ネットワーク接続、IO デバイスが含まれます。写真が示すように。

 

 データ ソースは、ソース デバイスとターゲット デバイスに分かれています。

1 ソースデバイス: 通常は入力ストリームに対応する、プログラムのデータを提供します。

2 ターゲットデバイス: プログラムデータの宛先。通常は出力ストリームに対応します。

 フローの概念

ストリームは抽象的で動的な概念であり、一連の連続的かつ動的なデータ収集です。入力ストリームの場合、データ ソースは水槽のようなもので、ストリームは水道管を流れる水のようなもので、プログラムは最終ユーザーです。データソース(Source)内のデータ(情報)をストリーム(A Stream)を通じてプログラム(Program)に送信します。出力ストリームは対象となるデータソースを宛先(dest)とし、プログラム(Program)内のデータ(情報)をストリーム(A Stream)を通じて宛先のデータソース(dest)に転送します。

 ストリームとソースおよびターゲット データ ソース間の関係:

 

 オールドルのヒント

入出力ストリームの分割は、データ ソースではなく、プログラムに対して相対的に行われます。

 

最初の単純な IO ストリーム プログラム 

 プログラムがデータ ソースのデータを読み取る必要がある場合、プログラムは IO ストリーム オブジェクトを通じてデータ ソースへのストリームを開き、IO ストリーム オブジェクトの関連メソッドを通じてデータ ソース内のデータを順次読み取ることができます。

ストリームを使用してファイルのコンテンツを読み取ります (非標準の書き込み、テストのみ)

import java.io.*;
public class TestI01 {
 public static void main(String[] args) {
 try {
 //创建输入流
 FileInputStream fis = new FileInputStream("d:/a.txt"); // 文件内容是:abc
 //一个字节一个字节的读取数据
 int s1 = fis.read(); // 打印输入字符a对应的ascii码值97
 int s2 = fis.read(); // 打印输入字符b对应的ascii码值98
 int s3 = fis.read(); // 打印输入字符c 对应的ascii码值99
 int s4 = fis.read(); // 由于文件内容已经读取完毕,返回-1
 System.out.println(s1);
 System.out.println(s2);
 System.out.println(s3);
 System.out.println(s4);
 // 流对象使用完,必须关闭!不然,总占用系统资源,最终会造成系统崩溃!
   fis.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
  }
}

上記の場合、次の点に注意する必要があります。

1. 読み取ったファイルの内容はわかっているので、一定数の「int s= fis.read();」ステートメントを使用して内容を読み取ることができますが、実際の開発では通常、内容はわかりません。ファイルの内容がまったくないので、読み取るときに while ループを使用する必要があります。

2. 例外発生後にストリームを正常に閉じるには、通常、ストリームの終了文をfinally文ブロックに配置し、ストリームがnullかどうかを判定する必要があります。

 

 IOストリームを記述する古典的な方法

 

 ストリームを使用してファイルのコンテンツを読み取る (クラシック コード、マスターする必要があります)

import java.io.*;
public class Test2 {
 public static void main(String[] args) {
 FileInputStream fis = null;
 try {
       fis = new FileInputStream("d:/a.txt"); // 内容是:abc
       StringBuilder sb = new StringBuilder();
       int temp = 0;
      //当temp等于-1时,表示已经到了文件结尾,停止读取
      while ((temp = fis.read()) !=-1) {
         sb.append((char) temp);
     }
         System.out.println(sb);
 } catch (Exception e) {
         e.printStackTrace();
 } finally {
 try {
 //这种写法,保证了即使遇到异常情况,也会关闭流对象。
 if (fis != null) {
      fis.close();
     }
  } catch (IOException e) {
      e.printStackTrace();
    }
   }
 }
}

 

 IO ストリーム 新しい文法 古典的な書き方

 JDK7 以降のバージョンでは、try-with-resource 構文を使用してリソースをより適切に閉じることができます。java.lang.AutoCloseable インターフェース: java.lang.AutoCloseable インターフェースには、リソースを閉じるために使用される close メソッドが含まれています。オブジェクトが java.lang.AutoCloseable インターフェースを実装している限り、try-with-resource を使用してリソースを閉じることができます。最新の try-with-resource 簡略化を使用する (クラシック コード、マスターする必要があります)

public class Test3 {
    public static void main(String[] args) {
        //使用try-with-resource方式关闭资源。
        //在try中打开资源,不需要在代码中添加finally块关闭资源。
        try(FileInputStream fis = new FileInputStream("d:/a.txt");){
            StringBuilder sb = new StringBuilder();
            int temp=0;
            while((temp = fis.read()) != -1)
           {
                sb.append((char) temp);
           }
            System.out.println(sb);
       }catch(Exception e){
            e.printStackTrace();
       }
   }

Oldlu 氏は、上記のコードは非常に典型的な IO ストリーム コードであり、他のストリーム オブジェクトの使用も基本的に同じパターンであると示唆しました。

 

Java におけるストリームの概念的な内訳 

 流れの方向による分類:

 入力ストリーム:データ フローの方向は、データ ソースからプログラム (InputStream、Reader で終わるストリーム) です。

 出力ストリーム:データ フローはプログラムから宛先 (OutPutStream、Writer で終わるストリーム) までです。

 処理されるデータ単位で分類:

バイトストリーム:バイト単位でデータを取得する FileInputStream や FileOutputStream など、名前の末尾が Stream のストリームが一般的にバイトストリームです。

文字ストリーム:文字単位でデータを取得し、FileReaderやFileWriterなど、名前の末尾がReader/Writerのストリームが一般に文字ストリームです。

 処理オブジェクトのさまざまな分類によると、次のようになります。

ノード ストリーム: FileInputStream、FileReader、DataInputStream などのデータ ソースまたは宛先から直接データを読み書きできます。

処理ストリーム:データ ソースまたは宛先に直接接続されていない、「処理ストリームのフロー」です。BufferedInputStream、BufferedReader などの他のストリームを処理することで、プログラムのパフォーマンスを向上させます。プロセス ストリームはラッパー ストリームとも呼ばれます。

 ノード ストリームは IO 操作の最前線にあり、すべての操作はノード ストリームを通じて実行する必要があります。処理ストリームはノード ストリームをパッケージ化して、パフォーマンスやプログラムの柔軟性を向上させることができます。

 

 JavaのIOストリームクラスの仕組み

Java はさまざまな IO ストリームを提供しており、さまざまな機能やパフォーマンス要件に応じて適切な IO ストリームを選択できます。図に示すように、Java における IO ストリームのシステムです。

 注: ここには一般的に使用されるクラスのみがリストされています。詳細については、JDK API ドキュメントを参照してください。

 上の図から、FileInputStream/FileOutputStream など、多くのストリームがペアで表示されていることがわかります。これらは明らかにファイルの入出力操作を実行します。以下に簡単にまとめてみましょう。

1 InputStream/OutputStream バイトストリームの抽象クラス。

2 Reader/Writer 文字ストリームの抽象クラス。

3 FileInputStream/FileOutputStream ノード ストリーム: バイト単位の「ファイル」の直接操作。

4 ByteArrayInputStream/ByteArrayOutputStream ノードストリーム:「バイト配列オブジェクト」をバイト単位で直接操作します。

5 ObjectInputStream/ObjectOutputStream 処理ストリーム: バイト単位での「オブジェクト」の直接操作。

6 DataInputStream/DataOutputStream 処理ストリーム:「基本データ型と文字列型」をバイト単位で直接操作します。

7 FileReader/FileWriter ノードストリーム:「テキストファイル」を文字単位で直接操作します(注:テキストファイルの読み書きのみ)。

8 BufferedReader/BufferedWriter の処理フロー: Reader/Writer オブジェクトをラップし、キャッシュ機能を強化し、読み取りと書き込みの効率を向上させます。

9 BufferedInputStream/BufferedOutputStream 処理ストリーム:InputStream/OutputStream オブジェクトをラップし、キャッシュ機能を強化し、読み取りと書き込みの効率を向上させます。

10 InputStreamReader/OutputStreamWriter プロセスストリーム: バイトストリームオブジェクトを文字ストリームオブジェクトに変換します。

11 PrintStream 処理ストリーム: OutputStream をラップして文字を出力すると、より柔軟になります。

Oldlu 氏は、フローの中心的な役割を一文で表現した上記の説明を提案しました。後で勉強するときは、心で体験してください。 

 

おすすめ

転載: blog.csdn.net/m0_58719994/article/details/131647239