【问题标题】:Is there a way for me to be able to use the same scanner for both a System.in Input and for a FileInputStream Input?有没有办法让我能够为 System.in 输入和 FileInputStream 输入使用相同的扫描仪?
【发布时间】:2015-05-28 03:14:39
【问题描述】:

有没有办法让我能够对 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]);
        }

非常感谢!

汤姆

【问题讨论】:

  • 使用单一扫描仪有什么好处?
  • @augray 外部编译所以别无选择

标签: java class input


【解决方案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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不建议您尝试对多个来源使用同一个扫描仪。从我从您描述的代码中可以看出,您不会从中获得任何收益。一般来说,一个 Scanner 应该代表一个单一的数据源。

      但是,如果您对这个想法一无所知,您可以编写自己的 InputStream 实现,它结合了来自 System.in 和您的 FileInputStream 的输入。有关如何执行此操作的想法,请参阅this related question。然后使用您的双源 InputStream 的实例构建扫描仪。

      这带来了许多其他问题——您打算如何正确地结合来自两个来源的输入?文件内容将在文件打开后立即可用。 System.in 的输入将在用户键入时可用。您的组合 Scanner 应该如何选择输出什么以及何时输出?如果您选择编写自己的 InputStream 来包装这两个来源,这些是您必须回答的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2014-12-29
        相关资源
        最近更新 更多