MENU

Javaの改行処理まとめ!System.lineSeparatorって何?

こんにちは!バックエンドエンジニアのキョンです。今回は、意外と奥が深い「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();
    }
}

まとめ

改行処理は単純そうで奥が深いです。私の経験から、以下のポイントを意識すると良いでしょう:

  1. System.lineSeparatorを使用する
  2. プラットフォームの違いを意識する
  3. 文字列処理の効率を考える
  4. 適切な例外処理を行う

実践的なTips

  • ファイル読み書きではBufferedReader/Writerを使う
  • 大量のテキスト処理ではStringBuilderを使う
  • CSVなど特殊なケースでは改行の扱いに注意する

次回は「Javaでのファイル入出力」について解説する予定です。お楽しみに!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次