플랫폼 종속 줄 바꿈 문자는 어떻게 얻습니까?


542

Java에서 플랫폼 종속 줄 바꿈을 어떻게 얻습니까? 나는 "\n"어디에서나 사용할 수 없습니다 .


허용되는 답변을 변경하십시오. 두 번째 답변이 더 적합합니다.
회색

답변:


363

line.separator 특성 외에도 java 1.5 이상 및 String.format (또는 기타 형식화 메소드)을 사용하는 경우 다음 %n과 같이 사용할 수 있습니다 .

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

자세한 내용은 Java 1.8 API for Formatter 를 참조하십시오.


7
감사합니다! 확실합니다 System.getProperty ( "line.separator"); 사용법이 있지만 "Line 1"+ System.getProperty ( "line.separator") + "Line 2"
Buttons840

43
오, "Line 1"+ System.getProperty ( "line.separator") + "Line 2"는 실제로 내가 본 것 중 가장 추악한 것 중 하나입니다. 다른 곳에서 상수를 선언하면 덜 고통 스러울 것입니다.
abahgat

4
적어도 log4j 문으로 들어가는 문자열에서는 작동하지 않습니다. 마지막에 개행 문자를 사용하여 예제를 작성하면 잠재적으로 문제가 숨겨집니다. 또한 문자열 s2는 '%% n'을 사용하여 혼동됩니다.
Stealth Rabbi

6
문자열에 %사용자 입력 내용 이 포함되어 있으면 이것을 사용하지 마십시오 !
Konstantin Weitz

8
@KonstantinWeitz는의 문제를 String.format(s + "%n")쉽게 해결할 수 있습니다 String.format("%s%n", s). 사용자 입력을 형식 본문으로 (와 같은 방식으로 eval()) 포함시키는 것은 항상 위험합니다 .
Franklin Yu

709

Java 7에는 이제 System.lineSeparator()메소드가 있습니다.


8
lineSeperator(int)내가 종종 한 번에 2를 사용하는 것을 알기 때문에 몇 가지 줄 구분자를 반환 하는 오버로드 된 메소드를 제공하는 것이 좋을 것입니다 .
Kon

10
@Kon 이 답변을 바탕으로 :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Java 11 사용 :System.lineSeparator().repeat(5)
Jacob G.

4
@JacobG 칭찬을 멈추십시오 .. 우리 중 일부는 여전히 Java 7에 갇혀 있습니다.
Andrew T

나는 더 나은 직업을 찾을 것 @AndrewTFinnell <- P 없음 컨테이너 -> 더 자바 (11)는, 당신은 더 나은 급여를 위해 머물고있는, 그래서 우리는 - D 고소해 할 수 없다
암자색

649

당신이 사용할 수있는

System.getProperty("line.separator");

줄 구분자를 얻기 위해


4
Java 7 System.lineSeparator()세부 정보 를 추가 하여 여기 에이 질문에 대한 명확한 대답이 있습니까?
회색


31

이것도 가능합니다 : String.format("%n").

또는 String.format("%n").intern()일부 바이트를 저장합니다.


7
이것은 Alex B의 답변과 동일합니다.
Spoike

16
아 이제 알 겠어 그는 그의 대답에 너무 많은 답을 쓰지 않았습니다. ;-)
10

이 작업을 시도했지만 메모장에서 파일을 볼 때 줄 바꿈을 인식하지 못합니다.
mr5

1
@ mr5 notepad는 파일의 내용을 보는 올바른 도구가 아닙니다. hexdump또는을 사용하십시오 od.
12

@ceving 저는 Windows 환경에 있으며 개행은 다음과 같은 조합이 될 것으로 기대했습니다.\r\n
mr5

22

평민 - 랭 라이브러리라는 사용할 수있는 상수 필드가 SystemUtils.LINE_SEPARATOR을


19
예, 플랫폼 독립적 인 새로운 라인을 얻기 위해 타사 라이브러리를 설치하십시오! #facepalm
Shervin Asgari

23
@Shervin은 물론 그렇게하지는 않지만, 내가 작업 한 많은 프로젝트는 이미 commons-lang 및 일부 이전 버전의 Java를 사용하고 있습니다. 따라서 commons-lang을 이미 사용하고 있다면 합리적인 대답입니다. 나는 그것을 지적 할 필요가 없다고 생각했다. 나는 분명히 틀렸다.
lexicalscope

2
이것은 이미이 라이브러리를 사용하고있는 프로젝트에 대한 좋은 제안입니다. 감사합니다!
Alexis Leclerc

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

위의 스 니펫에는 플랫폼에 관계없이 새 줄로 구분 된 두 개의 문자열이 있습니다.



-3

String + String 등을 사용하여 문자열을 추가하지 말고 대신 StringBuilder를 사용하십시오.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
이것은 실제로 대부분의 경우 중요하지 않습니다 코딩 호러의 제프 앳 우드는 마이크로 최적화의이 특정 종류에 대한 블로그 게시물을했다 . "하지 말 것 string + string" 과 같은 주장을하기 전에 항상 메트릭을 수행하십시오 .
Spoike

6
Jeff의 기사는 실행 시간에만 영향을 미치기 때문에 조금 어려울 수 있습니다. Java에서의 문자열 연결은 실행 속도뿐만 아니라 GC를 정리하기 위해 메모리에 얼마나 많은 가비지를 남겼는지에 따라 GC가 더 자주 실행될 수 있습니다. 환경 및 구성에 따라 문제가 될 수도 있고 아닐 수도 있습니다.
Lajcik

7
Lajcik, 나는 실제로 많은 문자열 조작을하는 사람들을 제외한 모든 경우에 사전 최적화 된 것으로 생각합니다. StringBuffer는 작은 연결 요구 사항을위한 안티 패턴입니다. 많은 경우 위에서 언급 한 여러 줄 예제보다 읽을 수있는 String1 + separator + String2를 원합니다. 또한 SB를 추가하여 메모리 및 GC가 긍정적으로 영향을 받는지 테스트하는 것이 좋습니다. 많은 경우에 나는 그렇지 않다고 생각합니다. 테스트 할 가치가 없다면 사전 최적화 된 것이므로 가독성에 중점을 둘 것입니다.
Richard Watson

31
String1 + String2를 수행하는 것은 최신 컴파일러에서 새로운 StringBuilder (String1) .append (String2)를 수행하는 것과 동일하므로 하나의 라이너 문자열 연결에 대한 최적화가 전혀 없습니다. StringBuilder는 일반적으로 루프 또는 재귀 메서드에서만 가치가 있습니다. 그러나 어쨌든 이것은 원래 질문의 범위를 벗어날 수도 있습니다.
user327961

@ user327961 : 실화. 선호하는 IDE와 디버거를 사용하여이를 쉽게 증명할 수 있습니다.
Atmocreations
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.