目次
FileInputStream と FileOutputStream
Java 文字ストリーム (Character Stream)
Javaのcloseメソッド自体によってスローされる例外は何ですか
FileOutputStream (ファイル出力ストリーム)
FileInputStream ファイル入力ストリームでは、パラメーター内のファイルが存在しない場合、例外が直接スローされ、新しいファイルの作成は試行されません。
Java のストリームは、入力データまたは出力データをある場所から別の場所に渡すことができるデータ転送方法です。Java の I/O ライブラリは、バイト ストリームと文字ストリームの 2 種類のストリームを提供します。
Javaバイトストリーム(バイトストリーム)
Java バイト ストリームはバイト単位で読み取りおよび書き込みを行うため、あらゆる種類のバイナリ データを処理する場合に推奨される方法です。これらは生のバイナリ データを処理するため、I/O インフラストラクチャで最も広く使用されています。
FileInputStream と FileOutputStream
Java の最も基本的なバイト ストリーム クラスは、FileInputStream と FileOutputStream です。ファイル入力ストリーム (FileInputStream) はファイルからデータを読み取るために使用され、ファイル出力ストリーム (FileOutputStream) はファイルにデータを書き込むために使用されます。これら 2 つのクラスを使用して、画像や音声などのバイナリ データを移動できます。
-
アドバンテージ
- バイト ストリームは、テキストやバイナリなど、あらゆる種類のファイルで使用できます。
- 一般にバイト ストリームは文字ストリームよりも高速で、大量のデータを処理する場合のパフォーマンスが向上します。
-
欠点がある
- テキスト データの処理には適しておらず、エンコードの問題が発生する可能性があります。
- テキスト ファイルを処理する場合は、手動でエンコードおよびデコードする必要があります。
-
使用例
- 画像とビデオの読み取りおよび書き込み操作
- データの圧縮と暗号化
Java 文字ストリーム (Character Stream)
Java 文字ストリームは文字単位で読み取りおよび書き込みを行うため、テキスト データを処理するための推奨される方法です。これらは Unicode を使用してエンコードされ、16 ビット文字セットを使用してメモリ内で表現されます。
ファイルリーダーとファイルライター
Java の最も基本的な文字ストリーム クラスは、FileReader と FileWriter です。ファイル リーダー (FileReader) はテキスト ファイルからデータを読み取るために使用され、ファイル ライター (FileWriter) はテキスト ファイルにデータを書き込むために使用されます。
-
アドバンテージ
- テキスト ファイルを扱う場合は、多くの場合、バイト ストリームよりも文字ストリームの方が便利です。
- 手動変換なしの自動コーデック。
-
欠点がある
- バイナリ データを扱う場合、バイト ストリームほど効率的ではありません。
- 写真やビデオなど、すべての種類のファイルを処理できるわけではありません。
-
使用例
- テキスト ファイルの読み取りおよび書き込み操作
- ネットワーク伝送におけるテキストデータの読み書き動作
一般に、バイト ストリームはあらゆる種類のファイルの処理に適していますが、テキスト データを処理する場合は手動でエンコードおよびデコードする必要があります。文字ストリームはテキスト ファイルの処理に適しており、自動的にエンコードおよびデコードされます。したがって、特定の使用シナリオと要件に従って適切なストリームを選択することが非常に重要です。
いつ出力を使用するか、いつ入力を使用するかを区別する方法
この問題は私を長年悩ませており、重要な瞬間に混乱するため、次のように書きました: (ファイルの読み取りおよび書き込みストリームを例にします)
FileInputStream: ファイル入力ストリーム、ファイルからデータを読み取る、メソッド read();
FileOutputStream: ファイル出力ストリーム、ファイルへのデータの書き込み、メソッド write();
上の 2 つの文を思い出してください。理由を尋ねるのではなく、ただ思い出して、完全に思い出したときに理由を尋ねてください。
書き込みメソッド
なぜこの方法がここで個別に取り上げられているのでしょうか? このメソッド自体がチェック例外をスローするため、コンパイル前にそれを処理する必要があります。
Java では、write()
出力ストリームにデータを書き込むためにメソッドが使用されます。メソッド自体は、次のようなさまざまな例外をスローする場合があります。
-
IOException
- 説明: ファイル システム エラーやネットワーク エラーなどの I/O エラーが発生したときにスローされます。
-
NullPointerException
- 説明: パラメータが null の場合にスローされます。
-
IndexOutOfBoundsException
- 説明: 指定されたオフセットと長さが有効なデータの範囲を超える場合にスローされます。
バッファリングされたストリーム オブジェクト (たとえば ) を使用している場合、メソッドをBufferedOutputStream
呼び出しても必ずしも I/O 操作がトリガーされるわけではないことに注意することが重要です。write()
代わりに、データをバッファに保存し、バッファがいっぱいになった場合、またはバッファが手動でフラッシュされた場合にのみ実際の I/O 操作を実行します。この場合、I/O エラーが発生すると、メソッドの呼び出し時ではなく、バッファーのフラッシュ時に例外がスローされる可能性がありますwrite()
。
閉じるメソッド
連想メモリを深くするために、close メソッドを別に取り出していますが、これも例外をスローします。私はいつも彼の例外は単なる null 例外だと思っていました (つまり、ストリーム オブジェクトの値が null の場合、 close を呼び出すと例外がスローされます。) ですが、そうではありません。例として次のコードを取り上げます (次のコードにはエラーがあることに注意してください)。
if(fin!=null){
fin.close();
}
fin.close()だけを書くと例外が発生するので、fin.close()の外側にif判定を追加してもやはり例外が発生するのですが、その後、何かおかしいと思い情報を確認しました。また:
Javaのcloseメソッド自体によってスローされる例外は何ですか
Java では、close()
メソッドはストリームを閉じるために使用されるメソッドです。メソッドが呼び出されるときclose()
、例外が発生してスローされる場合があります。具体的には、close()
メソッド自体がIOException
例外をスローする可能性があります。
IOException
Java におけるチェック例外 (チェック例外) であり、入出力プロセス中に一般的なエラーが発生したことを示します。このメソッドには I/O 操作が含まれるためclose()
、IOException
ストリームを閉じるプロセスで例外がスローされる場合があります。たとえば、ファイル I/O ストリームを使用する場合、IOException
ストリームを閉じる前に読み取り/書き込み操作が完了していない場合、例外が発生する可能性があります。同様に、ネットワーク ソケットを使用する場合、ソケットへのデータの読み取りまたはソケットからのデータの書き込み中にエラーが発生した場合、IOException
ソケットが閉じる前に例外が発生する可能性があります。
したがって、メソッドを使用する場合は、try-catch ステートメントを使用して、スローされる可能性のある例外をキャッチし、適切な例外処理を実行するclose()
必要があります。一般に、リソースが適切に解放されるようにするために、IOException
finally ブロックでメソッドを呼び出すことはclose()
良いプログラミング方法です。例えば:
FileInputStream in = null;
try {
in = new FileInputStream("example.txt");
// ...
} catch (IOException e) {
// 处理异常
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// 处理异常
}
}
}
FileOutputStream (ファイル出力ストリーム)
次に、FileOutputStream について話しましょう。このストリーム オブジェクトは素晴らしいものですが、いくつかの未知の操作があります。
Java では、FileOutputStream
ファイル出力ストリーム オブジェクトを作成するための 2 つのコンストラクターがあり、これら 2 つのコンストラクターのパラメーターは次のとおりです。
-
FileOutputStream(File file)
- パラメータのタイプ:
File
- 説明: 指定されたファイルにデータを書き込むファイル出力ストリーム オブジェクトを作成します。指定されたファイルが存在しない場合は、ファイルの作成が試行されます。
- パラメータのタイプ:
-
FileOutputStream(String name, boolean append)
- パラメータのタイプ:
String name
: ファイル名 (パスを含む)。boolean append
: true の場合、このファイル出力ストリームは追加書き込み用に開かれます。それ以外の場合、ファイルは上書きされます。
- 説明: 指定されたファイルにデータを書き込むファイル出力ストリーム オブジェクトを作成します。指定されたファイルが存在せず、
append
引数が false の場合は、ファイルの作成が試行されます。
- パラメータのタイプ:
FileOutputStream
2 番目のコンストラクターを使用してオブジェクトを 作成する場合は、別のオーバーロードされたコンストラクターを使用してバッファー サイズを設定することもできることに注意してください。例えば:
FileOutputStream fos = new FileOutputStream("example.txt", true);
BufferedOutputStream bos = new BufferedOutputStream(fos, 4096);
上記のコードでは、BufferedOutputStream
のコンストラクター関数はFileOutputStream
オブジェクトと整数パラメーターを入力として受け取ります。この整数はバッファのサイズを表します。バッファ サイズ パラメーターを指定したコンストラクターを使用すると、出力パフォーマンスが向上し、システム コールが削減されます。
FileInputStream (ファイル入力ストリーム)
出力ストリームと比較すると、入力ストリームは比較的単純です: Java では、FileInputStream
ファイル入力ストリーム オブジェクトの作成に使用される 3 つのコンストラクターがあります。これら 3 つのコンストラクターのパラメーターは次のとおりです。
-
FileInputStream(File file)
- パラメータのタイプ:
File
- 説明:指定された file からデータを読み取るファイル入力ストリームオブジェクトを作成します。
- パラメータのタイプ:
-
FileInputStream(String name)
- パラメータのタイプ:
String
- 説明:指定されたパス名 (ファイル名を含む) からデータを読み取るファイル入力ストリームオブジェクトを作成します。
- パラメータのタイプ:
-
FileInputStream(FileDescriptor fdObj)
- パラメータのタイプ:
FileDescriptor
- 説明:指定されたファイル記述子からデータを読み取るファイル入力ストリームオブジェクトを作成します。
- パラメータのタイプ:
FileInputStream
このクラスにはバッファを設定するコンストラクターがないことに注意してください。入力ストリーム オブジェクトをバッファーとともに使用する必要がある場合は、FileInputStream
で使用できますBufferedInputStream
。例えば:
FileInputStream fis = new FileInputStream("example.txt");
BufferedInputStream bis = new BufferedInputStream(fis, 4096);
上記のコードでは、BufferedInputStream
コンストラクターはFileInputStream
オブジェクトと整数パラメーターを入力として受け取ります。この整数はバッファのサイズを表します。バッファ サイズ パラメーターを指定したコンストラクターを使用すると、入力パフォーマンスが向上し、システム コールの数が削減されます。
FileInputStream ファイル入力ストリームでは、パラメーター内のファイルが存在しない場合、例外が直接スローされ、新しいファイルの作成は試行されません。
Java では、FileInputStream
コンストラクターは、ファイルからデータを読み取る入力ストリーム オブジェクトを作成するために使用されます。指定されたファイルが存在しない場合、FileNotFoundException
ファイルの作成は試行されずに例外がスローされます。
したがって、ファイルからの読み取りデータを使用する場合FileInputStream
、そのファイルが存在するかどうか不明な場合は、次の手順に従って例外を回避できます。
- Java
File
またはその他のファイル操作 API のクラスを使用して、ファイルが存在するかどうかを確認します。 - ファイルが存在する場合は、
FileInputStream
コンストラクターを使用して入力ストリーム オブジェクトを作成し、存在しない場合は、適切なエラー処理を実行します。
たとえば、次のコードは、ファイルの存在を確認し、FileInputStream
ファイルから読み取ったデータを使用する方法を示しています。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
File file = new File("example.txt");
if (file.exists()) {
try {
FileInputStream fis = new FileInputStream(file);
// 从输入流中读取数据...
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.err.println("File not found: " + file.getAbsolutePath());
}
}
}
上記のコードでは、まずファイルが存在するかどうかを確認し、存在する場合はFileInputStream
コンストラクターを使用して入力ストリーム オブジェクトを作成し、そこからデータを読み取ります。ファイルが存在しない場合は、エラーメッセージを出力してプログラムを終了します。
FileInputStream
これは既存のファイルの読み取りにのみ使用でき、新しいファイルの作成には使用できないことに 注意してください。新しいファイルを作成する必要がある場合は、FileOutputStream
(または他のファイル操作 API) を使用して出力ストリームを作成し、データを書き込む必要があります。
読み取りメソッドと書き込みメソッド
このパートでは、以下の図からわかるように、読み取りメソッドと書き込みメソッドのパラメーターと戻り値を主に強調します。
-
戻り値:
int
: 実際に読み取られたバイト数を返します。ファイルの終わりに達した場合は -1 を返します。実際のアプリケーションでは、戻り値を使用してデータが読み取られたかどうかを判断します。
- パラメータ
- 空のパラメータは、一度に 1 バイトのデータが読み取られ、その後に他のデータが読み取られることを意味します。
Write メソッドの場合、戻り値はありません。主に一度に 1 バイトずつ書き込むことができるパラメーター、またはバイト配列のデータです。
fou = new FileOutputStream("./2.txt");
fin = new FileInputStream("");
String str = new String("qwertyuiop");
fou.write(2);//write方法本身会抛出异常;一次写入一个字节
fou.write(str.getBytes());//一次写入一个字节数组