【JAVAの基礎】IOについて詳しく解説
記事ディレクトリ
I. 概要
ストリームとは、開始点と終了点を持つ一連のバイトの集合であり、データ送信の一般用語または抽象化です。2 つのデバイス間のデータ伝送をストリームと呼びますが、ストリームの本質はデータ伝送であり、より直観的なデータ操作を容易にするために、データ伝送の特性に応じてさまざまなクラスに抽象化されています。
2. IOストリームの役割
2つの対象デバイス間のデータ転送を実現します。
3. IOストリームの利用シナリオ
- File クラスを使用すると、ファイル属性の取得、ファイルの作成、削除、移動などのファイル操作のみを実行できますが、ファイルの内容を変更することはできません。ファイルの内容を操作したい場合は、ファイルの内容を読み込んだり、削除したりする必要があります。
- IO ストリームの使用シナリオ: ファイルの内容を操作する必要がある場合。
IOストリームの操作対象はフォルダの読み書きではなくファイルです。IO ストリームを使用する場合は、フォルダーとの接続を確立しないように注意してください。
4. IOストリームの分類
これは、さまざまな分類基準に従ってさまざまな IO ストリームに分割されます。
4.1 データ送信の単位ポイント:
- バイトストリーム:送信するものはバイトであり、単位はバイトであり、バイトストリームの読み出しの最小単位は1バイト(1バイト=8ビット)です。あらゆる種類のデータを操作できます。
- 文字ストリーム:バイトが送信され、一度に 1 文字を読み取ることができます (1char = 2byte = 16bit)。違いは、送信プロセス中にエンコード操作が追加され、操作がより便利になることです。
4.2 データ送信の方向:
- **入力ストリーム入力:** 外部データ(ディスクや光ディスクなどの記憶装置からのデータ)をプログラム(メモリ)に読み込みます。
- **出力ストリーム出力:** プログラム(メモリ)データをディスクや光ディスクなどの記憶装置に出力します。
4.3 フローのさまざまな役割:
- ノード ストリーム:ソースから直接データを読み書きするストリーム (このストリームはパッケージ化または変更されていません) 処理ストリームは、ノード ストリームのカプセル化に基づくストリームです。FileInputStream はファイルから直接データを読み込むことができるノードストリームですが、BufferedInputStream は FileInputStream をラップしてバッファリング機能を持たせることができます。
- 処理ストリーム:既存のノード ストリームを接続してカプセル化し、カプセル化されたストリームを通じてストリームの読み取りおよび書き込み機能を実現するために使用されます。処理ストリームを使用する場合、プログラムは実際のデータ ソースに直接接続せず、既存のストリームに接続します。
5. IOストリームシステム
分類 | バイト入力ストリーム | バイト出力ストリーム | 文字入力ストリーム | 文字出力ストリーム |
---|---|---|---|---|
抽象基本クラス | 入力ストリーム | 出力ストリーム | 読者 | ライター |
ファイルにアクセスする | ファイル入力ストリーム | ファイル出力ストリーム | ファイルリーダー | アウトライター |
配列にアクセスする | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | 文字配列ライター |
アクセスパイプ | PipedInputStream | パイプ出力ストリーム | パイプリーダー | パイプライター |
アクセス文字列 | 入力ストリームリーダー | 出力ストリームライター | ||
バッファリングされたストリーム | BufferedInputStream | BufferedOutputStream | バッファリーダー | BufferedWriter |
変換の流れ | 入力ストリームリーダー | 出力SteamReader | ||
オブジェクトストリーム | オブジェクト入力ストリーム | オブジェクト出力ストリーム | ||
FilterInputStream | フィルター出力ストリーム | フィルターリーダー | フィルターライター | |
印刷ストリーム | プリントストリーム | プリントライター | ||
入力ストリームをプッシュバックする | プッシュバック入力ストリーム | プッシュバックリーダー | ||
特別なストリーム | データ入力ストリーム | データ出力ストリーム |
6. バイト入力ストリームInputStream
InputStream は仮想クラスであり、Java の文字入力ストリームであり、ファイルから Java プログラムにデータを読み取るために使用されます。
最も一般的に使用されるメソッドは次のとおりです: FileInputStream
-
一般的な方法
- int read(): ファイルから 1 バイトのデータを読み取ります。そして読み取ったバイトを返します。読み取りが完了した場合、戻り値は -1 です。
- int read(byte[] b): 一度に 1 バイト配列を読み取ります。入力ストリームは、読み取った内容をこのバイト配列に入れ、読み取り番号を返します。読み取りが完了すると、-1 が返されます。
- void close(); バイトストリームを閉じます。
-
FileInputStream の実装手順
- FileInputStream ストリーム オブジェクトを作成し、データ ソース ファイルをバインドします
- read メソッドを呼び出してデータを読み取る
- リソースをリリースする
-
サンプルコード
public void inputStreamMethod() throws Exception { FileInputStream in=new FileInputStream("D:\\goyeer.txt"); //创建Fileinptstream 流对象,并绑定源文件 byte[] buf=new byte[1024]; int len; //调用read方法读取数据 while((len=in.read(buf))!= -1){ String line=new String(buf,0,len,"UTF-8"); System.out.println(line); } }
-
インプットストリームシステム
7. バイト出力ストリーム OutputStream
OutputStream クラスは、Java IO API のすべての出力ストリームの基本クラスです。サブクラスには、BufferedOutputStream、FileOutputStream などが含まれます。OutputStream は典型的な装飾モードであり、使用時に直接サブクラス化できます。OutputStream は、コンソール、ファイル、ディスク、その他のターゲット メディアに出力できます。
-
一般的な方法
- void close(); 出力ストリームを閉じて、最終的にハンドル オーバーフローやメモリ オーバーフローを引き起こす可能性のあるリソースの占有が大きくなるのを防ぎます。
- void write(int b); 抽象クラス内の唯一の抽象メソッド。非抽象サブクラスはこのメソッドを実装する必要があります。
- void write(byte b[]) は、バイト配列の内容全体を直接出力します。
- void write(byte b[], int off, int len) 出力する内容はバイト配列 b[] に格納されていますが、すべてが出力されるわけではなく、配列の off 位置から len バイトだけが出力されます。出力。
- void lush() は出力ストリームをフラッシュし、バッファされたすべてのバイトを出力します。一部のストリームはキャッシュをサポートしているため、このメソッドはキャッシュ内のすべてのコンテンツを強制的にストリームに出力します。
-
OutputStream の実装手順
- OutputStream ストリーム オブジェクトを作成する
- 書き込みメソッドの入力
- close はメモリのオーバーフローを防ぐためにストリームを閉じます
-
サンプルコード
public void outputStreamMethod() throws IOException{ OutputStream ou=new FileOutputStream("D:\\ShowCoding.txt"); String str = "欢迎Goyeer社区"; byte[] bytes = str.getBytes(); for(int i = 0; i < bytes.length; i++) { ou.write(bytes[i]); } ou.close(); }
-
アウトプットストリームシステム
8. 文字入力ストリームリーダー
Reader は入力文字ストリームの親クラスですが、抽象クラスであるため、ファイルの読み取りと書き込みには推奨されません。
-
一般的な方法
- void close(); ストリームを閉じ、それに関連付けられたすべてのリソースを解放します。
- void mark(int readAheadLimit); ストリーム内の現在位置をマークします。
- boolean markSupported(); このストリームが mark() 操作をサポートするかどうかを決定します。
- int read(); 単一文字を読み取ります。
- int read(char[] cbuf); 文字を配列に読み取ります。
- int read(char[] cbuf, int off, int len); 配列の特定の部分に文字を読み取ります。
- int read(CharBuffer target) ;指定された文字バッファへの文字の読み取りを試みます
- boolean ready() ; このストリームを読み取る準備ができているかどうかを判断します。
- void replace();ストリームをリセットします
- ロングスキップ(long n); 文字をスキップします
-
リーダーの実装手順
- 指定された名前のファイルに関連付けられたファイル読み取りストリーム オブジェクトを作成します。ファイルは存在することが保証されます。ファイルが存在しない場合は例外 (FileNotFoundException) が発生します。
- 読み取りストリーム オブジェクトの read メソッドを呼び出して、一度に 1 文字を読み取り、後続の文字を自動的に読み取ります。
- メソッドを呼び出して文字ストリームを閉じます。
-
サンプルコード
public static void readerMethod() throws IOException{ Reader reader=new FileReader("D:\\goyeer.txt"); int ch = 0; char [] buf= new char[1024]; while((ch=reader.read(buf))!=-1){ System.out.print(new String(buf,0,ch)); } reader.close(); }
-
リーダーシステム
9. 文字出力処理 Writer
Writer クラスは、Java IO のすべての Writer の基本クラスであり、java.io パッケージの下にある抽象クラスです。BufferedWriter や PrintWriter など、Writer を実装するサブクラスを実装します。
-
一般的な方法
- Writer append(char c) は、指定された文字をこの書き込みに追加します
- Writer append(CharSequence csq) は、指定された文字シーケンスをこのライターに追加します
- Writer append(CharSequence csq, int start, int end) は、指定された文字シーケンスのサブシーケンスをこのライターに追加します。
- abstract void close() はこのストリームを閉じますが、最初にフラッシュします。
- abstract void flash() はこのストリームのバッファをリフレッシュします
- void write(char[] cbuf) 文字配列を書き込みます
- abstract void write(char[] cbuf, int off, int len) 文字配列の特定の部分を書き込みます
- void write(int c) は単一の文字を書き込みます
- void write(String str) 文字列を書き込みます
- void write(String str, int off, int len) は文字列の特定の部分を書き込みます
-
ライターの実装手順
- サブクラス経由で Writer をインスタンス化する
- write メソッドによるファイル書き込み操作の実装
- close は出力ストリームを閉じ、リソースを解放します。
-
サンプルコード
public static void writeMethod() throws IOException { Writer out = new FileWriter("D:\\goyeer.log"); String str = "I/O字符流,Writer类应用。"; out.write(str); out.close(); }
-
ライターシステム
10. まとめ
Java IO は Java 入出力システム、つまり入出力システムであり、アプリケーションと外部デバイス間のデータ転送を指します。一般的な外部デバイスには、ファイル、パイプ、ネットワーク接続が含まれます。プログラムを作成するときは、シナリオに適したバイト ストリームと文字ストリームを選択し、抽象サブクラスを柔軟に使用します。