paiza( https://paiza.jp/ )で問題を解いていると、「自分の好きな値で試したい」となるときがありませんか?
そんな時にはpaiza.IOがあるじゃないか、と言われるかもしれませんが、自分の開発環境で作ってる場合修正の度いったりきたりで煩わしいと思います(思いました)。
そこで私は自分のローカル環境でテキストファイルを標準入力にもってきて、対象ファイル(クラス)のmainメソッドを呼び出す、簡単な処理を一つ作りました。
それがこれです↓
package skillCheck;
import java.io.FileInputStream;
import java.io.InputStream;
import skillCheck.rankS.S002;
public class CallMethod {
public static void main(String[] args) throws Exception {
InputStream fileStream = new FileInputStream(
"src/skillCheck/data");
System.setIn(fileStream);
System.out.println("==============start==============");
long startTime = System.currentTimeMillis();
S002.main(null);
long endTime = System.currentTimeMillis();
System.out.println("===============end===============");
System.out.println("実行時間:" +
(endTime - startTime) + " ms");
}
}
わかる人は見たまんまなのですが、一応説明します。まんまです。
開発環境はWindows10/Eclipse2019/Java11です。
①フォルダ構成
test #プロジェクトROOT
└─src #srcフォルダ
└─skillCheck
├─CallMethod.java #javaファイル
├─data #データファイル(テキスト)
└─rankS #package(動かしたいjavaなど)
└─S002.java
②ソースコード
説明する場所ほぼないですが、まぁ。
import skillCheck.rankS.S002;
動かしたい対象をimportしてください。
対象を変える度書き換えは必要ですが、Eclipseなら実行部分の方を書き換えれば自動でやってくれると思います。
InputStream fileStream = new FileInputStream(
"src/skillCheck/data");
System.setIn(fileStream);
一番大事なところです。
入力ファイルをInputStreamに変換して標準入力に渡しています。
System.setIn()がそれですね。
S002.main(null);
おまけ程度のmain呼び出しです。
System.setIn()の状態が引き継がれ、呼び出し側で参照できます。
引数は何でもいのでnullでOKです。
時間計測やその他表示は、好みで付けたり外したり編集したりして、
自分に合ったように構成するといいと思います。
以上となります。
想定出力結果を作って比較することや、それらを複数つくりまとめて動かすなどもできるでしょうが、そこまでは(自分は)いいかなと思い作成してません。
また、この他にjavascript/Python/Goで同様のテキストファイルを標準入力に指定ファイルを実行するという環境を作りました。(js/GoはVSCodeですが。)
そちらの方はまた気が向いたときに。
皆様、良きpaizaライフを。