8

私は、すべてを1行で読むようなファイルから読んでいます:

Hello World!\nI've been trying to get this to work for a while now.\nFrustrating.\n

そして、スキャナーはファイルからそれを読み取り、文字列に入れます:

Scanner input = new Scanner(new File(fileName));
String str = input.nextLine();
System.out.print(str);

さて、出力を次のようにしたい:

Hello World!
I've been trying to get this work for a while now.
Frustrating.

しかし、代わりに、入力とまったく同じものを取得しています。つまり、各 \n が出力に含まれ、すべてが別々の行ではなく 1 行に表示されます。

Scanner はエスケープ文字を適切に読み取ることができると思っていましたが、代わりに \\n のように文字列にコピーしています。

4

3 に答える 3

4

と書いてある場合は(行末)がなく(2文字)あるので\n使えないファイルです。nextLine()\n\\n

代わりに delimiter を試してください:

    Scanner sc = new Scanner(new File("/home/alain/Bureau/ttt.txt"));
    sc.useDelimiter("\\\\n");
    while(sc.hasNext()){
        System.out.println(sc.next());
    }

出力:

「こんにちは世界」

私はこれをしばらくの間機能させようとしてきました。

イライラします。

編集:

ファイルを読みたい場合\nは、テキスト内の を実際の EOL に置き換えます。あなたは単に使用することができます:

Scanner sc = new Scanner(new File("/home/alain/Bureau/ttt.txt"));

//loop over real EOL
while(sc.hasNextLine()){

     //Replace the `\n` in the line with real EOL.
     System.out.println(sc.nextLine().replace("\\n", System.getProperty("line.separator")));
}
于 2012-05-31T09:08:57.130 に答える
3

いいえ、Scannerあなたのためにそれをしません。翻訳は自分で行う必要があります。

sc.useDelimiter("\\\\n")(他の人が示唆しているように何かを使用すると、通常のnext()メソッドの機能がnextLine()損なわれ、期待どおりに機能しない可能性があることに注意してください。)

ここに私がそれを解決する方法のスケッチがあります:

変化する

Scanner input = new Scanner(new FileReader(fileName));

Scanner input = new Scanner(new JavaEscapeReader(new FileReader(fileName)));
                            ^^^^^^^^^^^^^^^^^^^^^                        ^

どこで次のようJavaEscapeReaderに拡張FilterReaderします:

class JavaEscapeReader extends FilterReader {

    JavaEscapeReader(Reader in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int ch = super.read();
        switch (ch) {
        case '\\':
            switch (super.read()) {
            case '\\': return '\\';
            case 'n': return '\n';
            case 't': return '\t';
            case 'f': return '\f';
            // ...
            default:
                throw new IOException("Invalid char sequence.");
            }
        default:
            return ch;
        }
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int i = 0, ch;
        while (i < len && -1 != (ch = read()))
            cbuf[i++] = (char) ch;
        return i == 0 ? -1 : i;
    }
}

コンテンツを含む入力ファイルが与えられた場合

Line1\nLine2
Line3\nLine3

プログラム

Scanner sc = new Scanner(new JavaEscapeReader(new FileReader("filename.txt")));
while (sc.hasNextLine())
    System.out.println(sc.nextLine());

版画

Line1
Line2
Line3
Line4

もう 1 つのオプションはStringEscapeUtils.unescapeJava、読み取った文字列を使用して後処理することです。

于 2012-05-31T08:59:57.397 に答える
1

Scanner.useDelimiter独自の区切り文字を設定するために使用できます。二重引用符を使用する場合\\n

s.useDelimiter("\\\\n");

例:

Scanner s = new Scanner("Hello World!\\nI've been trying to get this to " +
                        "work for a while now.\\nFrustrating.\\n");
s.useDelimiter("\\\\n");

System.out.println(s.next());
System.out.println(s.next());
System.out.println(s.next());

出力:

Hello World!
I've been trying to get this to work for a while now.
Frustrating.
于 2012-05-31T09:06:47.707 に答える