| この記事の要点 |
|
InputStream とは
InputStream は java.io パッケージに含まれる抽象クラスで、バイト単位の入力ストリームを表します。ファイル・ネットワーク・メモリ上のバイト列・標準入力(System.in)など、入力の供給元を抽象化した共通のインタフェースであり、Java の I/O はこのクラスを起点に組み立てます。
「テキスト(文字)」ではなく「バイト」を扱う点が 文字列API 側の Reader と対になります。CSV や JSON のような文字データを読みたい場合は InputStreamReader でラップして文字コードを与えるのが正しい使い方です。
主要メソッド
| シグネチャ | 戻り値 | 説明 |
|---|---|---|
int read() | 0–255 / -1 | 1 バイト読み込む。EOF で -1 |
int read(byte[] b) | 読み込んだバイト数 / -1 | 配列にまとめて読む |
int read(byte[] b, int off, int len) | 読み込んだバイト数 / -1 | オフセット指定で読む |
byte[] readAllBytes() | byte[] | 残りすべてを一括読み込み(Java 9+) |
long skip(long n) | 実際にスキップしたバイト数 | n バイト読み飛ばす |
int available() | 残りの推定バイト数 | ブロックせずに読み出せるバイト数の目安(保証ではない) |
void close() | — | ストリームを閉じる。try-with-resources が自動で呼ぶ |
FileInputStream でファイルを読む
もっとも基本的な実装クラスは FileInputStream です。ファイルを 1 バイトずつ読む例。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
try (InputStream in = new FileInputStream("input.bin")) {
int b;
while ((b = in.read()) != -1) {
System.out.printf("%02X ", b);
}
}
}
}
read() は int を返しますが、有効値は 0–255 です。-1 はEOF(ストリーム末尾)を意味します。
バッファ付きで高速化:BufferedInputStream
1 バイトずつの read() はシステムコールが多発して遅くなります。BufferedInputStream でラップすると内部バッファ(既定 8KB)にまとめて読み込むため、I/O 回数が激減します。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
try (InputStream in = new BufferedInputStream(new FileInputStream("big.bin"))) {
byte[] buf = new byte[4096];
int n;
while ((n = in.read(buf)) != -1) {
// buf[0..n) を処理
}
}
文字列として読みたいときは InputStreamReader
バイトを文字にするには、文字コードを明示して InputStreamReader でブリッジします。BufferedReader と組み合わせると 1 行ずつ読めます。
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
try (InputStream in = new FileInputStream("data.txt");
BufferedReader br = new BufferedReader(
new InputStreamReader(in, StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
文字コードを省略するとプラットフォーム既定(Windows なら Shift_JIS など)になり文字化けの温床になるので、必ず StandardCharsets.UTF_8 を渡してください。
主な実装クラス
| クラス | 供給源 | 用途 |
|---|---|---|
FileInputStream | ファイル | ローカルファイルからバイトを読む |
ByteArrayInputStream | byte[] | メモリ上のバイト配列を InputStream として扱う |
BufferedInputStream | 他の InputStream | バッファリングして高速化 |
DataInputStream | 他の InputStream | プリミティブ型(int / long / UTF-8 文字列)を読む |
ObjectInputStream | 他の InputStream | シリアライズされたオブジェクトを復元 |
GZIPInputStream | 他の InputStream | GZIP 圧縮されたデータを展開しながら読む |
System.in | 標準入力 | コンソールからの入力 |
NIO の Files.newInputStream との使い分け
Java 7 以降は Files.newInputStream(Path) も使えます。FileInputStream よりも例外メッセージが分かりやすく、ストリームAPI と相性が良いため、新規コードはこちらが推奨です。
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
try (InputStream in = Files.newInputStream(Path.of("data.bin"))) {
byte[] all = in.readAllBytes(); // Java 9+
System.out.println("read = " + all.length + " bytes");
}
よくあるミスと対処
| 症状 | 原因 / 対処 |
|---|---|
FileNotFoundException | パス間違い / カレントディレクトリ違い。Path.toAbsolutePath() でログ出力して確認 |
大量の read() で激遅 | BufferedInputStream でラップする / read(byte[]) でまとめ読みする |
| 文字化け | バイトを直接 String 化していないか確認。InputStreamReader に UTF_8 を渡す |
available() の値で配列を確保したのに尻切れ | available() はあくまで「ブロックせず読める数の目安」。残量取得用ではない。readAllBytes() か ByteArrayOutputStream へ詰め直す |
close() 忘れでファイル数上限エラー | 必ず try-with-resources を使う |
関連
子ページはありません
- InputStream
- OutputStream
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09