Java 将scanner类的两个实例压缩为一个

Java 将scanner类的两个实例压缩为一个,java,java.util.scanner,Java,Java.util.scanner,我已经创建了一个方法来将多行翻译成拉丁语。预期的输入如下所示: The cat jumped over the fox 我的代码输出文本,正确地翻译成Pig拉丁语,并具有正确的格式(即单词分隔开,行分隔开)。但是,我使用scanner类的两个实例来实现这一点。 有谁能建议我如何删除这两个实例并将它们浓缩为一个 顺便说一句,请随意提供任何其他建议,但请记住,我是一个仍在学习的新手 File file = new File("projectdata.txt"); try

我已经创建了一个方法来将多行翻译成拉丁语。预期的输入如下所示:

The cat jumped over the fox
我的代码输出文本,正确地翻译成Pig拉丁语,并具有正确的格式(即单词分隔开,行分隔开)。但是,我使用scanner类的两个实例来实现这一点。 有谁能建议我如何删除这两个实例并将它们浓缩为一个

顺便说一句,请随意提供任何其他建议,但请记住,我是一个仍在学习的新手

    File file = new File("projectdata.txt");
    try 
    {
        Scanner scan1 = new Scanner(file);
        while (scan1.hasNextLine()) 
        {
            Scanner scan2 = new Scanner(scan1.nextLine());
            while (scan2.hasNext())
            {
                String s = scan2.next();
                boolean moreThanOneSyllable = Syllable.hasMultipleSyllables(s);
                char firstLetter = s.charAt(0);
                String output = "";
                if (!moreThanOneSyllable && "aeiou".indexOf(firstLetter) >= 0)
                    output = s + "hay" + " ";
                else if (moreThanOneSyllable && "aeiou".indexOf(firstLetter) >= 0)
                    output = s + "way" + " ";
                else 
                {
                    String restOfWord = s.substring(1);
                    output = restOfWord + firstLetter + "ay" + " ";
                }
                System.out.print(output);
            }
            System.out.println("");
            scan2.close();
        }
        scan1.close();
    } 

    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
}

注意:几天前,我在代码溢出上发布了类似的内容,并从那里得到的答案中听取了一些建议。然而,虽然有人建议不要使用两个扫描程序类,但我就是无法正确设置格式。

使用外循环,您可以逐行读取文件。使用外循环,您可以将每一行都视为d作为字符串

Scanner scan2 = new Scanner(scan1.nextLine());
因此,您正试图使用
扫描仪读取
字符串
。您应按如下方式进行更改:

String line = scan1.nextLine();
将该行拆分为字符串(单词)数组并进行处理

String[] words = line.split("\\s+");
内部循环只能在数组中迭代

for(String word : words) {
    //your existing logic can go here
}
更新

您可以按如下方式转义空行。不需要任何异常处理

String line = scan1.nextLine();
if(line.isEmpty()) {
    System.out.println();
    continue;
}

您只需删除外部while循环和
sc1
scanner对象。它们在这里是无用的。@RohitJain:但如果我这样做,它将停止在正确的行上输出文本。而不是预期的每行四/五个字,所有字都以长流的形式输出。您的答案看起来很完美,但会生成错误(我的问题应该更具体一些)。这首诗是一行接一行,但分为四节,意思是有四行是空的。我想我需要写一篇短文来解释这些行,但我不知道怎么写。如果行是空的,就逃掉它。用
如果
检查它是空的,用
继续
逃掉它。你每天学的东西!没有想法Java有一个isEmpty()方法来检查一行是否为空。我在您的最终答案中添加了一行(isEmpty方法中的println语句),这可以确保打印时保留所有节。谢谢您的帮助!!