0

マイナーな問題があり\nます。ファイル内の が出力で機能しません。次の 2 つの方法を試しました。

ご注意ください:

*ここにあるファイルのテキストは、非常に単純化された例です。output.append("\n\n");そのため、2 番目の方法で を使用するだけではありません。また、\nファイル内の s は常に行末にあるとは限りません。つまり、ファイル内の行がStipulation 1.1\nUnder this Stipulation...etc. *

\nファイル内の が機能する必要があります。また、 と の両方JOptionPane.showMessageDialog(null,rules);System.out.println(rules);同じフォーマットの出力が得られます

ファイル内のテキスト:

A\n
B\n
C\n
D\n

方法 1:

 private static void setGameRules(File f) throws FileNotFoundException, IOException 
    {
        rules = Files.readAllLines(f.toPath(), Charset.defaultCharset());     
        JOptionPane.showMessageDialog(null,rules);
    }

出力 1:

A\nB\nC\nD\n


方法 2:

 private static void setGameRules(File f) throws FileNotFoundException, IOException 
    {
        rules = Files.readAllLines(f.toPath(), Charset.defaultCharset());     
        StringBuilder output = new StringBuilder();
        for (String s : rules)
        {
            output.append(s);
            output.append("\n\n");//these \n work but the ones in my file do not
        }
        System.out.println(output);
    }

出力 2:

A\n
B\n
C\n
D\n
4

3 に答える 3

1

文字シーケンス\nは、印刷できない文字を人間が判読できるように表現したものにすぎません。

ファイルから読み取ると、改行文字ではなく、「\」と「n」の 2 つの文字が取得されます。

そのため、ファイル内のプレースホルダーを「実際の」改行文字に置き換える必要があります。

前述の方法を使用する: s = s.replaceAll( "\\\\n", System.lineSeparator() );1 つの方法ですが、他の方法があると確信しています。

おそらくreadAllLines、上記のコード行を追加して、rules配列に行を挿入する前に、または挿入するときに、置換を行うことができます。

編集:

これが期待どおりに機能しない理由は、ファイルから読み取っているためです。クラスにハードコードされている場合、コンパイラは '\n' シーケンスを見て、「ああ、行区切り記号です。それを (char)0x0A に置き換えます」と言います。

于 2013-10-04T19:51:45.883 に答える
1

「機能していない」とはどういう意味ですか? 彼らはどのように機能していませんか?改行が見られると思いますか? 実際に各行の終わりに「\n」という文字があるのか​​、それとも改行文字 (0x0A) があるのか​​はわかりません。「\n」が Java ソースで機能する理由は、これが改行文字をエスケープする方法だからです。入力ファイルについて少し教えてください。どのように生成されますか?

2 番目に気付くのは、2 番目のメソッドでテキストをコンソールに出力することです。JOptionPane がこのように改行を表示するかどうかはわかりません。JLabel を使用していると思います。Java: JLabels の改行を参照してください。そのために。コンソールは \n を改行として解釈します。

于 2013-10-04T18:57:49.743 に答える
0

最終的な回答は次のようになります。

private static void setGameRules(File f) throws FileNotFoundException, IOException {
        rules = Files.readAllLines(f.toPath(), Charset.defaultCharset());
        for(int i =0;i!=rules.size();i++){
            rules.set(i, rules.get(i).replaceAll( "\\\\n","\n"));
        }
    }

@Ray が言ったよう\nに、ファイル内の は行区切り文字として\nはなく文字として読み取られているだけで、リストを実行してそれらを置き換えるために\n a を追加しました:for-loop

rules.set(i, rules.get(i).replaceAll( "\\\\n","\n")

于 2013-10-04T20:31:21.753 に答える