본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로프로그래밍 › Java › 기초

Java 줄바꿈 처리

목차

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은 줄 구분자를 자동 변환하지 않는다. 문자 인코딩과 줄 구분자를 정한 뒤 해당 바이트를 쓰는 것이 핵심이다.

같은 카테고리의 글