Javac和Java在CLI中的使用

最近这几天在学习Robert Sedgewick和Kevin Wayne的《算法》一书。第一章讲了一些Java编程的基础,第二章讲了一些最基础的排序算法。目前刚刚看完这两章,虽然很基础,但是毕竟不能只看书不练习,于是就动手写代码实践一下。可是刚开始写代码我就遇到了麻烦,我始终不知道在Eclipse中如何把标准输入流重定向到文件,就像在命令行中输入java Test < data.txt这样。我知道在Eclipse中能够将标准输出重定向到文件,所以我觉得做到标准输入重定向应该不难。可是在网上查了很多资料,却都是通过在程序中解析命令行参数做到的。平时用IDE用惯了,很少直接在命令行中使用jdk提供的javac、java等工具,对其各种参数更是不甚了解。于是觉得与其被这个问题绊住,倒不如就在命令行中编译、运行程序来的方便。也正好借此机会学习下jdk工具的使用,岂不是一举两得。

常言道,实践出真知,想的再周全也不如真正动手试一试,这不,我刚刚就试了试。结果真的是不如想象的顺利-_-,javac编译一个只有几行代码的HelloWorld.java没问题,然后java HelloWorld也能正常运行。可是当我编译一个稍微复杂些的源文件时,就出了字符编码的问题,源文件中的中文注释出了问题,可是在Eclipse中明明可以正常编译。于是查了下资料,原来在编译的时候,如果没有用-encoding参数指定源程序的字符编码,则javac.exe会读取操作系统的file.encoding参数(操作系统默认的字符编码,我的是GBK),然后把源程序从file.encoding编码转化为unicode编码读进内存再进行编译。我的源程序本身就是utf-8编码的,按照GBK编码读取再转换成utf-8时,中文字符就出了问题。解决办法就是在编译时加上-encoding utf-8参数,就像这样javac -encoding utf-8 xxx.java。这样就编译成功了,当然javac命令还有很多其他参数,比如-d参数可以指定生成的类文件的存放位置,默认是存放在跟源文件相同的目录。还有一个比较重要的参数是-cp或者-classpath,通过这个参数可以指定搜索类文件的位置,可以是目录或者是jar包。源程序编译时,会将它所依赖的类一起编译。

编译完了,接着就是运行了。结果运行又遇到了问题,说Could not find or load main class ...我就纳闷了,这个类文件分明就在这,刚刚编译好的,怎么就找不到呢。然后又去查资料,这次就没那么容易找到答案了,我试了多种网上给出的方案,但是始终都是提示找不到或无法加载类。然后我发现网上问这个问题的基本都是运行HalloWorld程序的,我就想,难道这个问题是一个简单到不值得问的问题?当我找到答案后,我觉得,似乎是的!问题在哪,在于我输入的类名不是全类名,因为我分了包,所以全类名应该是包名加类名,比如util包下的类MyTest的全类名应该是util.MyTest。所以要运行bin/util/MyTest.class应该执行java -cp bin util.MyTest这个命令。-cp参数同样指定了类的搜索路径。现在想来java的这种机制也是合理的,因为只有通过全类名才能唯一指定一个类,然后JVM才能找到这个类并加载它。

就先说一下这两条命令,都是自己实践得来的经验,希望对需要的人有所帮助。其中还有很多参数暂时还没有用到,今后用到了再进行补充。

我要准备好行李启程了,谢谢关心我的家人和朋友,

Javac和Java在CLI中的使用

相关文章:

你感兴趣的文章:

标签云: