571

Perlから来て、ソースコードで複数行の文字列を作成する「ヒアドキュメント」の手段が欠けていることは確かです:

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

Java では、複数行の文字列を最初から連結するときに、すべての行に面倒な引用符とプラス記号を付ける必要があります。

より良い代替手段は何ですか?プロパティ ファイルで文字列を定義しますか?

編集:2つの答えは、プラス表記よりも StringBuilder.append() の方が望ましいと言っています。なぜそう思うのか、誰か詳しく説明してもらえますか? それは私にはまったく好ましいようには見えません。複数行の文字列がファーストクラスの言語構造ではないという事実を回避する方法を探しています。つまり、ファーストクラスの言語構造 (文字列連結とプラス) をメソッド呼び出しに置き換えたくないということです。

編集:私の質問をさらに明確にするために、パフォーマンスについてはまったく心配していません。保守性と設計上の問題が心配です。

4

44 に答える 44

535

:この回答は、Java14以前に適用されます。

テキストブロック(複数行リテラル)はJava 15で導入されました。詳細については、この回答を参照してください。


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()ます。%nString.format

もう1つのオプションは、リソースをテキストファイルに入れて、そのファイルの内容を読み取ることです。これは、クラスファイルが不必要に肥大化するのを防ぐために、非常に大きな文字列に適しています。

于 2009-05-18T16:57:04.967 に答える
193

Eclipse では、「文字列リテラルに貼り付けるときにテキストをエスケープする」オプションをオンにして ([設定] > [Java] > [エディター] > [入力] で)、複数行の文字列を引用符で囲んで貼り付ける"\n" +、すべての行に対して自動的に and が追加されます。

String str = "paste your text here";
于 2011-10-10T17:07:02.957 に答える
123

Stephen Colebourne は、Java 7 で複数行の文字列を追加するための提案を作成しました。

また、Groovy はすでに複数行の文字列をサポートしています。

于 2009-05-18T17:47:24.820 に答える
102

これは古いスレッドですが、新しい非常に洗練されたソリューション(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. その文字列変数をローカル変数として定義することはできません変数をローカル変数として定義できる RawStringLiteralsプロジェクトを確認してください
  3. その文字列には、XMLリテラル(<%= variable %>)を使用したVisualBasic.Netのように他の変数を含めることはできません:-)
  4. その文字列リテラルはJavaDocコメント(/ **)で区切られています

また、Javadocコメントを自動的に再フォーマットしないようにEclipse/Intellij-Ideaを構成する必要があります。

これは奇妙に感じるかもしれませんが(Javadocコメントはコメント以外のものを埋め込むようには設計されていません)、Javaに複数行の文字列がないことは最終的には本当に厄介なので、これが最悪の解決策であることがわかります。

于 2012-08-01T07:46:34.133 に答える
65

もう 1 つのオプションは、長い文字列を外部ファイルに保存し、そのファイルを文字列に読み込むことです。

于 2009-05-18T16:38:29.530 に答える
60

これは、何をしているのかを考えずに使用してはならないものです。しかし、1 回限りのスクリプトについては、これを使用して大成功を収めました。

例:

    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();
}
于 2009-11-03T15:55:30.027 に答える
59

String.join

Java 8java.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!"
);
于 2014-07-17T12:12:02.807 に答える
19

プロパティファイルで文字列を定義すると、見た目がさらに悪くなります。IIRC では、次のようになります。

string:text\u000atext\u000atext\u000a

一般に、大きな文字列をソースに埋め込まないことは合理的な考えです。それらをリソースとして、おそらく XML または読み取り可能なテキスト形式でロードしたい場合があります。テキスト ファイルは、実行時に読み取ることも、Java ソースにコンパイルすることもできます。それらをソースに配置することになった場合は+、を前に置き、不要な改行を省略することをお勧めします。

final String text = ""
    +"text "
    +"text "
    +"text"
;

新しい行がある場合は、いくつかの結合または書式設定方法が必要になる場合があります。

final String text = join("\r\n"
    ,"text"
    ,"text"
    ,"text"
);
于 2009-05-18T16:47:43.300 に答える
17

プラスは StringBuilder.append に変換されます。ただし、両方の文字列が定数であり、コンパイラがコンパイル時に結合できる場合を除きます。少なくとも、それが Sun のコンパイラーのやり方であり、他のすべてのコンパイラーが同じことをするわけではないにしても、私はほとんどのことを疑っています。

そう:

String a="Hello";
String b="Goodbye";
String c=a+b;

通常、次とまったく同じコードを生成します。

String a="Hello";
String b="Goodbye":
StringBuilder temp=new StringBuilder();
temp.append(a).append(b);
String c=temp.toString();

一方で:

String c="Hello"+"Goodbye";

以下と同じです:

String c="HelloGoodbye";

つまり、読みやすくするために、文字列リテラルをプラス記号で複数行に分割しても問題はありません。

于 2009-05-19T00:37:21.683 に答える
11

残念ながら、Java には複数行の文字列リテラルがありません。文字列リテラルを連結するか (これには + または StringBuilder が最も一般的な 2 つの方法です)、別のファイルから文字列を読み取る必要があります。

大きな複数行の文字列リテラルの場合、別のファイルを使用して (クラスgetResourceAsStream()のメソッド)を使用して読み取る傾向があります。Classこれにより、現在のディレクトリとコードがインストールされた場所を気にする必要がないため、ファイルを簡単に見つけることができます。また、実際にファイルを jar ファイルに保存できるため、パッケージ化も容易になります。

Foo というクラスにいるとします。次のようなことをしてください:

Reader r = new InputStreamReader(Foo.class.getResourceAsStream("filename"), "UTF-8");
String s = Utils.readAll(r);

もう 1 つの煩わしさは、Java には標準の「このリーダーからすべてのテキストを文字列に読み込む」メソッドがないことです。ただし、書くのはかなり簡単です:

public static String readAll(Reader input) {
    StringBuilder sb = new StringBuilder();
    char[] buffer = new char[4096];
    int charsRead;
    while ((charsRead = input.read(buffer)) >= 0) {
        sb.append(buffer, 0, charsRead);
    }
    input.close();
    return sb.toString();
}
于 2009-05-18T17:10:10.307 に答える
10
String newline = System.getProperty ("line.separator");
string1 + newline + string2 + newline + string3

ただし、最良の代替手段はString.formatを使用することです

String multilineString = String.format("%s\n%s\n%s\n",line1,line2,line3);
于 2009-05-18T16:34:34.590 に答える
9

Java は (まだ) 複数行の文字列をネイティブにサポートしていないため、今のところ唯一の方法は、前述の手法のいずれかを使用してハックすることです。上記のいくつかのトリックを使用して、次の Python スクリプトを作成しました。

import sys
import string
import os

print 'new String('
for line in sys.stdin:
    one = string.replace(line, '"', '\\"').rstrip(os.linesep)
    print '  + "' + one + ' "'
print ')'

それを javastringify.py という名前のファイルに入れ、文字列をファイル mystring.txt に入れて、次のように実行します。

cat mystring.txt | python javastringify.py

その後、出力をコピーしてエディターに貼り付けることができます。

特別なケースを処理するために必要に応じてこれを変更しますが、これは私のニーズに合っています。お役に立てれば!

于 2011-02-21T18:22:12.263 に答える
9

java と互換性のある scala-code を使用でき、""" で囲まれた複数行の文字列を使用できます。

package foobar
object SWrap {
  def bar = """John said: "This is
  a test
  a bloody test,
  my dear." and closed the door.""" 
}

(文字列内の引用符に注意してください)およびJavaから:

String s2 = foobar.SWrap.bar ();

こっちの方が楽なのか…?

ソースコードに配置する必要がある長いテキストを頻繁に処理する場合、別のアプローチは、外部ファイルからテキストを取得し、次のように multiline-java-String としてラップするスクリプトである可能性があります。

sed '1s/^/String s = \"/;2,$s/^/\t+ "/;2,$s/$/"/' file > file.java

ソースに簡単にカットアンドペーストできるようにします。

于 2010-05-18T05:27:08.727 に答える
7

Java Stringfierを参照してください。必要に応じて、テキストを StringBuilder Java ブロック エスケープに変換します。

于 2012-01-13T21:52:01.157 に答える
7

実際、以下は私がこれまでに見た中で最もクリーンな実装です。注釈を使用してコメントを文字列変数に変換します...

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

したがって、最終的な結果として、変数 html には複数行の文字列が含まれます。引用符、プラス、コンマはなく、純粋な文字列です。

このソリューションは、次の URL で入手できます... http://www.adrianwalker.org/2011/12/java-multiline-string.html

それが役立つことを願っています!

于 2014-07-14T01:32:44.633 に答える
7
    import org.apache.commons.lang3.StringUtils;

    String multiline = StringUtils.join(new String[] {
        "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",
        }, "\n");
于 2014-06-03T07:17:16.547 に答える
7

次のような別の方法で追加を連結できます。

public static String multilineString(String... lines){
   StringBuilder sb = new StringBuilder();
   for(String s : lines){
     sb.append(s);
     sb.append ('\n');
   }
   return sb.toString();
}

いずれにせよStringBuilder、プラス表記を優先します。

于 2009-05-18T16:40:53.143 に答える
6

私がまだ答えとして見ていない代替案はjava.io.PrintWriter.

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
writer.println("It was the best of times, it was the worst of times");
writer.println("it was the age of wisdom, it was the age of foolishness,");
writer.println("it was the epoch of belief, it was the epoch of incredulity,");
writer.println("it was the season of Light, it was the season of Darkness,");
writer.println("it was the spring of hope, it was the winter of despair,");
writer.println("we had everything before us, we had nothing before us");
String string = stringWriter.toString();

java.io.BufferedWriterまた、方法があるという事実は言及されてnewLine()いません。

于 2009-11-03T16:06:24.340 に答える
5

非常に効率的でプラットフォームに依存しないソリューションは、行区切り記号のシステム プロパティと StringBuilder クラスを使用して文字列を構築することです。

String separator = System.getProperty("line.separator");
String[] lines = {"Line 1", "Line 2" /*, ... */};

StringBuilder builder = new StringBuilder(lines[0]);
for (int i = 1; i < lines.length(); i++) {
    builder.append(separator).append(lines[i]);
}
String multiLine = builder.toString();
于 2009-05-18T16:47:57.013 に答える
5

を使用しProperties.loadFromXML(InputStream)ます。外部ライブラリは必要ありません。

面倒なコードよりは (保守性と設計が重要なので)、長い文字列を使用しない方が望ましいです。

xml プロパティを読み取ることから始めます。

 InputStream fileIS = YourClass.class.getResourceAsStream("MultiLine.xml");
 Properties prop = new Properies();
 prop.loadFromXML(fileIS);


次に、複数行の文字列をより保守しやすい方法で使用できます...

static final String UNIQUE_MEANINGFUL_KEY = "Super Duper UNIQUE Key";
prop.getProperty(UNIQUE_MEANINGFUL_KEY) // "\n    MEGA\n   LONG\n..."


MultiLine.xml` は、同じフォルダー YourClass に配置されます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>
    <entry key="Super Duper UNIQUE Key">
       MEGA
       LONG
       MULTILINE
    </entry>
</properties>

PS .: xml のような文字列に<![CDATA["...を使用できます。"]]>

于 2014-02-15T19:53:49.990 に答える
3

ThomasP が提案するユーティリティを使用し、それをビルド プロセスにリンクすることをお勧めします。テキストを含む外部ファイルは引き続き存在しますが、ファイルは実行時に読み取られません。ワークフローは次のとおりです。

  1. 「テキストファイルから Java コードへ」ユーティリティを構築し、バージョン管理にチェックインする
  2. ビルドごとに、リソース ファイルに対してユーティリティを実行して、改訂された Java ソースを作成します。
  3. class TextBlock {...Java ソースには、リソース ファイルから自動生成される静的文字列が続くようなヘッダーが含まれてい ます。
  4. コードの残りの部分を使用して、生成された Java ファイルをビルドします。
于 2010-05-17T14:57:58.833 に答える
3

プロパティ ファイルで文字列を定義しますか?

プロパティ ファイルでは、複数行の文字列は使用できません。プロパティファイルで \n を使用できますが、それはあなたの場合の解決策ではないと思います。

于 2009-05-18T16:43:20.267 に答える
2

後期モデルの JAVA には、定数文字列を使用した + の最適化があり、舞台裏で StringBuffer を使用しているため、コードを乱雑にしたくありません。

これは、JAVA の見落としを指摘しており、二重引用符で囲まれた文字列を空白のみで自動的に連結する点で ANSI C に似ていません。たとえば、次のようになります。

const char usage = "\n"
"Usage: xxxx <options>\n"
"\n"
"Removes your options as designated by the required parameter <options>,\n"
"which must be one of the following strings:\n"
"  love\n"
"  sex\n"
"  drugs\n"
"  rockandroll\n"
"\n" ;

埋め込まれた改行が受け入れられる複数行の文字配列定数が欲しいので、混乱なくブロックを提示できます。たとえば、次のようになります。

String Query = "
SELECT
    some_column,
    another column
  FROM
      one_table a
    JOIN
      another_table b
    ON    a.id = b.id
      AND a.role_code = b.role_code
  WHERE a.dept = 'sales'
    AND b.sales_quote > 1000
  Order BY 1, 2
" ;

これを得るには、JAVA の神々に打ち勝つ必要があります。

于 2013-04-01T17:40:23.097 に答える
2

1 つの小さなトリック。これを使用して、動的に作成された HTML ページに javascritp を挿入します

StringBuilder builder = new StringBuilder();

public String getString()
{
    return builder.toString();
}
private DropdownContent _(String a)
{
    builder.append(a);
    return this;
}

public String funct_showhide()
{
   return
    _("function slidedown_showHide(boxId)").
    _("{").
    _("if(!slidedown_direction[boxId])slidedown_direction[boxId] = 1;").
    _("if(!slideDownInitHeight[boxId])slideDownInitHeight[boxId] = 0;").
    _("if(slideDownInitHeight[boxId]==0)slidedown_direction[boxId]=slidedownSpeed; ").
    _("else slidedown_direction[boxId] = slidedownSpeed*-1;").
    _("slidedownContentBox = document.getElementById(boxId);").
    _("var subDivs = slidedownContentBox.getElementsByTagName('DIV');").
    _("for(var no=0;no<subDivs.length;no++){").
    _(" if(subDivs[no].className=='dhtmlgoodies_content')slidedownContent = subDivs[no];").
    _("}").
    _("contentHeight = slidedownContent.offsetHeight;").
    _("slidedownContentBox.style.visibility='visible';").
    _("slidedownActive = true;").
    _("slidedown_showHide_start(slidedownContentBox,slidedownContent);").
    _("}").getString();

}
于 2010-12-12T18:39:44.153 に答える
2

長い一連の + が使用される場合、StringBuilder が使用されないコンパイル時に String が決定されない限り、1 つの StringBuilder のみが作成されます。

StringBuilder がより効率的なのは、複数のステートメントを使用して String を構築する場合のみです。

String a = "a\n";
String b = "b\n";
String c = "c\n";
String d = "d\n";

String abcd = a + b + c + d;
System.out.println(abcd);

String abcd2 = "a\n" +
        "b\n" +
        "c\n" +
        "d\n";
System.out.println(abcd2);

注: StringBuilder は 1 つだけ作成されます。

  Code:
   0:   ldc     #2; //String a\n
   2:   astore_1
   3:   ldc     #3; //String b\n
   5:   astore_2
   6:   ldc     #4; //String c\n
   8:   astore_3
   9:   ldc     #5; //String d\n
   11:  astore  4
   13:  new     #6; //class java/lang/StringBuilder
   16:  dup
   17:  invokespecial   #7; //Method java/lang/StringBuilder."<init>":()V
   20:  aload_1
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:  aload_2
   25:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   28:  aload_3
   29:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   32:  aload   4
   34:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   37:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   40:  astore  5
   42:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   45:  aload   5
   47:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   50:  ldc     #12; //String a\nb\nc\nd\n
   52:  astore  6
   54:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   57:  aload   6
   59:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   62:  return

私の質問をさらに明確にするために、私はパフォーマンスについてまったく心配していません。保守性と設計上の問題が心配です。

できるだけ明確かつシンプルにします。

于 2009-05-19T19:07:51.177 に答える
2

少しクレイジーに思えるかもしれませんが、ヒアドキュメントは改行がエスケープされた 1 行の宣言に対するシンタックス シュガーであるため、前処理中にヒアドキュメントをシングルライナーに変更する Java ファイルのプリプロセッサを作成できます。

コンパイル段階 (ant/maven ビルド用) の前にファイルを前処理するための適切なプラグインと、IDE へのプラグインを作成する必要があります。

イデオロギーの観点からは、これは fg "generics" と何の違いもありません。これは、キャストに対する前処理済みの構文糖衣の一種でもあります。

しかし、それは大変な作業なので、あなたの場所では .properties ファイルだけを使用します。

于 2012-01-14T07:40:08.070 に答える
1

私が知っている唯一の方法は、複数の行をプラス記号で連結することです

于 2009-05-18T16:32:44.877 に答える
1

この質問に対する 2 つの回答:

  1. 2020 年 3 月に Java 14 がリリースされ、純粋な Java に固執したい場合は、JEP 368 - テキスト ブロックをセカンド プレビュー モードで利用できます。実際、この機能は他のリリースではプレビュー モードになっています (少なくとも 13 にはあります)。ここで作成し、例を設定します
  2. この機能は便利ですが、簡単に悪用される可能性があります。Java にはコンパイルが必要であることを忘れないでください。コードに大きな文字配列を含めると、簡単に失敗する可能性があります (簡単な変更が必要な場合は、再コンパイルが必要になります。アプリケーションを操作する人がそのツールセットを使用できない可能性があります)。 .

私の経験では、構成ファイルに大きな文字列 (および一般に、アプリ オペレーターが実行時に変更できる/変更する必要がある文字列) を保持することをお勧めします。

要約: 責任を持ってテキスト ブロックを使用してください :)。

于 2020-02-17T05:38:55.337 に答える
1

長い文字列に外部ファイルを使用することを避けるべきケースが少なくとも 1 つあります。これらの長い文字列が単体テスト ファイルで期待される値である場合。外部リソースに依存します。

于 2010-10-24T11:27:12.043 に答える
1

文字列のバッグとして機能するためだけに、並列の groovy クラスを使用することがあります。

Javaクラスはこちら

public class Test {
    public static void main(String[] args) {
        System.out.println(TestStrings.json1);
        // consume .. parse json
    }
}

そして、TestStrings.groovy にある切望された複数行の文字列

class TestStrings {
    public static String json1 = """
    {
        "name": "Fakeer's Json",
        "age":100,
        "messages":["msg 1","msg 2","msg 3"]
    }""";
}

もちろん、これは静的文字列のみです。テキストに変数を挿入する必要がある場合は、ファイル全体を groovy に変更するだけです。強力な型付けの慣行を維持するだけで、それを実行できます。

于 2014-03-17T05:37:50.073 に答える
0

簡単なオプションは、SciTE( http://www.scintilla.org/SciTEDownload.html )などのエディターでJavaコードを編集することです。これにより、テキストをラップして、長い文字列を簡単に表示および編集できます。エスケープ文字が必要な場合は、それらを挿入するだけです。wrap-optionをオフにすると、文字列が実際に長い1行の文字列であるかどうかを確認できます。しかしもちろん、そうでない場合はコンパイラーも教えてくれます。

EclipseとNetBeansのどちらがエディタでのテキストの折り返しをサポートしているかはわかりません。なぜなら、それらには非常に多くのオプションがあるからです。しかし、そうでない場合は、それを追加するのは良いことです。

于 2009-08-26T20:33:23.157 に答える
0

複数行の構文が実際にjdk7で計画されていることを読んで少しイライラしました(Javaの存在から約何十年後ですか?)。おかしなことに、ファイルの完全な内容を読み取るための readAll() 関数はまだないので (jdk7 からのみ)、以下のコードは 1 行を読み取ります。

/*
  MakeMultiline v1.0 (2010) - 無料で使用およびコピーできます。

  テキスト blob を 1 つの Java 文字列リテラルに変換する小さなガジェット
  (行ごとに分割し、両端に \n を追加して囲みます
  二重引用符で囲みます)。テキスト blob で検出された引用符をエスケープします。

  Java で欠落している複数行の文字列構文を回避するのに役立ちます
  以前のjdk7. 使用:

     Java MakeMultiline " "
  また
     java MakeMultiline " " mytextfile.txt
*/

java.io.* をインポートします。

クラス MakeMultiline {
  public static void main(String[] args) {
    試す {
      // args[0]: インデント
      // args[1]: 読み取るファイル名 (省略可能。指定されていない場合は標準入力)
      // stdin を使用する場合は、末尾の改行に注意してください!

      文字列インデント = (args.length > 0 ? args[0] : "");
      FileReader fr = null; BufferedReader br;
      if (args.length > 1)
        { fr = 新しい FileReader(args[1]); br = 新しい BufferedReader(fr); }
      そうしないと
        { br = 新しい BufferedReader(新しい InputStreamReader(System.in)); }
      文字列 s; 文字列 res = "";
      while((s = br.readLine()) != null) {
        if (res.length() > 0) res += " +\n";
        res += indent + "\"" + s.replace("\"", "\\\"") + "\\n\"";
      }
      br.close(); if (fr != null) fr.close();
      System.out.println(res + ";");
    }
    キャッチ(例外e){
      System.out.println("例外: " + e);
    }
  }
}

これは私にとって最も迅速な解決策でした。(2010-01-27)

于 2010-01-27T19:04:15.693 に答える
0

作成者が何らかの動的な値を持つ必要のあるフォーマットされた大きな文字列を操作することに関心があるかどうかは、質問から完全には明らかではありませんが、その場合は StringTemplate ( http://www.stringtemplate.org/ )のようなテンプレート エンジンを使用します。非常に役立つかもしれません。

StringTemplate を使用するコードの簡単なサンプルを以下に示します。実際のテンプレート ("Hello, < name >") は、外部のプレーン テキスト ファイルから読み込むことができます。テンプレート内のすべてのインデントが保持され、エスケープは必要ありません。

import org.stringtemplate.v4.*;
 
public class Hello {
    public static void main(String[] args) {
        ST hello = new ST("Hello, <name>");
        hello.add("name", "World");
        System.out.println(hello.render());
    }
}

PS 読みやすさとローカリゼーションのために、ソース コードから大量のテキストを削除することは常に良い考えです。

于 2014-12-05T22:28:20.877 に答える