목차
Java 줄바꿈 처리
자바에서 OutputStream으로 텍스트 파일을 저장했을 때, 사용하던 Windows 편집기에서는 \n만 넣은 파일의 줄이 나뉘어 보이지 않았다.
(난 OutputStream시리즈로만 시도했엇으니까..)

(그림 1) \n으로 저장한 파일을 당시 Windows 편집기에서 연 결과
유닉스 계열은 보통 LF(\n), Windows의 일반적인 텍스트 파일은 CRLF(\r\n)를 줄 구분자로 사용한다. 다만 최근 편집기는 LF 파일도 정상적으로 표시할 수 있다. 프로그램이 기록한 바이트와 파일을 여는 도구를 구분해서 확인해야 한다.

(그림 2) \r\n으로 저장해 줄이 나뉘어 보이는 결과
운영체제 기본 줄 구분자를 사용할 때
System.out.format("첫째 줄%n둘째 줄%n")의%n은 실행 환경의 줄 구분자를 콘솔에 출력한다. 파일 쓰기와는 별개다.System.lineSeparator()는 실행 환경의 기본 줄 구분자 문자열을 반환한다.- 파일에 여러 줄을 쓰려면
BufferedWriter.newLine()을 사용할 수 있다.
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
Path path = Path.of("memo.txt");
try (var writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write("첫째 줄");
writer.newLine();
writer.write("둘째 줄");
}
이 코드는 UTF-8로 텍스트를 쓰고, 실행 중인 운영체제에 맞는 줄 구분자를 넣는다. System.lineSeparator()와 BufferedWriter.newLine()의 동작은 Java API 문서에서 확인할 수 있다.
파일 형식에서 줄 구분자를 지정할 때
운영체제 기본값보다 상대 시스템과 약속한 파일 형식이 우선이다. LF가 필요하면 "\n", CRLF가 필요하면 "\r\n"을 명시한다. 기존 문자열의 \n을 무조건 \r\n으로 치환하면 이미 CRLF였던 부분은 \r\r\n이 될 수 있다. 먼저 줄 구분자를 한 종류로 정규화한다.
String normalized = text.replace("\r\n", "\n").replace('\r', '\n');
String windowsText = normalized.replace("\n", "\r\n");
OutputStream은 줄 구분자를 자동 변환하지 않는다. 문자 인코딩과 줄 구분자를 정한 뒤 해당 바이트를 쓰는 것이 핵심이다.