Java使用扫描仪读取文件然后读取行

时间:2017-10-19 19:12:08

标签: java java.util.scanner

我试图制作一个读取文件的扫描仪并删除每个单词之间的空格。我可以得到这么多,但我不能把它带到他们在同一条线上的地方。我无法让程序读取一行,删除空格,然后转到下一行。这是我的练习项目中的文字:

four      score   and

seven               years ago         our

fathers brought             forth
    on this          continent
a         new

nation

我目前只获得第一行

这是我的代码:

import java.util.*;
import java.io.*;
public class CollapseSpace {

    public static void main (String[] args) throws FileNotFoundException{
        Scanner fileInput = new Scanner(new File ("textwithspaces.txt"));
        String nextLine = fileInput.nextLine();
        Scanner lineInput = new Scanner(nextLine);
        while(fileInput.hasNext()){
            nextLine = fileInput.nextLine();
            while(lineInput.hasNext()){
                System.out.print(lineInput.next() + " "); // I tried to add a fileInput.NextLine() to consume the line but it isn't working properly            
            }
            System.out.println();
       }

    }
}

3 个答案:

答案 0 :(得分:1)

如果您只需要逐行迭代并删除单词之间的空格,那么您只需要一个循环,下面的示例代码应该可以做到这一点

public static void main (String[] args) throws FileNotFoundException{
    final Scanner fileInput = new Scanner(new File ("src/main/resources/textwithspaces.txt"));
    while(fileInput.hasNext()){
        final String nextLine = fileInput.nextLine();
        // remove all spaces
        final String lineWithOutSpaces = nextLine.replaceAll("\\s+","");
        System.out.println(lineWithOutSpaces);
    }
}

答案 1 :(得分:0)

首先,您不应该使用*来导入类。它通常被认为是"糟糕的做法"因为它可以干扰你自己的课程,所以也不是很明确。

您需要在自己的循环中循环nextLine方法。并且使用字符串的replaceAll方法也会很好。

我在下面展示了一个例子:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

class Main {
    public static void main(String[] args) throws FileNotFoundException {

        // Create an object to represent a text file
        File file = new File("textwithspaces.txt");

        // Create a scanner with the text file as argument
        Scanner scannerWithFile = new Scanner(file);

        // Continue as long as it has a next line
        do {
            // Replace strings
            String thisLine = scannerWithFile.nextLine();

            // Only print the line out if not empty
            if (!thisLine.isEmpty()) {
                // Replace all spaces
                thisLine = thisLine.replaceAll(" ", "");

                // Print
                System.out.println(thisLine);
            }
        } while (scannerWithFile.hasNext());
    }
}

我还将你的while循环切换到do while循环,这样你就可以立即进入循环而不必先检查一个条件,它是在下一次迭代之前完成的。

答案 2 :(得分:-1)

你最大的问题是你在循环之外声明nextLine = fileInput.nextLine();,然后在Scanner lineInput = new Scanner(nextLine);中使用它,所以它成为文本的第一行,但后来永远不会改变。

我也同意另一条评论说你不应该使用*,这被认为是不好的做法,因为你导入了很多你不会使用的东西。

我重构了你的代码以使其有效。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Main {

    public static void main (String[] args) throws FileNotFoundException{
        Scanner fileInput = new Scanner(new File ("textwithspaces.txt"));

        while(fileInput.hasNext()){
            String nextLine = fileInput.nextLine();
            Scanner lineInput = new Scanner(nextLine);

            while(lineInput.hasNext()){
                System.out.print(lineInput.next() + " ");            
            }
           System.out.println();
        }
    }
}