Algorithms(by Robert Sedgewick)中运行算法程序一般是这样的:
java AlgorithmClass < inputFile.txt
例如第47页"java BinarySearch tinyW.txt < tinyT.txt",其中的"<"是输入重定向(standard input redirect),即用文件(tiny.txt)的内容代替键盘(standard input)作程序的输入,在Eclipse中调试这种代码很麻烦,因为Eclipse不支持输入重定向(直接在参数里写"< tiny.txt"无效,但支持输出到某一指定文件中),有两个方法解决这个问题。
首先是准备工作:
-
Create a project in eclipse, then creating a folder named "data" in it;
-
copy tinyT.txt & tinyW.txt into "data";
方法1:使用System.setIn()方法
- modify "int[] whitelist = In.readInts(args[0]);" in BinarySearch.java as following: System.setIn(new FileInputStream("data/tinyT.txt")); int[] whitelist = In.readInts("data/" + "tinyW.txt");
- run BinarySearch; Reference: http://stackoverflow.com/questions/188547/eclipse-reading-stdin-system-in-from-a-file
这个方法的不足之处是有时候程序在运行完后会报一个JNI异常,让人很不爽,于是有了下面第二个方法。
方法2:自己修改StdIn类
分析StdIn类的代码可知,它用了一个Scanner类包装了System.in,所以只要把System.in换成我们指定的文本文件就可以了,于是新建一个StdIn2类,代码与StdIn基本一样,增加了下面的方法:
public static void setInputFile(String path) { try { scanner = new Scanner(new BufferedInputStream(new FileInputStream( path)), charsetName); } catch (FileNotFoundException e) { e.printStackTrace(); } scanner.useLocale(usLocale); }
其实就是把scanner的初始化方法放到了setInputFile中(包括声明scanner和static{}块中两处),然后修改算法代码:
-
将BinarySearch中的StdIn重构为StdIn2;
-
main()方法的开始处加上"StdIn2.setInputFile("data/tiny.txt");";
-
运行代码。