Javaでファイルを出力して業務を効率化させたいが、基本的なファイル操作や出力の活用方法がわからない方もいます。そのためにまずは、ファイル出力で使用するクラスやメソッドを理解し、ファイル操作の基本を押さえることが大事です。
そこで本記事は、出力方法を中心にファイルの操作方法を取り上げ、ログ管理やデータレポート作成などに使う活用例などを紹介します。
目次
1.Javaでファイルを出力するために必要な基礎知識
Javaではさまざまな実行環境でファイルの入出力ができます。そこで、ファイルを出力したいときに必要となる基礎知識を解説します。
Javaでファイルの出力とは
プログラミングで「ファイル出力」といった場合の意味は、プログラムの実行でファイルに書き込みを行い、ファイル形式を決めた上で保存し、アウトプットすることです。追記や保存場所の確認なども出力作業の一環となります。
例えば、新しいファイルを作成して、「これは新規ファイルです」と書き込み、テキストを保存したとします。つまり、ファイルの出力作業ですが、このプログラムを組んで実行するだけで、それが可能です。
一般的なファイル出力との違いは手動・自動
一般的なファイル出力の意味は、業務や個人で使われるテキストエディタをパソコンのキーボード(外部入力装置)でファイルに手作業で書き込み保存することを指します。
この場合、キーボードからCPUが情報を受け取るのが入力で、その情報をファイルにして取り出すのが出力です。しかし、プログラミングでJavaを使った場合は、これを「データの流れ(ストリーム)」とみなし、実行時に決められた出力を自動で行います。
具体的には、Javaのソースコードに指定した、ファイル作成から保存場所の指定、テキストファイルの保存が完了する工程まで、さまざまな出力作業が自動化されます。
ファイルの種類
Javaを利用したファイルの出力形式には、2つの種類があります。
テキストファイル
バイナリファイル
以下に2種類の特徴を説明します。
テキストファイル
テキストファイルは、事務や個人の日記・ブログなどでもよく使われるテキストに特化したファイル形式です。バイナリファイルを文字コードの解釈で人が読めるようにしています。つまり、テキスト情報を視覚化します。
アプリのデータ取得でよく扱うJSONやCSV、INI、XMLもテキストファイルの一種です。ただし、ファイルを開いて読む際は、OSやソフト環境が扱う文字コードに対応している必要があります。
バイナリファイル
バイナリファイルは、テキストファイルとは対照的に、元の情報をそのまま保存したビット列の塊のデータファイルです。0と1(2進数)やデータ構造の16進数など、情報技術を使って内容をあらわすものです。
主に、画像(JPG・PNG)や音声(WAV・MP3)、動画(AVI、MP4)などの形式で保存されます。例えば、PNG画像は、16進数のバイナリファイルで、英数字の羅列です。そのため、人間がバイナリファイルを見ても画像の内容はわかりません。人間が内容を読み取る場合は、ファイル形式ごとに専用のソフトを指定して開く必要があります。
文字コード
Javaでテキストファイル出力をする際には、状況に応じて文字コードを指定する必要があります。それにはまず、文字コードを理解する必要があります。
文字コードには、Windowsの「Shift_JIS」(拡張後の「MS932」)やMac・Linuxの「UTF-8」、Javaの内部Stringで標準の「UTF-16」などが代表的です。文字コードは、そのコードで表現できる文字や記号のみ扱える形式で、それ以外のデータを扱うことはできません。コード外の記号や特殊文字が文字化けするのはそのためです。
そして、中でも「UTF-8」はASCIIとの互換性が高く、Javaの標準ともなっています。その上で、テキストの出力はバイト単位です。軽くて使いやすいため、JavaのプログラムやWEBアプリケーションで文章を入れたテキストファイルを出力する際は、世界標準となる「UTF-8」が使われています。
Javaの文字コード標準は現在「UTF-8」ですが、以前は起動するOSの設定が適用されていた背景があります。Windowsの場合、「Shift-JIS(拡張後は「MS932」)」です。
現在はUTF-8が標準設定となりましたが、別の文字コードを指定する場合は、ソースコードで文字コードの指定が必要です。UTF-8の場合は、明示する必要がありません。ちなみに、ソースコード内のStringは「UTF-16」(2バイト)で書かれています。
2.Javaでファイル出力の基本的な方法と手順
以下では、Javaのソースコードで基本となるファイル出力の方法を解説します。
ファイルの作成
ファイル出力の基本は、ファイルを新規作成するか、ファイルを指定してそこに書き込むことです。Javaでファイルを出力する場合、「NIO.2」と「Fileクラス」の新旧の方法が使われます。
(旧)基本の「Fileクラス」(API)を使う
(新)Fileクラスに代わる「NIO.2」の使用
書き込みクラスメソッドのnewで初期化して作る
まずは、Fileクラスの「createNewFile()」メソッドを使用する例です。
import java.io.File; import java.io.IOException;
public static void createFile() { File file = new File("newExample.txt");
if (file.createNewFile()) { System.out.println("次のファイルを作成:" + file.getName()); } else { System.out.println("同名のファイルがすでに存在します"); } } catch (IOException e) { System.out.println("エラーの発生"); e.printStackTrace(); } } }
public static void main(String[] args) { FileCreateExample.createFile(); } } |
tryとcatch (IOException e)で例外処理を行う(or 「throws IOException」で例外をスローする)ことが必須となります。これをしないとコンパイル時にエラーとなるため注意が必要です。
「NIO.2」を使用する場合は以下の例です。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths;
public static void createFile() { Path path = Paths.get("newExample.txt");
if (Files.notExists(path)) { Files.createFile(path); System.out.println("次のファイルを作成:" + path.getFileName()); } else { System.out.println("同名のファイルがすでに存在します"); } } catch (IOException e) { System.out.println("エラーの発生"); e.printStackTrace(); } } }
public static void main(String[] args) { FileCreateExample.createFile(); } } |
前者は書き込みメソッドの利用時に「new」の初期化を使用し、後者は「new」を使わずにパスの指定でコードを組めます。例えば、絶対パスで「"C:\\Users\\username\\Desktop\\newExample.txt"」(Windowsの場合)のように指定することも可能です。
上記の方法では、すでにファイルがあった場合、「false」の返り値だけとなるためです。しかし、「FileWriter」などでプログラムを実行した場合、上書きされ間違ってファイルの中身が削除されてしまうことがあります。ファイルクラスと「NIO.2」はその心配がありません。
初心者向けの説明によくある「FileWriter」は簡易な方法ですが、「追記モード(, true)」でないと新規作成時に上書きで中身を削除してしまうのです。
それから、ファイル内容が消えないように、if文の条件を複雑にするのもおすすめできません。新しく作成する場合は、同名ファイルが消えてしまう恐れのある「FileOutputStream」や「PrintWriter」なども使わず、上記の2つの方法を試しましょう。
ファイルに書き込む
新規ファイルを作成したら、次にファイルに書き込みを行います。「FileWriter」や「FileOutputStream」、「PrintWriter」のクラスメソッドを使うなら「追記モード(, true)」です。
書き込むファイルがあることを前提に、基本的なテキストファイルへの書き込みは、以下の「FileWriter」の例が簡単です。
import java.io.FileWriter; import java.io.IOException;
public void writeToFile() { try (FileWriter writer = new FileWriter("newExample.txt", true)) { writer.write("文章をファイルに書き込みました"); System.out.println("文章をファイルに書き込みました"); } catch (IOException e) { System.out.println("ファイルに書き込めませんでした:" + e.getMessage()); } } }
public static void main(String[] args) { FileWriteExample fileWriterExample = new FileWriteExample(); fileWriterExample.writeToFile(); } } |
「FileWriter」ではなく、「FileOutputStream」を利用する場合は、クラス名の変更とバイト対応(text.getBytes()に変更)をします。「PrintWriter」の場合は、同じようにクラス名の変更でメソッド名を「write()」から「println()」に変えるだけです。
これらの「FileWriter」と「PrintWriter」は、テキストファイルの書き込みに向いています。
また、「FileOutputStream」は書き込みメソッドの機能を活用することでバイナリデータの書き込みに対応可能です。それから「NIO.2」でも文字コードを変換してバイナリファイルに書き込むことができます。
ファイルの出力を高速化する
ファイルの出力を高速化するには、バッファリングを活用します。テキストファイルなら「BufferedWriter」のクラス、バイナリファイルなら「BufferedOutputStream」のクラスです。
また、ファイルからのデータを読み込む際は、「BufferedReader」と「BufferedInputStream」を使ってCSVファイルなどからデータ取得も可能です。
以下は、「BufferedWriter」でテキストファイルを出力する例です。
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException;
public void writeToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter("newExampleBuffered.txt", true))) { writer.write("文章をファイルに書き込みました"); writer.newLine(); // 改行 System.out.println("文章をファイルに書き込みました"); } catch (IOException e) { System.out.println("ファイルに書き込めませんでした:" + e.getMessage()); } } }
public static void main(String[] args) { BufferedWriteExample bufferedWriterExample = new BufferedWriteExample(); bufferedWriterExample.writeToFile(); } } |
テキストファイルで文字コードを指定して書き込む方法
「FileOutputStream」では文字コードを指定することが可能です。例えば、Eclipseの場合です。文字コードの設定がデフォルトのままでは、変更しない限り現状の設定が保存されます。
その場合、文字コードをデフォルトのUTF-8やMS932以外に手っ取り早く変えたい場合は、指定するのが確実な方法です。
import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.BufferedWriter; import java.io.IOException;
public static void main(String[] args) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("example_utf8.txt"), "UTF-8"))) { writer.write("UTF-8で書かれたファイル"); System.out.println("UTF-8でファイルに書き込み完了"); } catch (IOException e) { e.printStackTrace(); } } } public class Main { public static void main(String[] args) { Utf8FileWriterExample utf8FileWriter = new Utf8FileWriterExample(); utf8FileWriter.main(args); } } |
また、「NIO.2」を利用する場合は、書き込みのソースコード「.getBytes()」の引数に「StandardCharsets.UTF_8」として指定するだけで文字コードを明示できます。
ファイル操作(コピーや削除、リネームなど)
ファイル操作には、先に紹介した新規作成や上書きだけでなく、コピー、削除、復元、ファイル・ディレクトリの移動、リネーム(名前の上書き)などもあります。基本的にはファイル操作に用意されたメソッドを使って、これらのファイルの操作を行う流れです。
そして、以下の例では、操作用のファイルを作成し、コピー、削除、復元、移動、リネームを実行するソースコードです。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption;
public static void main(String[] args) { createFileIfNotExists("source.txt"); createFileIfNotExists("oldLocation.txt"); createFileIfNotExists("oldName.txt"); createFileIfNotExists("delete.txt"); }
Path path = Paths.get(fileName); if (!Files.exists(path)) { try { Files.createFile(path); System.out.println("ファイルを作成しました: " + fileName); } catch (IOException e) { System.out.println("ファイル作成に失敗しました: " + fileName); e.printStackTrace(); } } } }
public static void copyFile(String source, String destination) { try { Files.copy(Paths.get(source), Paths.get(destination), StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイルをコピーしました:" + source + " → " + destination); } catch (IOException e) { System.out.println("コピーに失敗しました: " + e.getMessage()); e.printStackTrace(); } }
public static void deleteFile(String filePath) { try { if (Files.deleteIfExists(Paths.get(filePath))) { System.out.println("ファイルを削除しました:" + filePath); } else { System.out.println("削除対象のファイルが存在しません:" + filePath); } } catch (IOException e) { System.out.println("削除に失敗しました: " + e.getMessage()); e.printStackTrace(); } }
public static void moveFile(String source, String destination) { try { Files.move(Paths.get(source), Paths.get(destination), StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイルを移動しました:" + source + " → " + destination); } catch (IOException e) { System.out.println("移動に失敗しました: " + e.getMessage()); e.printStackTrace(); } }
public static void renameFile(String oldName, String newName) { try { Files.move(Paths.get(oldName), Paths.get(newName), StandardCopyOption.REPLACE_EXISTING); System.out.println("ファイル名を変更しました:" + oldName + " → " + newName); } catch (IOException e) { System.out.println("リネームに失敗しました: " + e.getMessage()); e.printStackTrace(); } } } |
public class Main { public static void main(String[] args) { FileSetup.main(args); FileOperations.copyFile("source.txt", "copy.txt"); FileOperations.deleteFile("delete.txt"); FileOperations.moveFile("oldLocation.txt", "newLocation.txt"); FileOperations.renameFile("oldName.txt", "newName.txt");
} |
関連記事
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
Java開発環境構築|Windows・Mac・Linux別開発環境手順とおすすめIDEを解説
3.Javaでファイル出力する方法【応用編】
基本的な使い方を押さえたところで、今度はファイル出力の応用的な使い方の紹介です。
売上データの取得とレポートの出力
WEB上で取得したCSVデータを加工して別のCSVや他のファイルで出力することができます。そのため、取得して利用したいデータのファイルを用意することができます。
下記は、CSVのファイルから売上情報を加工してファイルに書き込み、出力する方法です。
import java.io.IOException; import java.nio.file.*; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors;
List<String[]> salesData = Arrays.asList( new String[]{"売上日付", "商品名", "数量", "単価", "合計"}, new String[]{"2025/03/16", "ノートPC", "3", "100000", "300000"}, new String[]{"2025/03/17", "マウス", "5", "2000", "10000"}, new String[]{"2025/03/18", "高性能ヘッドホン", "10", "15000", "150000"} );
String productName = row[1]; int quantity = Integer.parseInt(row[2]); int unitPrice = Integer.parseInt(row[3]); int totalSales = Integer.parseInt(row[4]);
(existing, newSales) -> new ProductSales(existing.getProductName(), existing.getQuantity() + newSales.getQuantity(), existing.getTotalSales() + newSales.getTotalSales())); }
List<ProductSales> sortedBySales = productSalesMap.values().stream() .sorted(Comparator.comparingInt(ProductSales::getTotalSales).reversed()) .collect(Collectors.toList());
ProductSales bestSellingProduct = productSalesMap.values().stream() .max(Comparator.comparingInt(ProductSales::getQuantity)) .orElse(null);
outputData.add(new String[]{"商品名", "売れた数", "売上金額"});
outputData.add(new String[]{ps.getProductName(), String.valueOf(ps.getQuantity()), String.valueOf(ps.getTotalSales())}); }
outputData.add(new String[]{"最も売上の高い商品", highestRevenueProduct.getProductName(), String.valueOf(highestRevenueProduct.getTotalSales())});
try { Files.write(path, outputData.stream() .map(row -> String.join(",", row)) .collect(Collectors.toList()), // 修正: リストに変換 StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.WRITE ); System.out.println("売上レポートCSVを作成しました: " + filePath); } catch (IOException e) { System.out.println("CSV作成中にエラーが発生しました: " + e.getMessage()); } }
private final String productName; private final int quantity; private final int totalSales;
this.productName = productName; this.quantity = quantity; this.totalSales = totalSales; }
return quantity; }
return totalSales; }
return productName; }
public String toString() { return "ProductSales{" + "productName='" + productName + '\'' + ", quantity=" + quantity + ", totalSales=" + totalSales + '}'; } }
String outputCsv = "sales_report.csv"; generateReport(outputCsv); } } |
上記では、商品価格の高い順にソートし、売上の最も高い商品と売れた数が最も多い商品を抽出しています。この2つの内容で加工を施して、どちらも同じCSVファイルに出力するソースコード例となります。
情報がもっと細ければ、さまざまな情報を分析して異なる加工を施したファイルが出力可能です。売上情報以外にも、次のようにログ管理やデータレポート作成のデータ取得とその出力に活用できます。
ログ管理とレポート作成
出力の使い方としてBufferedOutputStreamクラスでログ管理とデータレポート作成を高速処理したのが、以下のソースコード例です。ログのファイルを作成して、その中の「エラー」をキーワードにレポートを作成する簡単なものです。
【先にログのテキストファイル作成】
import java.io.*; import java.util.logging.*;
private static final Logger logger = Logger.getLogger(SimpleLogger.class.getName());
FileHandler fileHandler = new FileHandler("log.txt", true); fileHandler.setFormatter(new SimpleFormatter()); logger.addHandler(fileHandler);
logger.info("処理を開始しています"); int result = 10 / 0; logger.info("処理結果: " + result); } catch (Exception e) { logger.severe("エラーが発生しました: " + e.getMessage()); }
System.err.println("ログファイルの設定中にエラーが発生しました: " + e.getMessage()); } } } |
【ログ管理とレポート作成】
import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.util.*; import java.util.stream.*;
List<String> filteredLogs = new ArrayList<>(); try { Files.lines(Paths.get(logFilePath), StandardCharsets.UTF_8) .filter(line -> line.contains(keyword)) .forEach(filteredLogs::add); } catch (IOException e) { e.printStackTrace(); } return filteredLogs; }
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(reportFilePath), StandardCharsets.UTF_8)) { writer.write("ID,Timestamp,LogMessage\n");
for (String log : filteredLogs) { String[] logParts = log.split(" - "); if (logParts.length == 2) { String timestamp = logParts[0]; String message = logParts[1]; writer.write(id++ + "," + timestamp + "," + message + "\n"); } } System.out.println("レポートを作成しました:" + reportFilePath); } catch (IOException e) { e.printStackTrace(); } }
String logFilePath = "log.txt"; String keyword = "エラー"; String reportFilePath = "log_report.csv";
List<String> filteredLogs = readLogFile(logFilePath, keyword);// フィルタリング generateLogReport(filteredLogs, reportFilePath); // レポート作成 } } public class Main { public static void main(String[] args) { SimpleLogger.main(args); LogProcessor.main(args); } } |
関連記事
JSONをJavaで活用する方法とは?標準APIによるデータの変換・パース・操作から応用の仕方まで解説
【Javaアプリ開発|初心者必見】手順やおすすめの練習方法を教えます!効率化の手段やアプリ例も解説!
4.Javaでファイル出力時のよくある質問
ここでは、Javaでファイルの出力をする際のよくある質問に回答します。
ファイルの入力と出力は何が違う?
ファイルの入力と出力では、単純に使用するクラスが異なり、操作内容も違ってきます。例えば、入力はあるファイルから文字やデータの内容を読み取ってメモリ領域に保持します。プログラムに利用する場合はそのまま処理に使われるものです。しかし、出力はファイルにそれらのメモリ領域のデータを書き出して保存します。
ファイル出力が遅くなる原因は?
ファイル出力に時間がかかる主な原因は、ストリームの処理をせず、毎回ディスクの書き込みが発生するためです。
具体的には「flush()」の多用や高速化のために「FileChannel」を利用した場合などです。特にFileChannelはストリームを利用しないため、小規模で小さい書き込みの頻度が上がると遅くなります。
高速化には、バッファリングを中心に利用するのがおすすめです。
文字コードは結局どれを使えばいい?
文字コードは、Windowsとそれ以外で標準の文字コードが異なるため、テキストファイルの場合はOS環境に合わせて出力することです。
しかし、プログラムで作られたアプリケーションやWEBの世界では「UTF-8」が主流となりす。余計な文字コードも不要となるため、UTF-8で統一するのがおすすめです。
関連記事
【2025年版】Javaの最新バージョン|確認方法やインストール方法を解説
5.まとめ
今回は、Javaでファイルを出力するために必要な基本知識や方法、応用的な使い方まで解説しました。ファイル出力の機能は、ログ管理や売上などのデータ取得やレポート解析などの自動化に活用することができます。
また、ファイル出力処理を効率的に利用するための高速化やさまざまなファイル操作の方法があるため、応用的な使い方と合わせてチェックしましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。