こんにちは!バックエンドエンジニアのキョンです。今回は、意外と奥が深い「Javaでの改行処理」について、実務での経験を交えながら詳しく解説していきます。
目次
1. Javaでの改行の基本
改行文字とは?
入社当時、私も「\n」だけ使ってました(笑) 実は、OSによって改行コードが違うんです:
- Windows: \r\n (CRLF)
- Unix/Linux: \n (LF)
- 古いMac: \r (CR)
基本的な改行の書き方
public class NewlineExample {
public static void main(String[] args) {
// 方法1: システムデフォルトの改行
String newline1 = System.lineSeparator();
// 方法2: プラットフォーム依存の改行
String newline2 = System.getProperty("line.separator");
// 方法3: 直接指定(非推奨)
String newline3 = "\n";
// 実際の使用例
System.out.println("こんにちは" + newline1 + "さようなら");
}
}
2. プラットフォーム別の違い
OSごとの違いへの対応
実務でよく遭遇するケースです:
public class PlatformNewline {
public static String normalizeNewlines(String text) {
// すべての改行コードを統一
return text.replaceAll("\\r\\n|\\r|\\n", System.lineSeparator());
}
public static void main(String[] args) {
String mixedText = "Hello\rWorld\r\nJava\n";
System.out.println(normalizeNewlines(mixedText));
}
}
3. 実践的な改行処理
ファイル読み書きでの改行処理
実際のプロジェクトでよく使用するパターンです:
public class FileProcessor {
public void writeWithNewlines(String filePath, List<String> lines) {
try (BufferedWriter writer = new BufferedWriter(
new FileWriter(filePath))) {
for (String line : lines) {
writer.write(line);
writer.write(System.lineSeparator());
}
} catch (IOException e) {
logger.error("ファイル書き込みエラー", e);
}
}
public List<String> readLines(String filePath) {
List<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
} catch (IOException e) {
logger.error("ファイル読み込みエラー", e);
}
return lines;
}
}
文字列処理での改行
public class StringProcessor {
public String formatMultilineText(String text) {
// 改行で分割して処理
return Arrays.stream(text.split(System.lineSeparator()))
.map(String::trim)
.filter(line -> !line.isEmpty())
.collect(Collectors.joining(System.lineSeparator()));
}
public int countLines(String text) {
if (text == null || text.isEmpty()) {
return 0;
}
return text.split(System.lineSeparator()).length;
}
}
4. よくあるトラブルと対策
改行コードの混在問題
public class NewlineFixer {
// 改行コードの正規化
public String fixNewlines(String text) {
// まずCRLFをLFに変換
String normalized = text.replace("\r\n", "\n");
// 次にCRをLFに変換
normalized = normalized.replace("\r", "\n");
// 最後にシステムの改行コードに変換
return normalized.replace("\n", System.lineSeparator());
}
}
CSVファイルでの改行処理
public class CsvProcessor {
public List<String[]> readCsvWithNewlines(String filePath) {
List<String[]> records = new ArrayList<>();
try (CSVReader reader = new CSVReader(new FileReader(filePath))) {
String[] record;
while ((record = reader.readNext()) != null) {
// 各フィールド内の改行を処理
record = Arrays.stream(record)
.map(field -> field.replace("\r\n", " "))
.toArray(String[]::new);
records.add(record);
}
} catch (IOException e) {
logger.error("CSV読み込みエラー", e);
}
return records;
}
}
5. パフォーマンスの考慮点
文字列連結での改行
// 悪い例:String連結
public class StringConcatenation {
public String badExample(List<String> lines) {
String result = "";
for (String line : lines) {
result += line + System.lineSeparator(); // 非効率
}
return result;
}
// 良い例:StringBuilder使用
public String goodExample(List<String> lines) {
StringBuilder sb = new StringBuilder();
for (String line : lines) {
sb.append(line).append(System.lineSeparator());
}
return sb.toString();
}
}
まとめ
改行処理は単純そうで奥が深いです。私の経験から、以下のポイントを意識すると良いでしょう:
- System.lineSeparatorを使用する
- プラットフォームの違いを意識する
- 文字列処理の効率を考える
- 適切な例外処理を行う
実践的なTips
- ファイル読み書きではBufferedReader/Writerを使う
- 大量のテキスト処理ではStringBuilderを使う
- CSVなど特殊なケースでは改行の扱いに注意する
次回は「Javaでのファイル入出力」について解説する予定です。お楽しみに!
コメント