Java バイト ストリーム バトル キャラクター ストリーム

目次

Javaバイトストリーム(バイトストリーム)

FileInputStream と FileOutputStream

Java 文字ストリーム (Character Stream)

ファイルリーダーとファイルライター

いつ出力を使用するか、いつ入力を使用するかを区別する方法

書き込みメソッド

閉じるメソッド

Javaのcloseメソッド自体によってスローされる例外は何ですか

FileOutputStream (ファイル出力ストリーム)

FileInputStream (ファイル入力ストリーム)

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()出力ストリームにデータを書き込むためにメソッドが使用されます。メソッド自体は、次のようなさまざまな例外をスローする場合があります。

  1. IOException
    • 説明: ファイル システム エラーやネットワーク エラーなどの I/O エラーが発生したときにスローされます。
  2. NullPointerException
    • 説明: パラメータが null の場合にスローされます。
  3. 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例外をスローする可能性があります。

        IOExceptionJava におけるチェック例外 (チェック例外) であり、入出力プロセス中に一般的なエラーが発生したことを示します。このメソッドには I/O 操作が含まれるためclose()IOExceptionストリームを閉じるプロセスで例外がスローされる場合があります。たとえば、ファイル I/O ストリームを使用する場合、IOExceptionストリームを閉じる前に読み取り/書き込み操作が完了していない場合、例外が発生する可能性があります。同様に、ネットワーク ソケットを使用する場合、ソケットへのデータの読み取りまたはソケットからのデータの書き込み中にエラーが発生した場合、IOExceptionソケットが閉じる前に例外が発生する可能性があります。

        したがって、メソッドを使用する場合は、try-catch ステートメントを使用して、スローされる可能性のある例外をキャッチし、適切な例外処理を実行するclose()必要があります。一般に、リソースが適切に解放されるようにするために、IOExceptionfinally ブロックでメソッドを呼び出すことは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 つのコンストラクターのパラメーターは次のとおりです。

  1. FileOutputStream(File file)

    • パラメータのタイプ:File
    • 説明: 指定されたファイルにデータを書き込むファイル出力ストリーム オブジェクトを作成します。指定されたファイルが存在しない場合は、ファイルの作成が試行されます。
  2. FileOutputStream(String name, boolean append)

    • パラメータのタイプ:
      • String name: ファイル名 (パスを含む)。
      • boolean append: true の場合、このファイル出力ストリームは追加書き込み用に開かれます。それ以外の場合、ファイルは上書きされます。
    • 説明: 指定されたファイルにデータを書き込むファイル出力ストリーム オブジェクトを作成します。指定されたファイルが存在せず、append引数が false の場合は、ファイルの作成が試行されます。

FileOutputStream2 番目のコンストラクターを使用してオブジェクトを        作成する場合は、別のオーバーロードされたコンストラクターを使用してバッファー サイズを設定することもできることに注意してください。例えば:

FileOutputStream fos = new FileOutputStream("example.txt", true);
BufferedOutputStream bos = new BufferedOutputStream(fos, 4096);

        上記のコードでは、BufferedOutputStreamのコンストラクター関数はFileOutputStreamオブジェクトと整数パラメーターを入力として受け取ります。この整数はバッファのサイズを表します。バッファ サイズ パラメーターを指定したコンストラクターを使用すると、出力パフォーマンスが向上し、システム コールが削減されます。

FileInputStream (ファイル入力ストリーム)

出力ストリームと比較すると、入力ストリームは比較的単純です: Java では、FileInputStreamファイル入力ストリーム オブジェクトの作成に使用される 3 つのコンストラクターがあります。これら 3 つのコンストラクターのパラメーターは次のとおりです。

  1. FileInputStream(File file)

    • パラメータのタイプ:File
    • 説明:指定された file からデータを読み取るファイル入力ストリームオブジェクトを作成します
  2. FileInputStream(String name)

    • パラメータのタイプ:String
    • 説明:指定されたパス名 (ファイル名を含む) からデータを読み取るファイル入力ストリームオブジェクトを作成します
  3. 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、そのファイルが存在するかどうか不明な場合は、次の手順に従って例外を回避できます。

  1. JavaFileまたはその他のファイル操作 API のクラスを使用して、ファイルが存在するかどうかを確認します。
  2. ファイルが存在する場合は、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());//一次写入一个字节数组

おすすめ

転載: blog.csdn.net/m0_64231944/article/details/130810967