如何使用Java中的扫描程序类解析行结束读取

时间:2010-04-15 21:47:41

标签: java java.util.scanner

我不是一位经验丰富的Java程序员,我正在尝试将一些文本写入文件,然后使用Scanner读取它。我知道有很多方法可以做到这一点,但我想用分隔符写记录到文件,然后阅读碎片。

问题很小。当我查看输出时,看不到某些打印(如下所示)。我的意思是输出中的粗体线只写为“扫描仪”。如果有人能回答为什么“ String:”没有在那里看到,我将不胜感激。 (请回答我的要求)

我无法理解这是一个简单的打印问题还是“\ 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();
    }
}   

这是输出:

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();
    }
}   

2 个答案:

答案 0 :(得分:2)

你没有正确设置分隔符; [|\\*]是一个由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");

答案 1 :(得分:0)

问题是您正在写出字符串“String:”,然后写出控制字符\ r \ n或回车符,然后写出内容。

以下版本应该对您有所帮助:

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]");

要真正了解我在谈论的内容,您应该更改原始程序,以便打印代码如下所示:

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

你应该看到输出:

  

String:false__Scanner