我以前使用过cshell/tcshell,然后转向使用Python。
现在我想要将所有的shell脚本、GUI、数据库和网页集成在一起。Python在大多数工作中表现良好,但相对于GUI、总体性能和第三方库而言比较弱。
因此,我打算尝试Java作为我的主要开发语言。它是否擅长于shell交互式编程、进程控制等等呢?
非常感谢。
Java本身可能不是最好的shell语言,因为启动时间慢,缺乏内置库来处理操作系统、命令和文件(我的意思是,甚至没有办法在Java中复制文件,除非创建两个输入和输出流并将数据传输,呕!)。
然而!有许多基于JVM的语言,如JRuby(ruby)、Rhino(javascript)、Jython(python)、Groovy或Grash、Bean-shell等,它们像shell语言一样工作,并可以运行其他以Java编写的程序。我建议你看看Grash,这可能正是你需要的。
这些语言中的一些甚至有一种方法来预加载JVM运行时以加快启动时间(例如JRuby的Nailgun),因此可以解决启动时间慢的问题。另请参见this post,了解如何使用Ruby(JRuby)作为shell语言。
JVM启动通常很慢,而且占用的内存相对于本地应用程序来说也比较大。因此,它不适合运行许多(并行)经常启动和关闭的小型应用程序(进程)...如果这是你的意图的话。
我编写了jpad,以允许运行Java“shell脚本”和交互式片段,同时还提供结果的良好可视化。这展示了我的意思:
final File file = new File("outt.csv");
Object o = new int[] {1,2,3};
JPad.writeCsv(o, file);
java.nio.file.Files.copy(file.toPath(), Paths.get("copy.csv"));
你也可以从命令行运行它:
> more fileio.jpad
final File file = new File("outt.csv");
Object o = new int[] {1,2,3};
JPad.writeCsv(o, file);
java.nio.file.Files.copy(file.toPath(), Paths.get("copy.csv"));
> jpad fileio.jpad
> dir
29/04/2017 13:30 <DIR> .
29/04/2017 13:30 <DIR> ..
29/04/2017 13:30 16 copy.csv
29/04/2017 13:30 160 fileio.jpad
29/04/2017 13:30 16 outt.csv
FileChannel.transferTo
方法可以解决这个问题。无论如何,使用Java编写shell脚本主要问题是JVM启动时间需要相当长的一段时间。主要原因当然是磁盘的问题。 - bestsssFileChannel.transferTo
也不是更好的选择。你仍然需要为源文件和目标文件创建两个文件句柄,并手动循环以传输数据。这对于像复制这样简单的操作来说,需要大量的代码。相比之下,使用 Apache 的 commons.io 库中的一行代码FileUtils.copyFile(file1, file2)
就可以完成。启动时间可能会慢一些,但正如我所提到的,你可以使用 Nailgun 来解决这个问题,它可以预加载 JVM 并允许你在每次启动程序时重用它。Nailgun 可以用于任何基于 JVM 的语言。 - rodion