| この記事の要点 |
|
OutputStream とは
OutputStream は ストリームAPI におけるバイト出力ストリームの抽象基底クラスです。InputStream の対になるクラスで、ファイル / ネットワーク / メモリ など、どこに書くかに関わらず「バイトの並びを書き込む」インターフェースを共通化します。
抽象クラスなので直接インスタンス化はできず、用途に応じた具象クラス(FileOutputStream / ByteArrayOutputStream / BufferedOutputStream / PrintStream など)を使います。
主な具象クラス
| クラス | 用途 |
|---|---|
FileOutputStream | ファイルにバイトを書き込む |
BufferedOutputStream | 内部バッファでまとめ書き → 性能改善 |
ByteArrayOutputStream | メモリ上の byte[] に書き込む(テスト・一時バッファ) |
DataOutputStream | プリミティブ型(int, double, UTF 文字列)をバイナリで書く |
ObjectOutputStream | オブジェクトをシリアライズして書く |
PrintStream | System.out でおなじみ。print/println で書く |
FilterOutputStream | 他の OutputStream をラップするデコレータ基底 |
主なメソッド
| メソッド | 説明 |
|---|---|
write(int b) | 1 バイト書き込む(下位 8 ビットだけ使用) |
write(byte[] b) | 配列全体を書き込む |
write(byte[] b, int off, int len) | 配列の指定範囲を書き込む |
flush() | バッファに残ったデータを実際に書き出す |
close() | ストリームを閉じる(自動で flush) |
使用例 1: ファイルに書き込む
import java.io.FileOutputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) {
// try-with-resources で自動 close
try (FileOutputStream fos = new FileOutputStream("out.txt")) {
String text = "Hello, OutputStream!\n";
fos.write(text.getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用例 2: BufferedOutputStream でラップ
1 バイトずつ write(int) を呼ぶと毎回ディスク I/O が発生して遅くなります。BufferedOutputStream で囲むと内部バッファ(既定 8192 バイト)に溜め、満杯になったタイミングでまとめて書き出されるため、桁違いに速くなります。
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedSample {
public static void main(String[] args) {
try (BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("big.bin"))) {
for (int i = 0; i < 1_000_000; i++) {
bos.write(i & 0xFF);
}
// close() 時に自動 flush されるが、明示的に呼びたい場合は:
// bos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用例 3: 追記モード
FileOutputStream の 2 番目の引数 append を true にすると、既存ファイルの末尾に追記されます(既定は false = 上書き)。
try (FileOutputStream fos = new FileOutputStream("log.txt", true)) {
fos.write("追記行\n".getBytes("UTF-8"));
}
使用例 4: OutputStreamWriter でテキスト書き込み
OutputStream は本来バイト用ですが、OutputStreamWriter を被せると String をエンコーディング指定で書けます。さらに BufferedWriter で囲むのが定番です。
import java.io.*;
import java.nio.charset.StandardCharsets;
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("memo.txt"),
StandardCharsets.UTF_8))) {
bw.write("こんにちは");
bw.newLine();
bw.write("OutputStream の世界");
}
InputStream / Writer 系との関係
| 方向 / 単位 | バイト系 | 文字系 |
|---|---|---|
| 入力 | InputStream 系 | Reader 系 |
| 出力 | OutputStream 系 | Writer 系 |
画像・音声・ZIP などのバイナリは OutputStream、ログ・JSON・CSV などのテキストは Writer 系を選ぶのが基本方針です。
flush() と close() の使い分け
| メソッド | 役割 |
|---|---|
flush() | バッファに溜まったデータを実体に押し出す。ストリームは開いたまま |
close() | flush してからストリームを閉じる。OS リソース(ファイルディスクリプタ)を解放 |
長時間動くサーバが「途中まで書いたログがファイルに見えない」場合、たいてい flush 忘れです。try-with-resources を使えば close 時に自動 flush されるので、原則それで足ります。
よくあるエラーと対処
| 症状 | 原因 / 対処 |
|---|---|
FileNotFoundException: ... (アクセスが拒否されました) | 書き込み権限なし / 同名ファイルが他プロセスで開かれている |
| 文字化け | getBytes() の引数 / OutputStreamWriter の文字コード未指定。StandardCharsets.UTF_8 を明示 |
| 書き込み内容が途中までしか出ない | flush / close 忘れ。try-with-resources を使う |
| 巨大ファイルで OOM | byte[] = readAllBytes() 等で全量メモリに載せている。チャンク単位で write(buf, 0, n) ループに置き換える |
関連
- ストリームAPI — 親カテゴリ
- InputStream — 入力側の対概念
- ファイル入出力 — ファイル操作の文脈
子ページはありません
- 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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- MariaDB Monitor (mysql コマンド) の使い方 2026-10-14 15:21:02
- MariaDB の管理ツール (phpMyAdmin / DBeaver 等) 2026-10-14 15:21:02
- Google Custom Search JSON API|新規受付終了・移行期限と既存実装の確認 2026-10-14 14:50:13
- MySQL rootの初期パスワード確認|導入方式・Docker既存DB・復旧の注意 2026-10-14 14:39:34
- MySQL root パスワードの変更方法(ALTER USER / mysqladmin / パスワード忘れ時の復旧) 2026-10-14 14:39:34
- MySQL ALTER USER の使い方|パスワード変更・アカウントロック 2026-10-14 14:39:34
- MySQL ERROR 1129|ホスト遮断の原因・カウンタ・解除前の確認 2026-10-14 14:04:49
- MySQL ERROR 1820・1862|期限切れパスワードの安全な更新と確認 2026-10-14 14:04:49
- MySQL ERROR 1698|ソケット認証・OSユーザー・接続経路の確認 2026-10-14 14:04:49
- mysql_configが見つからない|mysqlclientの旧ビルドとpkg-configの確認 2026-10-14 13:36:32
- MySQLエラー一覧|番号・SQLSTATE別の原因と安全な確認手順 2026-10-14 13:36:32
- インストール直後にNetbeansが反応しない 2026-10-14 13:07:02
- NetBeans でよくあるエラー一覧と対処法 — JDK / Tomcat / PHP / メモリ不足 2026-10-14 13:07:02
- Apache NetBeans入門|起動JDK・プロジェクト作成・関連手順 2026-10-14 13:07:02
- 【Laravel】ページング(ページネーション)をする方法 2026-10-14 12:31:44