Eclipseがファイルからstdinを読み取ることは可能ですか?
11 に答える
ピュア Java
次の 1 行のコードで System.in をリダイレクトできます。
System.setIn(new FileInputStream(filename));
System.setIn()を参照してください。
エクリプス構成
Eclipse 4.5 以降では、起動構成ダイアログで System.in をファイルから読み取るように設定できます。こちらの発表をご覧ください。
[更新]コメントで指摘されているように、この回答は誤解を招くものであったため、エラーを修正するために更新しました。[/アップデート]
bash またはコマンド プロンプトで実行できること:
C:\myprogramm < file.txt
(Windows) または./myprogramm < file.txt
(Linux)
残念ながら、Eclipse では stdin をファイルにバインドするオプションがないため、同じ結果を達成することはできません。代わりに、コードでファイル ストリームを手動で開き、代わりにそこから読み取る必要があります。これを行う 1 つの方法は、プログラム引数を使用してそれを有効にし、別の方法では file パラメーターを使用することです。プログラム引数配列から -d オプションを解析するために追加する必要があるコードの種類については、Scott の回答を参照してください。
Eclipse プロジェクト内のファイルを参照する場合は、場所を正しく取得し、${resource_loc:} 変数を使用するように注意する必要があります。
-d ${resource_loc:/MyProject/file}
もちろん、絶対パスを入れることもできます:
-d path/to/file or -d C:\path\to\file
resource_loc パラメーターはワークスペースを参照します。これは、すべてのEclipseプロジェクトが保存されているフォルダーです。そこから、プロジェクトフォルダーを参照してから、ロードするファイルを参照する必要があります。
Linux を使用しているか Winodws を使用しているかによって、スラッシュの方向を微調整する必要がある場合があります。
2015年更新
この問題を修正した新しい Eclipse バージョン、Eclipse 4.5 (Mars) があります。
これは機能の発表と説明です: http://eclipse.org/mars/noteworthy/#_assigning_stdin_to_a_file
起動設定ダイアログの [ 共通] タブで、標準入力をファイルに割り当てることができるようになりました。
予想どおり、これはリリースされたばかりの Eclipse 4.5 の新機能であるため、古いバージョンでは機能しません。
実行ダイアログの「共通」タブの「標準入出力」の下に、「ファイル」のチェックボックスがあります。しかし、それは出力専用のようです...
そこには2つのファイルフィールドが表示されると思います。1つは標準入力用、もう1つは追加オプション付きの標準出力用です。
これをEclipse内で機能させるには、コードを微調整する必要があります。上記の他の回答は、私が試したときに機能しませんでした。Run ..> Common tab> Standard Input and Output> Fileを変更するように言っているのを見た別のものは、入力ではなく、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);
}
この回答で説明されているように、Run.. メニューでプログラムの引数を設定する必要があります。
私にとっての解決策(Macで実行し、CアプリケーションにEclipse CDTを使用)は、[構成の実行]ダイアログの[引数]タブの他の引数の最後に「<path / to/somefile」を追加することでした。
また、この他の質問で、Javaプログラムを一時停止状態で起動し、Eclipseを使用してデバッガーを接続することに関する回答を確認してください。
< ${workspace_loc:/MyProject/file}
デバッグ構成/引数/プログラム引数:
私にとってはうまくいきます。
標準のEclipse Runダイアログを使用してそれを行う良い方法がわかりません。ただし、外部ツール ランチャーを使用して、標準の "< infile" 構文を使用するか、.bat/.sh スクリプトを呼び出して実行できる場合があります。
これは自動化されていませんが、これはあなたが望んでいることだと思いますが、プログラムを起動するときに、インファイルの内容をコピーして Eclipse コンソールに貼り付けることができます。
Linux の場合: 最も簡単な方法は、sh スクリプトを作成することだと思います。
1) run.sh を次のように記述します。
params < input.txtを使用したプログラム
2)Eclipseプロファイル構成で指定します
[メインタブ] C++ Run Application = /bin/sh
[タブの引数] プログラムの引数 = run.sh
それでおしまい。プロジェクトを実行すると、Eclipse コンソールにスクリプトの出力が表示されます。Windows でも同様のことができます。
これは驚くべきことに Eclipse ではサポートされておらず、現在追加する予定はないようです。フォローして投票するには、https://bugs.eclipse.org/bugs/show_bug.cgi?id=155411を参照してください。
彼らがそれを実装した場合、私はここで更新します。
私がしたことは、Ant ターゲットを作成し、それを Eclipse から「Run External」として起動することでした。手順は次のとおりです。
- 読み取り元となる入力ファイルが 1
res\in.txt
つと、出力用に 1 つのファイルがあります。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->External Tools->External Tools Configurations->Ant Build-> New Launch Configuration
では、次の構成を使用します。
Section Main
ビルドファイル:${workspace_loc:/Tests/build.xml}
ベース ディレクトリ:${workspace_loc:/Tests}
*注: Tests は、私の Eclipse プロジェクトの名前です
これで、Run Extenal ツールバー ボタンをクリックしてプロジェクトを実行し、必要に応じて入力ファイルまたは出力ファイルを変更できます。