目次
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 氏は、フローの中心的な役割を一文で表現した上記の説明を提案しました。後で勉強するときは、心で体験してください。