【専門家インタビュー】——JavaIO(23の質問)

記事ディレクトリ


ここに画像の説明を挿入します
ここに画像の説明を挿入します

1. Java IO とは何ですか?

Java IO (入力/出力) は、入出力操作を処理するための API であり、プログラムが外部の世界からのデータと対話できるようにします。

2. データ送信方法から IO フローを理解するにはどうすればよいですか?

それは 3 つの異なる次元に沿って分類できます。

• 1. ストリームの方向に従って(プログラムが配置されているメモリの観点から出力と入力が分割されます)
• 入力ストリーム:データのみを読み取ることができます(主に、InputStream と Reader が基底クラスとして使用されます)

• 出力ストリーム: データはそこにのみ書き込むことができます [主に基本クラスとしての OutputStream と Writer]

• 2. フローの操作粒度に応じて分割する

• バイトストリーム: バイトを単位とし、任意のデータを操作できます [主に、InputStream と outPutStream を基本クラスとして使用します]

• 文字ストリーム: 文字を単位として、純粋な文字データのみを操作できるため、より便利です (主に Reader と Writer を基底クラスとして使用)

• 3. フローの役割に応じて分ける

• ノードストリーム: 特定の IO デバイス (ディスク、ネットワークなど) に対してデータを読み書きできるストリーム。[低レベルのストリーム、主に構成されているストリーム] とも呼ばれます。

• 処理ストリーム: 既存のストリームを接続してカプセル化し、カプセル化されたストリームを通じてデータの読み取り/書き込み機能を実現するために使用されます。[アドバンスト ストリーム] とも呼ばれます。

3.Java IO 設計ではどのような設計パターンが使用されますか?

  • 単一責任の原則: これは重要なオブジェクト指向設計原則であり、クラスの責任は 1 つだけである必要があります。Java IO では、異なるクラスが異なる I/O 操作を担当します。たとえば、InputStream はバイトの読み取りを担当し、OutputStream はバイトの書き込みを担当します。これは単一責任の原則に沿っています。
  • デコレータ パターン: Java IO のバッファされたストリーム (BufferedReader や BufferedWriter など) とフィルタされたストリーム (GZIPInputStream や GZIPOutputStream など) はデコレータ パターンを採用します。これらのクラスは、継承による拡張ではなく、合成を通じて I/O ストリームの機能を強化します。
BufferedReader br = new BufferedReader(new FileReader("file.txt"));

ここで、BufferedReader は FileReader を装飾して、バッファリングされた読み取りの機能を提供します。

  • ストラテジー パターン: Java IO ライブラリの Charset クラスと CharsetEncoder/CharsetDecoder クラスは、ストラテジー パターンを採用します。これらを使用すると、さまざまな文字エンコード戦略に従って文字をエンコードおよびデコードできます。
Charset utf8 = Charset.forName("UTF-8");
CharsetEncoder encoder = utf8.newEncoder();

ここで、Charset オブジェクトはストラテジ オブジェクトとして機能し、CharsetEncoder はさまざまなストラテジに従ってエンコード操作を実行します。

  • オブザーバー パターン: Java IO ライブラリの File や DirectoryStream などのクラスを使用して、ファイル システム内のファイルとディレクトリを監視できます。これらのクラスを使用すると、オブザーバー パターンに準拠して、ファイル システム イベントをリッスンするオブザーバーを登録できます。
Path directory = Paths.get("my_directory");
WatchService watchService = FileSystems.getDefault().newWatchService();
directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

ここで、WatchService はオブザーバーとして機能し、ファイル システム内のファイルの作成イベントを監視します。

4. Java NIO とは何ですか?

Java NIO: 同期および非ブロッキング、サーバー実装モードは 1 つのリクエストと 1 つのスレッドです。つまり、クライアントによって送信された接続リクエストはマルチプレクサーに登録され、マルチプレクサーは I/O がある場合にのみ起動します。接続上のリクエスト。スレッドが処理されます。

5.BIOはいつですか?

Java BIO: 同期とブロッキング、サーバーの実装モードは 1 つの接続と 1 つのスレッドです。つまり、クライアントが接続リクエストを持っている場合、サーバーは処理のためにスレッドを開始する必要があります。接続が何も行わない場合、もちろん、スレッド プールのメカニズムによって、不要なスレッド オーバーヘッドを改善することもできます。

6.AIOとは何ですか?

Java AIO (NIO.2): 非同期かつノンブロッキング、サーバー実装モードは 1 つの有効なリクエストと 1 つのスレッドです。クライアントの I/O リクエストは最初に OS によって完了し、その後、サーバー アプリケーションに処理用のスレッドを開始するように通知します。 。

7.同期 IO と非同期 IO についてどのように理解していますか?

  • 同期 I/O:
    ブロック モード: 同期 I/O では、I/O 操作が開始されると、操作が完了するかエラーが発生するまで、呼び出し元のスレッドはブロックされます。これは、スレッドが永久に待機し、他のタスクを実行できないことを意味します。
    順次実行:同期 I/O 操作は通常、開始された順序で順次実行されます。各操作は、続行する前に、前の操作が完了するまで待つ必要があります。
    リソース使用量: 同期 I/O では、各 I/O 操作を処理するためにスレッドを割り当てる必要があり、同時接続の数が多い場合、大量のスレッド リソースが消費されます。

  • 非同期 I/O:
    ノンブロッキング モード: 非同期 I/O では、I/O 操作が開始されると、呼び出し元のスレッドはブロックされず、操作の完了を待たずに他のタスクの実行を続けることができます。
    同時実行性: 非同期 I/O では、複数の I/O 操作を同時に開始し、バックグラウンドで処理できるため、同時実行性が高くなります。
    コールバック メカニズム: 非同期 I/O は通常、コールバック関数を使用して I/O 操作の完了通知を処理します。I/O 操作が完了すると、システムはスレッドを待つ代わりに、事前に登録されたコールバック関数を呼び出します。
    複雑さ: 非同期 I/O プログラミングは、コールバック関数や状態管理などの複雑な問題に対処する必要があるため、比較的複雑です。

8.ブロッキング IO とノンブロッキング IO について何を理解していますか?

IO のブロック: スレッドが I/O 操作を実行すると、操作が完了するまでスレッドをブロックします。
ノンブロッキング IO: 呼び出しスレッドはブロックされず、操作の完了を待たずに他のタスクの実行を続けることができます。1 つのスレッドで複数のチャネル (接続) を管理できるようにします。

9.IO の入力ストリームと出力ストリームの違いは何ですか?

10.バイトストリームと文字ストリームの違いは何ですか?

回答: バイト ストリームを読み取る場合、1 バイトを読み取った後に 1 バイトが返されます。バイト ストリームは、バイト ストリームを使用して 1 つ以上のバイトを読み取ります (中国語の対応するバイト数は 2 で、UTF-8 コード テーブルでは次のとおりです)。 3バイト)の時間。まず、指定されたエンコード テーブルをチェックし、見つかった文字を返します。バイトストリームは写真、MP3、AVIビデオファイルなど様々な種類のデータを扱うことができますが、キャラクターストリームは文字データのみを扱うことができます。プレーン テキスト データが処理される限り、バイト ストリームに加えて文字ストリームを最初に使用する必要があります。バイトストリームはバイトと配列を標準としたバイト型データを主に操作します 主な操作カテゴリはOutputStreamとInputstreamです 文字ストリームの処理単位は2バイトのUnicode文字で それぞれ文字、文字配列、文字列を操作します バイトストリーム処理ユニット 1 は、バイト配列の複数のバイトを操作します。したがって、文字ストリームは Java でバイトを仮想マシンに変換することによって作成されます。2 バイトの Unicode 文字は単位文字であるため、複数の言語を十分にサポートします。オーディオ ファイル、画像、曲の場合は、バイト ストリームを使用するのが最適です。中国語(テキスト)に関連する場合は、文字ストリームを使用することをお勧めします。プログラムでは、1 文字は 2 バイトに相当します。Java には、文字ストリームの操作に特化した Reader と Writer という 2 つのカテゴリが用意されています。

11.Java トラフィックには何種類ありますか?

回答:
(1) フローの方向に従って: 入力ストリーム (inputStream) と出力ストリーム (outputStream);
(2) 実装関数に従って: ノード ストリーム (特定の場所 (ノード) に対してデータの読み書きが可能)。 FileReader など)と処理ストリーム(既存のストリームを接続してカプセル化し、カプセル化されたストリームの関数を呼び出すことでデータの読み書きを実現します。BufferedReader など)。ストリームを処理する構造メソッドは常に他のストリーム オブジェクトをパラメータとして受け取ります。ストリーム オブジェクトは他のストリームによって複数回パッケージ化されます (ストリーム リンクと呼ばれます);
(3) データ処理の単位に従って: バイト ストリームと文字ストリーム。バイトストリームのInputStreamとOutputStreaを継承し、InputStreamreaderは文字ストリームとOutputStreamWriterを継承します。

12.バイトストリームを文字ストリームに変換するにはどうすればよいですか?

回答: バイト入力フロー 文字入力フロー InputStreamReader この構造関数は、InputStream オブジェクトを実装および送信できます。
バイト出力ストリームと文字出力ストリームは、OutputStreamWriter 構造体関数を通じて実装および送信できます。

13.Java オブジェクトをファイルにシリアル化するにはどうすればよいですか?

回答: Java でシリアル化できるクラスは、まず Serializable インターフェイスを実装する必要があります。抽象メソッドはありませんが、マーカーとしてのみ機能します。

  public class Test {
    
    
        public static void main(String[] args) throws Exception {
    
    
            // 对象输出流
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D://obj")));
            objectOutputStream.writeObject(new User("zhangsan", 100));
            objectOutputStream.close();
            // 对象输入流
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D://obj")));
            User user = (User) objectInputStream.readObject();
            System.out.println(user);
            objectInputStream.close();
        }
    }

14.Java シリアル化とは何ですか?

回答: シリアル化は、オブジェクト ストリームを処理するためのメカニズムです。いわゆるオブジェクト ストリームは、ストリーミング オブジェクトのコンテンツです。ストリーミングされたオブジェクトは読み取りと書き込みが可能で、ネットワーク間で転送することもできます。シリアル化は、オブジェクト ストリームの読み取りおよび書き込み操作によって発生する問題を解決することです。

15.Java シリアル化を実装するにはどうすればよいですか?

回答: シリアル化を実装するには、シリアル化クラス Serializable インターフェイスを実装する必要があります。このインターフェイスには実装されたメソッドはありません。Serializable の実装は、オブジェクトをシリアル化可能としてマークし、出力ストリーム (ファイル出力ストリームなど) を使用して、 Object Output Stream. ) オブジェクトを構築し、次に Object Output Stream オブジェクトの write Object(Object obj) メソッドを使用して、obj オブジェクトを書き込みます (つまり、その状態を保存します)。復元したい場合は、入力を使用します。ストリーム。

16.フィルターストリームとは何ですか?

回答: フィルター ストリームは IO ストリームの主な機能であり、ソース ファイルに存在しない行をターゲット ファイルに追加したり、パフォーマンスをコピーしたりするなど、既存のトラフィックに追加機能を追加するために使用されます。

17.どのようなフィルター ストリームが利用可能ですか?

回答: http://java では、ストリームは主に 4 つの利用可能なフィルター パッケージで構成されます。2 バイトのフィルター ストリーム、2 文字のフィルター ストリーム。フィルター入力ストリーム、フィルター出力ストリーム、フィルター リーダー、およびフィルター ライターです。これらのカテゴリは抽象的なため、インスタンス化できません。

18.java.io.Serializableインターフェイスについて説明しますか?

回答: そのシリアル化機能は、クラス java.io.Serializable のインターフェースを実装することで有効にできます。このインターフェイスを実装していないクラスは、その状態をシリアル化または逆シリアル化できません。

19.オブジェクトのクローン作成を実装するにはどうすればよいですか?

回答: 2 つの方法があります (1) Cloneable インターフェイスを実装し、Object クラスの clone() メソッドをオーバーライドします。 (2) Serializable インターフェイスを実装して、オブジェクトのシリアル化と逆シリアル化を通じて真のディープ クローン作成を実現します。

20.Java の入力ストリームと出力ストリームの違いは何ですか?

入力ストリームはデータ ソース (ファイルやネットワークなど) からデータを読み取るために使用され、出力ストリームはデータを宛先 (ファイルやネットワークなど) に書き込むために使用されます。

21.Java にはストリームの種類が何種類ありますか?

文字ストリームとバイトストリームに分かれます。

22. データ操作の観点から IO フローを理解するにはどうすればよいですか?

ここに画像の説明を挿入します

23. BIO、NIO、AIO の違いと、それらに適用できるシナリオは何ですか?

  • BIO (ブロッキング I/O):
    ブロッキング モデル: BIO はブロッキング モデルに基づく I/O 操作です。つまり、スレッドが I/O 操作を実行すると、操作が完了するまでブロックされます。
    同期性: BIO では、すべての I/O 操作が同期され、1 つのスレッドが完了するまで接続に対して読み取りまたは書き込みを行います。
    適用性: 接続数が少なく、各接続のデータ対話が頻繁であるが、同時実行性の高い環境ではパフォーマンスが良くない状況に適しています。

  • NIO (ノンブロッキング I/O):
    ノンブロッキング モデル: NIO はノンブロッキング モデルを採用しており、1 つのスレッドで複数のチャネル (接続) を管理できます。
    セレクター: NIO ではセレクターの概念が導入され、スレッドはセレクターを通じて、読み取り準備完了、書き込み準備完了などの複数のチャネル上のイベントを監視できます。
    バッファ: NIO はバッファを使用してデータを保存します。これにより、I/O 効率が向上します。
    適用性: Web サーバーなど、多数の接続を処理する必要があり、接続数は多いものの、各接続のデータ対話が比較的小さい状況に適しています。

  • AIO (非同期 I/O):
    非同期モデル: AIO は非同期モデルを採用しています。これにより、I/O 操作の実行時にスレッドがブロックされず、操作の完了時にアプリケーションに通知されます。
    コールバック メカニズム: AIO はコールバック メカニズムを使用して、I/O 操作の完了の通知を処理します。
    適用性: 接続ごとのデータ インタラクションを少なくして多数の接続を処理する必要があり、CPU のマルチコア パフォーマンスを最大限に活用したい状況に適しています。

  • さまざまな I/O モデルの適用可能なシナリオを要約すると、
    BIO は、接続数が少なく、各接続でのデータ対話が頻繁に行われる状況には適していますが、同時実行性の高い環境には適していません。
    NIO は、多数の接続を処理する必要があるが、各接続のデータ相互作用が比較的小さく、パフォーマンスとリソース使用率が向上する状況に適しています。
    AIO は、接続ごとのデータ インタラクションを少なくして多数の接続を処理する必要があり、CPU のマルチコア パフォーマンスを最大限に活用したい状況に適しています。
    適切な I/O モデルの選択はアプリケーションの特性とニーズによって異なり、モデルが異なれば提供されるパフォーマンスとスケーラビリティも異なります。

おすすめ

転載: blog.csdn.net/qq_42785250/article/details/132973244