【问题标题】:Java: Scanner stopping at new lineJava:扫描仪在换行处停止
【发布时间】:2012-06-09 03:05:14
【问题描述】:

我正在尝试扫描文本文件并将它们添加到地图中,地图和一切正常。 但是,当涉及到文本文件中的“输入”或空白行时,扫描仪似乎停止了。这是我的问题

这是我的扫描仪/映射器代码块

class OneButtonListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent evt)
    {
        final JFileChooser oneFC = new JFileChooser();
        oneFC.showOpenDialog(AnalysisFrame.this);
        String newLine = null;
        oneFC.getName(null);
        int returnVal = 0;
        File fileOne = oneFC.getSelectedFile();

        Scanner input = null;        
        try {
            input = new Scanner(fileOne);
        } 
        catch (FileNotFoundException ex) {
            Logger.getLogger(AnalysisFrame.class.getName()).log(Level.SEVERE, null,
                            ex);
        }                       
        inputText = input.nextLine(); 
        String[] words = inputText.split("[ \n\t\r,.;:!?(){}]");

        for(int i = 0; i < words.length; i++){
            key = words[i].toLowerCase(); 

            if (words[i].length() > 1){
                if (mapOne.get(key) == null){
                    mapOne.put(key, 1);
                }
                else {
                    value1 = mapOne.get(key).intValue();
                    value1++;
                    apOne.put(key, value1);
                }
            } 
         }
     }
}

感谢您的帮助!

【问题讨论】:

  • 没有错误,只是不是预期的行为。

标签: java java.util.scanner


【解决方案1】:

您应该在循环内扫描,直到到达文件末尾,例如:

StringBuilder builder = new StringBuilder();
while(input.hasNextLine()){
    builder.append(input.nextLine());
    builder.append(" "); // might not be necessary
}
String inputText = builder.toString();

使用split 的替代方法是使用DelimiterScanner,并使用hasNext()next() 而不是hasNextLine()nextLine()。试一试,看看是否有效。

例如:

scanner.useDelimiter("[ \n\t\r,.;:!?(){}]");
ArrayList<String> tokens = new ArrayList<String>();
while(scanner.hasNext()){
    tokens.add(scanner.next());
}

String[] words = tokens.toArray(new String[0]); // optional

另外,不必每次都创建JFileChooser

class OneButtonListener implements ActionListener
{
    private final JFileChooser oneFC = new JFileChooser();

    @Override
    public void actionPerformed(ActionEvent evt)
    {

【讨论】:

  • 感谢您的示例,但是我不确定如何实现它,“附加”在做什么?我已经使用 append 输出到 textarea 但在这里我保留它以将其放入地图中。
  • 请注意,我使用的是StringBuilder。这允许字符串连接比使用+= 附加字符串更有效。要从StringBuilder 获取字符串,只需在StringBuilder 上调用toString()。或许再通读一遍这个例子?
  • 对不起,在您编辑之前,“附加”仍然出错,但也感谢您的所有帮助
  • 我不再收到错误,但它似乎仍然没有超过第一行。 String inputText = builder.toString(); 这一行将来自构建器的数据插入到 inputText 字符串中对吗?确保它不是我稍后需要调用的构建器
  • 考虑使用第二个示例,该示例使用ArrayList 而不是StringBuildersplit。执行word = input.next(); System.out.println(word); tokens.add(word); 之类的操作以查看发生了什么。我已将其添加到示例中,请记住稍后再将其取出。
【解决方案2】:

很长时间没有使用 Java 了,我可能会走得很远,但看起来你只调用了一次 inputText = input.nextLine();,所以你只得到一行是有道理的。大概你想在一个循环中调用nextLine(),这样它就会一直给你行,直到它到达文件的末尾。

【讨论】:

    【解决方案3】:
    String contentsOfWholeFile = new Scanner(file).useDelimiter("\\Z").next();
    

    【讨论】:

      【解决方案4】:

      split("[ \n\t\r,.;:!?(){}]") 添加 \f

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        相关资源
        最近更新 更多