我能否使用同一个扫描器来同时读取System.in输入和FileInputStream输入?

3

有没有办法让我能够同时将同一个扫描仪用于System.in输入和FileInputStream输入?

以下是我在主类中初始化扫描仪的方式:

public class Nimsys {
    public static Scanner keyboardIn;

    static {
        keyboardIn = new Scanner(System.in);
    } ...

在主类Nimsys中,这是我获取输入的方法:
String inputString1 = keyboardIn.nextLine();

在另一个类中,这是我如何使用Nimsys的扫描仪:
int inputInt1 = Nimsys.keyboardIn.nextInt();

但是现在在我的主类Nimsys中,我正在尝试扫描整个文件-到目前为止,我已经使用了另一个扫描器,就像您在下面的代码中看到的那样。然而,是否可能通过原始扫描器完成所有操作?

try
        {
            inputStream = new Scanner(new FileInputStream("file.txt"));
        }
        catch (FileNotFoundException e)
        {
            System.out.println("File morestuff.txt was not found");         
        }
        String[] reopenPlayers = new String[100];
        int i = 0;
        while(inputStream.hasNextLine()){
            reopenPlayers[i]=inputStream.nextLine();
        System.out.println(reopenPlayers[i]);
        }

非常感谢您! Tom

使用单个扫描器的好处是什么? - augray
1
@augray 是外部编译的,所以没有选择。 - tomglynch
3个回答

1
如果我理解你的问题(并不是说我认为全局变量是一个很好的解决方案),你可以更改(并可能重命名)。
keyboardIn = new Scanner(System.in);

将其翻译为中文:“变成类似于

的内容。”

try {
    keyboardIn = new Scanner(new FileInputStream("file.txt"));
} catch (FileNotFoundException e) {
    System.out.println("file \"file.txt\" not found");
    e.printStackTrace();
}

然后从中删除 try-catch
inputStream = new Scanner(new FileInputStream("file.txt"));

将其翻译为中文:

并将其修改为类似以下的内容

inputStream = Nimsys.keyboardIn;

(或将inputStream替换为Nimsys.keyboardIn不要强制执行,但可以将Nimsys.keyboardIn重命名为Nimsys.in)。希望您使用支持重构的IDE。

0
我建议你不要尝试使用同一个扫描器来处理多个数据源。从你描述的代码中,我可以看出你并不会因此获得任何好处。通常情况下,一个扫描器应该代表一个单一的数据源。
然而,如果你坚持这个想法,你可以编写自己的InputStream实现,将System.inFileInputStream的输入组合起来。关于如何实现,可以参考this related question。然后使用你的双源InputStream实例构造扫描器。
这带来了一系列其他问题- 你打算如何正确地组合两个数据源的输入?文件内容将在文件打开后立即可用。来自System.in的输入将在用户输入时可用。你的组合Scanner应该如何选择输出和何时输出?如果你选择编写自己的InputStream来包装这两个数据源,这些都是你需要回答的问题。

0

不,你不能这样做,Scanner只是一个包装类,这意味着你实际使用的流源是FileInputStream和system.in,显然你不能这样做,而且如果你能这样做也没有太多好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接