0

私は経験豊富なJavaプログラマーではなく、ファイルにテキストを書き込んでからスキャナーで読み取ろうとしています。これを行う方法はたくさんあることは知っていますが、区切り文字を使用してファイルにレコードを書き込んでから、その部分を読み取りたいと思います。

問題はとても小さいです。出力を見ると、印刷が見られません(以下に表示)。「スキャナー」とだけ書かれている出力の太線を意味します。なぜ「文字列: 」が表示されないのか、誰か答えていただければ幸いです。(私が尋ねたことだけに答えてください)

単純な印刷の問題なのか、「\ r\n」の行末の問題なのか理解できませんでした。

コードは次のとおりです。


    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Scanner;

public class Tmp {
    public static void main(String args[]) throws IOException {
        int i;
        boolean b;
        String str;

        FileWriter fout = new FileWriter("test.txt");
        fout.write("Testing|10|true|two|false\r\n");
        fout.write("Scanner|12|one|true|");
        fout.close();

        FileReader fin = new FileReader("Test.txt");

        Scanner src = new Scanner(fin).useDelimiter("[|\\*]");

        while (src.hasNext()) {
            if (src.hasNextInt()) {
                i = src.nextInt();
                System.out.println("int: " + i);
            } else if (src.hasNextBoolean()) {
                b = src.nextBoolean();
                System.out.println("boolean: " + b);
            } else {
                str = src.next();
                System.out.println("String: " + str);
            }
        }

        fin.close();
    }
}   

出力は次のとおりです。


String: Testing
int: 10
boolean: true
String: two
String: false
Scanner
int: 12
String: one
boolean: true

4

2 に答える 2

1

区切り文字を正しく設定していません。[|\\*]は、2文字、、で構成される文字クラス|です*

    String s = "hello|world*foo*bar\r\nEUREKA!";
    System.out.println(s);
    // prints:
    // hello|world*foo*bar
    // EUREKA!

    Scanner sc;

    sc = new Scanner(s).useDelimiter("[|\\*]");
    while (sc.hasNext()) {
        System.out.print("[" + sc.next() + "]");
    }
    // prints:
    // [hello][world][foo][bar
    // EUREKA!]

    System.out.println();

    sc = new Scanner(s).useDelimiter("\r?\n|\r|\\|");
    while (sc.hasNext()) {
        System.out.print("[" + sc.next() + "]");
    }
    // prints:
    // [hello][world*foo*bar][EUREKA!]      

あなたはそれが「機能する」ことを発見したように見えました"[|\\n]"が、これは実際に\rはいくつかのトークンの終わりに末尾を残します。

偶然にも、あなたは見上げる必要がありますPrintWriter; printlnシステムプロパティを使用するメソッドがありますline.separator。それは基本的に何であるかSystem.outです-a。

PrintWriter fout = new PrintWriter(new File("test.txt"));
fout.println("Testing|10|true|two|false");
于 2010-04-15T23:52:14.313 に答える
0

問題は、文字列 "String:"を書き出してから、制御文字\ rまたはキャリッジリターンを書き出してから、内容を書き出すことです。

次のバージョンは、もう少しうまく機能するはずです。

FileWriter fout = new FileWriter("test.txt");
fout.write("Testing|10|true|two|false\n");
fout.write("Scanner|12|one|true|");
fout.close();
FileReader fin = new FileReader("test.txt");
Scanner src = new Scanner(fin).useDelimiter("[|\n]");

私が\rで話していることを実際に確認するには、元のプログラムを変更して、印刷コードが次のようになるようにする必要があります。

  } else {
    str = src.next().trim();
    str = str.replace('\n', '_');
    str = str.replace('\r', '_');
    System.out.println("String: " + str);
  }

次の出力が表示されます。

文字列:false__Scanner

于 2010-04-15T22:07:47.067 に答える