Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9で追加されたInputStream#readNBytes()メソッドの使いどころと実装例

Java 9以降、InputStreamクラスにはreadNBytes()メソッドが追加されました。このメソッドは、入力ストリームから指定されたバイト数(len)のデータを読み込み、引数として渡されたバイト配列に格納します。読み込み処理は、lenバイト分のデータがすべて読み取られるか、ストリームの終端(EOF)が検出されるか、例外がスローされるまでブロックされます。

また、readNBytes()メソッドは呼び出し後に入力ストリームをクローズしません。そのため、ストリームの再利用が可能であり、呼び出し側で明示的にclose()を行う必要があります。さらに、戻り値として実際に読み込めたバイト数が返されるため、EOFに達した場合でも安全に処理を継続できる点が特徴です。

readNBytes()を使うべき場面

従来のread(byte[] b, int off, int len)は、要求したバイト数より少ないデータしか読み込まないことがあり、確実に指定バイト数を読むにはループ処理を書く必要がありました。readNBytes()はその繰り返し処理を内部で吸収してくれるため、次のようなケースで特に有用です。

  • 固定長のヘッダーやチャンク単位でバイナリデータを読み込みたい場合
  • 大容量ファイルを一度にメモリへ読み込まず、少しずつ処理してメモリ不足(OutOfMemoryError)を回避したい場合
  • ネットワークストリームなど、1回のreadでは全データが届かない可能性がある場合

構文

public int readNBytes(byte[] b, int off, int len) throws IOException
  • b: 読み込んだデータを格納するバイト配列
  • off: データの書き込み開始位置(オフセット)
  • len: 読み込む最大バイト数
  • 戻り値: 実際に読み込まれたバイト数(ストリームの終端の場合は0)

使用例

以下の例では、ソースフォルダに「Technology.txt」というファイルを作成し、{ "JAVA", "PYTHON", "JAVASCRIPT", "SELENIUM", "SCALA"} というシンプルなデータを保存しています。このファイルから7バイト分を読み込んで表示します。

import java.io.*;
import java.util.stream.*;
import java.nio.*;
import java.nio.file.*;

public class InputStreamReadNByteMethodTest {
    InputStream inputStream = InputStreamReadNByteMethodTest.class.getResourceAsStream("Technology.txt");

    public void testReadNBytes() throws Exception {
        final byte[] data = new byte[10];
        inputStream.readNBytes(data, 0, 7);
        System.out.println(new String(data));
    }

    public static void main(String args[]) throws Exception {
        InputStreamReadNByteMethodTest t = new InputStreamReadNByteMethodTest();
        t.testReadNBytes();
    }
}

実行結果

"JAVA",

このように、ファイル先頭から正確に7バイト分("JAVA", の部分)だけを読み出せていることが確認できます。readNBytes()を活用することで、指定バイト数の読み込み処理を簡潔かつ安全に記述でき、大規模データを扱うアプリケーションの安定性向上にもつながります。

  1. Javaのpack()メソッドとは?使い方とsetSize()との違いを解説

    pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の

  2. JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説

    JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ