【问题标题】:Eclipse reading stdin (System.in) from a fileEclipse 从文件中读取标准输入(System.in)
【发布时间】:2008-10-09 18:25:03
【问题描述】:

Eclipse 是否可以从文件中读取标准输入?

【问题讨论】:

标签: java eclipse file stdin system.in


【解决方案1】:

纯Java

您可以使用一行代码重定向 System.in:

System.setIn(new FileInputStream(filename));

System.setIn()

Eclipse 配置

在 Eclipse 4.5 或更高版本中,启动配置对话框可以将 System.in 设置为从文件中读取。见the announcement here

【讨论】:

    【解决方案2】:

    [更新] 正如 cmets 中所指出的,此答案具有误导性,因此我对其进行了更新以纠正错误。 [/更新]

    在 bash 或命令提示符下,您可以执行以下操作: C:\myprogramm < file.txt (Windows) 或 ./myprogramm < file.txt (Linux)

    不幸的是,在 Eclipse 中无法获得相同的结果,因为在 Eclipse 中没有将标准输入绑定到文件的选项。相反,您必须在代码中手动打开文件流,然后从中读取。一种方法是使用程序参数来启用它,另一种方法是使用文件参数。请参阅 Scott 的回答,了解您需要添加哪种代码来解析程序参数数组中的 -d 选项。

    当您想要指向 Eclipse 项目中的某个文件时,您需要小心获取正确的位置并使用 ${resource_loc:} 变量:

    -d ${resource_loc:/MyProject/file}
    

    当然也可以放绝对路径:

    -d path/to/file or -d C:\path\to\file
    

    resource_loc 参数指的是您的工作区。那是所有 Eclipse 项目都存储在其中的文件夹。从那里你仍然需要引用你的项目文件夹,然后是你想要加载的文件。

    您可能需要调整斜线方向,具体取决于您使用的是 Linux 还是 Winodws。

    【讨论】:

    • 运行配置中的“-d”选项 -> 参数似乎不起作用。至少在 Eclipse 3.7.1 中没有
    • 您还需要在程序中添加某种logic 来处理这些参数,否则仅此一项将不起作用。
    • 这个答案与std.in无关。它教你打开文件而不是阅读 std.in。为什么错误和误导性的答案会获得如此多的支持?
    【解决方案3】:

    2015 年更新

    有一个新的 Eclipse 版本,Eclipse 4.5 (Mars) 已修复 the issue!

    这是该功能的公告和说明:http://eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file

    Stdin 现在可以在启动的 Common 选项卡中分配给文件 配置对话框。

    正如预期的那样,这是刚刚发布的 eclipse 4.5 的一项新功能,因此在旧版本中将无法使用。

    【讨论】:

    • 这是正确的答案——前提是你生活在 2015 年 :)
    • 截至 2016 年的正确答案也是如此。 Eclipse Neon 4.6 提供了与从控制台读取用户输入完全相同的读取输入文件 (.in) 的便利性。因此,使用 Scanner sc = new Scanner(System.in); 和配置的设置可以完美地工作。确切地说,您可以在 Run > Run Configurations > Common 选项卡中找到上述屏幕。
    【解决方案4】:

    在运行对话框的“通用”选项卡上,在“标准输入和输出”下有一个“文件”复选框。但它似乎只用于输出......

    我希望在那里看到 2 个文件字段,一个用于标准输入,一个用于带有附加选项的标准输出。

    【讨论】:

    • 这仅适用于将文件名放入Standard Input and Output的输出
    【解决方案5】:

    您需要对代码进行一些调整才能使其在 Eclipse 中正常工作。当我尝试时,上面的其他答案不起作用。另一个我看到说要更改 Run..>Common tab>Standard Input and Output>File 仅将 stdout 行为更改为文件,而不是输入。

    解决方案是将“-d”选项作为一个可行的解决方案。如果你在程序参数中放入任何东西,它只会被传递到你的 main.js 中。所以你可以在 main 开头做的是这样的:

        Scanner in;
        if (args!=null && args.length>0 && args[0].equals("-d")){
            in = new Scanner(new File(args[1]));
        } else {
            in = new Scanner(System.in);
        }
    

    您仍然需要在“运行”菜单中设置程序参数,如this 答案中所述。

    【讨论】:

    • 假设您的代码在 public static void main(String [] args) 方法中,那么您不需要检查 args 是否为空 - 它至少包含一个空数组。
    【解决方案6】:

    我的解决方案(在 Mac 上运行,对 C 应用程序使用 Eclipse CDT)是在“运行配置”的“参数”选项卡中的其他参数末尾添加“

    还可以查看此other question 以获取有关在挂起状态下启动 Java 程序然后使用 Eclipse 附加调试器的答案。

    【讨论】:

    • 这也适用于带有 CDT 7.0 的 Linux。可能也适用于旧版本。
    • 这不适用于带有 Eclipse Java EE Indigo SR 1 的 Linux :(
    【解决方案7】:

    我没有看到使用标准 Eclipse 运行对话框的好方法。但是,您可以使用外部工具启动器来执行此操作,并使用标准的“

    这不是自动的,我猜这正是您想要的,但是您可以在启动程序时将 infile 的内容复制并粘贴到 Eclipse 控制台。

    【讨论】:

      【解决方案8】:
      < ${workspace_loc:/MyProject/file}
      

      在调试配置/参数/程序参数中:

      对我来说效果很好。

      【讨论】:

      • 一个有趣的可能性。我很好奇您使用的是什么版本的 Eclipse,以及在哪个系统上。我已经在 Mac OS X 10.8 上使用 Eclipse Juno 进行了尝试,重定向运算符
      • 面向 Java 开发人员的 Eclipse IDE,版本:Juno Release,内部版本号:20120614-1722,在 Mac OS X 10.7.5 上运行,这对我不起作用。 :(
      • 对于 Windows 7 x64 中的 Juno Service Release 2 也不适用于我
      • 我在 Windows 7 x64 上使用 ADT 自带的 Eclipse。
      【解决方案9】:

      对于 Linux: 我认为,最简单的方法是编写一个 sh-script。

      1) 像这样编写 run.sh:

      你的程序带参数

      2) 在 Eclipse 配置文件中指定

      [tab Main] C++ 运行应用程序 = /bin/sh

      [tab Arguments] 程序参数 = run.sh

      就是这样。当您将运行您的项目时,您将在 Eclipse 控制台中看到脚本的输出。 您可以在 Windows 中执行类似的操作。

      【讨论】:

        【解决方案10】:

        令人惊讶的是,Eclipse 不支持它,而且目前似乎没有添加它的计划。关注https://bugs.eclipse.org/bugs/show_bug.cgi?id=155411 并投票。

        如果他们实现了,我会在这里更新。

        【讨论】:

        • 我不知道如何为 Eclipse 做贡献,但是这个 bug 太烦人了,我会研究足够的代码来自己添加一个标准输出规范框。唯一的问题是我需要将它用于明天到期的代码,所以我没有时间。尽管如此,它仍然在我的下一个严肃的编码项目的议程上——除非其他人先完成它。 (认为​​这是对其他开发人员的挑战,以击败我。)
        • @studgeek 我猜这个错误已经过验证和修复,并且计划在版本中添加该功能:Mars (4.5) Build id: I20141208-2000。我说的对吗?
        【解决方案11】:

        我所做的是创建一个 Ant 目标并从 Eclipse 以“运行外部”的形式启动它,步骤如下:

        • 我有一个要读取的输入文件:res\in.txt 和一个用于输出的文件:res\out.txt
        • 使用您需要的目标创建一个build.xml(这只是一个示例):

          <project basedir="." default="run" name="Tests">
          <target name="clean">
          <delete dir="bin"/>
          </target>
          
          <target name="compile">
          <mkdir dir="bin"/>
          <javac srcdir="src" destdir="bin" includeantruntime="false"/>
          </target>
          
          <target name="build" depends="clean,compile"/>
          
          <target name="run" depends="build">
          <java classname="Main" input="res\in.txt" output="res\out.txt" classpath="bin" />
          </target>
          </project>
          
        • 在 Eclipse 中转到:Run-&gt;External Tools-&gt;External Tools Configurations-&gt;Ant Build-&gt; New Launch Configuration,使用以下配置:

        Section Main

        构建文件:${workspace_loc:/Tests/build.xml}

        基本目录:${workspace_loc:/Tests}

        *注意:Tests 是我的 Eclipse 项目的名称

        现在您可以通过单击 Run Extenal 工具栏按钮来运行您的项目,并根据需要更改输入或输出文件

        【讨论】: