【问题标题】:How to resolve Line End Reading with Scanner Class in Java如何在 Java 中使用 Scanner 类解决行尾读取问题
【发布时间】:2010-04-15 21:47:41
【问题描述】:

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

问题是如此之小。当我查看输出时,看不到一些打印(如下所示)。我的意思是输出中的粗线仅写为“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();
    }
}   

这是输出:


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

【问题讨论】:

    标签: java java.util.scanner


    【解决方案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;它具有使用系统属性line.separatorprintln 方法。基本上就是System.out 是-a。

    PrintWriter fout = new PrintWriter(new File("test.txt"));
    fout.println("Testing|10|true|two|false");
    

    【讨论】:

      【解决方案2】:

      问题是你写出字符串“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

      【讨论】:

      • 谢谢伙计,当我替换为:Scanner src = new Scanner(fin).useDelimiter("[|\\n]");已经解决了,你的回答对我帮助很大,再次感谢..
      • 没问题...我从没听说过 Scanner 类,现在我可以编写更简洁的代码了 :)
      猜你喜欢
      • 2021-04-15
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多