| この記事の要点 |
|
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・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