자바 멀티 라인 문자열 소스 코드에서 여러 줄로

펄에서 왔을 때, 소스 코드에서 여러 줄로 된 문자열을 만드는 “여기 문서”라는 수단이 빠져 있습니다.

$string = <<"EOF"  # create a three-line string
text
text
text
EOF

Java에서는 여러 줄 문자열을 처음부터 연결할 때 모든 줄에 번거로운 따옴표와 더하기 부호가 있어야합니다.

더 나은 대안은 무엇입니까? 속성 파일에서 문자열을 정의 하시겠습니까?

편집 : 두 답변은 StringBuilder.append ()가 더하기 표기법보다 바람직하다고 말합니다. 왜 그렇게 생각하는지 궁금해 할 수 있습니까? 그것은 나에게 더 바람직하지 않습니다. 여러 줄 문자열이 일류 언어 구성이 아니라는 사실을 피할 수있는 방법을 찾고 있습니다. 즉, 일차 언어 구성 (문자열 연결 플러스)을 메서드 호출로 바꾸고 싶지 않습니다.

편집 : 내 질문을 더 명확히하기 위해 성능에 전혀 관심이 없습니다. 유지 관리 및 디자인 문제가 걱정됩니다.



답변

Stephen Colebourne은 Java 7에서 여러 줄 문자열을 추가 하기 위한 제안 을 만들었습니다 .

또한 Groovy는 이미 여러 줄 문자열을 지원합니다 .


답변

Java에는 존재하지 않는 여러 줄 리터럴을 수행하려는 것 같습니다.

가장 좋은 대안은 +함께 묶인 문자열이 될 것 입니다. 사람들이 언급 한 다른 옵션 (StringBuilder, String.format, String.join)은 문자열 배열로 시작한 경우에만 선호됩니다.

이걸 고려하세요:

String s = "It was the best of times, it was the worst of times,\n"
         + "it was the age of wisdom, it was the age of foolishness,\n"
         + "it was the epoch of belief, it was the epoch of incredulity,\n"
         + "it was the season of Light, it was the season of Darkness,\n"
         + "it was the spring of hope, it was the winter of despair,\n"
         + "we had everything before us, we had nothing before us";

StringBuilder:

String s = new StringBuilder()
           .append("It was the best of times, it was the worst of times,\n")
           .append("it was the age of wisdom, it was the age of foolishness,\n")
           .append("it was the epoch of belief, it was the epoch of incredulity,\n")
           .append("it was the season of Light, it was the season of Darkness,\n")
           .append("it was the spring of hope, it was the winter of despair,\n")
           .append("we had everything before us, we had nothing before us")
           .toString();

String.format():

String s = String.format("%s\n%s\n%s\n%s\n%s\n%s"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

Java8 대 String.join():

String s = String.join("\n"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

당신이 사용하려면 하나 필요 특정 시스템에 대한 줄 바꿈을 원하는 경우에 System.lineSeparator(), 또는 당신이 사용할 수 있습니다 %n에서 String.format.

또 다른 옵션은 리소스를 텍스트 파일에 넣고 해당 파일의 내용을 읽는 것입니다. 클래스 파일이 불필요하게 부풀어 오르는 것을 피하기 위해 매우 큰 문자열에 바람직합니다.


답변

따옴표 이내에서 여러 줄을 문자열 (환경 설정> 자바> 편집기> 입력) “문자열 리터럴에 붙여 넣을 때 탈출 텍스트”및 붙여 넣기 이클립스에서는이 옵션을 설정하면, 자동으로 추가됩니다 "\n" +모두를위한 당신의 라인.

String str = "paste your text here";

답변

이것은 오래된 스레드이지만 새로운 우아한 솔루션 (4 ~ 3 개의 작은 단점이 있음)은 사용자 정의 주석을 사용하는 것입니다.

확인 : http://www.adrianwalker.org/2011/12/java-multiline-string.html

이 작업에서 영감을 얻은 프로젝트는 GitHub에서 호스팅됩니다.

https://github.com/benelog/multiline

Java 코드의 예 :

import org.adrianwalker.multilinestring.Multiline;
...
public final class MultilineStringUsage {

  /**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

  public static void main(final String[] args) {
    System.out.println(html);
  }
}

단점은

  1. 해당 (제공된) 주석 프로세서를 활성화해야합니다.
  2. 해당 문자열 변수를 로컬 변수로 정의 할 수 없음 변수를 로컬 변수로 정의 할 수있는 원시 문자열 리터럴 프로젝트 확인
  3. 해당 문자열에는 Visual Basic .Net에서와 같이 XML 리터럴 ( <%= variable %>) 이있는 다른 변수를 포함 할 수 없습니다.
  4. 해당 문자열 리터럴은 JavaDoc 주석 (/ **)으로 구분됩니다.

그리고 Javadoc 주석을 자동으로 다시 포맷하지 않도록 Eclipse / Intellij-Idea를 구성해야합니다.

이 이상한 것을 발견 할 수도 있습니다 (Javadoc 주석은 주석 이외의 것을 포함하도록 설계되지 않았습니다). 그러나 Java에 여러 줄 문자열이 부족하기 때문에 결국 성가 시므로 이것이 최악의 해결책이라고 생각합니다.


답변

다른 옵션은 긴 문자열을 외부 파일에 저장하고 파일을 문자열로 읽는 것입니다.


답변

이것은 당신이 하고있는 일에 대해 생각하지 않고 절대로 사용 해서는 안되는 것입니다 . 그러나 일회성 스크립트의 경우 이것을 큰 성공으로 사용했습니다.

예:

    System.out.println(S(/*
This is a CRAZY " ' ' " multiline string with all sorts of strange
   characters!
*/));

암호:

// From: http://blog.efftinge.de/2008/10/multi-line-string-literals-in-java.html
// Takes a comment (/**/) and turns everything inside the comment to a string that is returned from S()
public static String S() {
    StackTraceElement element = new RuntimeException().getStackTrace()[1];
    String name = element.getClassName().replace('.', '/') + ".java";
    StringBuilder sb = new StringBuilder();
    String line = null;
    InputStream in = classLoader.getResourceAsStream(name);
    String s = convertStreamToString(in, element.getLineNumber());
    return s.substring(s.indexOf("/*")+2, s.indexOf("*/"));
}

// From http://www.kodejava.org/examples/266.html
private static String convertStreamToString(InputStream is, int lineNum) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null; int i = 1;
    try {
        while ((line = reader.readLine()) != null) {
            if (i++ >= lineNum) {
                sb.append(line + "\n");
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return sb.toString();
}

답변

String.join

Java 8 java.lang.String은 약간 더 나은 대안을 제공 하는 새로운 정적 메소드를 추가했습니다 .

String.join(
CharSequence delimiter ,
CharSequence... elements
)

그것을 사용 :

String s = String.join(
    System.getProperty("line.separator"),
    "First line.",
    "Second line.",
    "The rest.",
    "And the last!"
);