Eclipse从文件中读取stdin(System.in)

69

Eclipse能否从文件中读取stdin?


1
仍未在3.5.2版本中输入。这是否被视为Eclipse的错误? - Thorbjørn Ravn Andersen
1
@ThorbjørnRavnAndersen https://bugs.eclipse.org/bugs/show_bug.cgi?id=155411 - Chiara Coetzee
11个回答

59

纯Java

你可以通过一行代码重定向System.in:

System.setIn(new FileInputStream(filename));

参见System.setIn()

Eclipse配置

在Eclipse 4.5或更高版本中,启动配置对话框可以将System.in设置为从文件读取。请参见此处的公告

启动配置对话框的常规选项卡


12

2015更新

有一个新的Eclipse版本,Eclipse 4.5 (Mars),已经修复了这个问题

以下是该功能的公告和描述:http://eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file

现在可以在启动配置对话框的公共(Common)选项卡中将标准输入(stdin)分配给文件。 输入图像描述

正如预期的那样,这是刚发布的Eclipse 4.5的一项新功能,因此无法在旧版本上运行。


2
这是正确的答案 - 假设你生活在2015年 :) - astrojuanlu
截至2016年,Eclipse Neon 4.6提供了与从控制台读取用户输入完全相同的方式来读取输入文件(.in)的便利。因此,使用Scanner sc = new Scanner(System.in);和配置的设置可以无缝地工作。确切地说,您可以在“运行”>“运行配置”>“常规”选项卡中找到上述屏幕。 - Keith OYS

12

[更新] 因为评论中指出了这个答案是误导性的,所以我已经更新了它来纠正错误。[/更新]

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

不幸的是,在Eclipse中无法实现相同的结果,因为没有选项将stdin绑定到文件。相反,您将不得不在代码中手动打开一个文件流,然后从中读取。一种方法是使用程序参数来启用它,并使用另一个参数来传递文件。请参见Scott的答案,了解您需要添加什么样的代码来解析程序参数数组中的-d选项。

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

-d ${resource_loc:/MyProject/file}

当然,你也可以使用绝对路径:

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

resource_loc参数是指您的工作区。也就是您存储所有eclipse项目的文件夹。从那里,您仍然需要引用您的项目文件夹,然后才能加载您想要的文件。

根据您使用的操作系统是Linux还是Windows,您可能需要调整斜线方向。


4
在运行配置中,“-d”选项似乎无效。至少在Eclipse 3.7.1中是这样。 - Sagar Jauhari
1
你还需要在程序中添加某种逻辑来处理这些参数,否则仅有这个是不够的。 - Scott
5
这个回答与std.in无关,它教你如何打开文件而不是读取std.in。为什么错误和误导性的回答会获得如此多的赞成票? - Val

8
在“常规”选项卡下的运行对话框中,有一个名为“标准输入和输出”的复选框,但它似乎只用于输出...我期望在那里看到2个文件字段,一个用于标准输入,另一个用于标准输出,并带有追加选项。

这仅适用于将文件名放入“标准输入和输出”以进行输出的情况。 - Tyler Wall

6
您需要对代码进行一些调整才能在eclipse中使其正常工作。当我尝试其他上面的答案时都没有起作用。另一个解决方案是更改“运行”>“通用”选项卡>“标准输入和输出”>“仅文件”,但这只会将stdout行为更改为文件,而不是输入。
解决方案是采用“-d”选项来实现可行的解决方案。如果您在程序参数中放置任何内容,它只会传递到您的主函数中。因此,您可以在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);
    }

您仍需要按照这个答案中的说明,在“运行”菜单中设置程序参数。


假设你的代码在public static void main(String [] args)方法中,那么你不需要检查args是否为null - 它将至少包含一个空数组。 - Rob Gilliam

5
对于我来说(在Mac上运行,使用Eclipse CDT进行C应用程序开发),解决方法是在“运行配置”对话框的“参数”选项卡中,在其他参数的末尾添加“< path/to/somefile”。
此外,可以参考这个其他问题的答案,其中介绍了如何以挂起状态启动Java程序,然后使用Eclipse附加调试器。

1
这在Linux上使用CDT 7.0也可以工作。可能在旧版本上也能工作。 - Stabledog
这在Linux上与Eclipse Java EE Indigo SR 1不起作用 :( - Eponymous

4
我不认为使用标准的Eclipse运行对话框有一个好的方法来完成它。但是,您可能可以使用外部工具启动器来完成它,使用标准的“< infile”语法或调用.bat/.sh脚本来代替您执行它。
这并不是自动化的,我猜想这正是您想要的,但是您可以在启动程序时将infile的内容复制粘贴到Eclipse控制台中。

4
< ${workspace_loc:/MyProject/file}

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

对我来说很有效。


一个有趣的可能性。我很好奇你正在使用哪个版本的Eclipse,以及在哪个系统上。我已经尝试过在Mac OS X 10.8上使用Eclipse Juno,但重定向运算符<被解释为命令行参数。 - Nathan Ryan
我在Mac OS X 10.7.5上运行的Eclipse IDE for Java Developers,版本为Juno Release,构建ID为20120614-1722,但这对我来说不起作用。 :( - Eddified
在我的电脑上,使用Juno Service Release 2在Windows 7 x64系统中也无法正常工作。 - D_Guidi
我在Windows 7 x64上使用带有ADT的Eclipse。 - Vlad

2
对于 Linux 系统: 我认为,最简单的方法是编写一个 sh 脚本。
1)像这样编写 run.sh: 您的程序及其参数 < input.txt
2)在 Eclipse 配置文件中指定以下内容: [主选项卡] C++ 运行应用程序 = /bin/sh [参数选项卡] 程序参数 = run.sh
就这样了。当您运行项目时,您将在 Eclipse 控制台中看到脚本的输出。 您可以在 Windows 上做类似的事情。

1

我不知道如何为Eclipse做贡献,但这个错误太烦人了,让我去学习代码以添加标准输出规范框。唯一的问题是我需要在明天之前完成代码,所以我没有时间。尽管如此,这仍然是我下一个严肃编程项目的议程 - 除非有人先来解决它。(把这视为对其他开发者的挑战,看谁能比我更快地解决问题。) - Steve
@studgeek,我猜测该漏洞已经得到验证和修复,该功能计划在版本Mars(4.5)中添加。构建ID:I20141208-2000。我说的对吗? - Sunil Kumar

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