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()を活用することで、指定バイト数の読み込み処理を簡潔かつ安全に記述でき、大規模データを扱うアプリケーションの安定性向上にもつながります。
-
Javaのpack()メソッドとは?使い方とsetSize()との違いを解説
pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ