2015-07-21 58 views
-1

我来自C/Linux背景,并没有太多的Java背景知识。我一般开发的系统管理员实用工具,比如:在Java中开发网络安全应用程序和系统实用程序

  • 磁盘清理
  • 找回丢失的数据/文件
  • 修复文件系统
  • 磁盘碎片整理

我还开发了网络监控安全应用帮助管理员监控: - 他们的网络, - 扫描传入&传出数据包, - 远程阻止端口/ USB - 监视带附件的电子邮件等

现在我们编写用于Linux的C代码,必须移植到Windows,但Java中不存在这样的问题。

我的问题是:

  • 就是Java编写这些应用&公用事业正确的语言(如上所述)?

  • 我知道Java会提供库和类来访问系统资源/网络/套接字,但Java抽象会成为一个障碍(这会限制C/C++提供的灵活性)?

  • 例如,如果我想编写一个实用程序来修复文件系统/或检索Windows的数据& Unix ...我将使用相同的API的操作系统或不同的操作系统有不同的API?

我并不关心速度/执行权衡,因为我的应用程序都不必像游戏行业一样做出实时决策。

回答

0

如果您想要可移植性,Java是正确的语言。您几乎可以用C/C++完成所有工作,您可以利用模式和库来帮助您创建出色的可维护设计。如果你的Java有一些非常低的级别,那么你总是可以创建自己的本地代码,并使用Java Native Interface加载。因此,唯一不可移植的代码将是这些本地代码库。

+0

感谢您的回复。我通常开发程序,如磁盘清理,检索丢失的数据/文件,修复文件系统,磁盘碎片和网络扫描和监控。所有这些都可以在Java中实现,并且像在C/C++ –

+0

@SamAnderson中的工作一样高效地工作,“与C/C++一样高效”,您总是更快。有时候这个时间差距并没有得到回报。在提到Java的任务中,它可以做得很好。记住Java甚至用于嵌入式系统。在监控和网络扫描中,您可以使用Java进行确认。修复文件系统,你只需要谷歌为适当的接口,你会发现你需要或使用JNI做到这一点。 – rodolk

0

现在我们下的Linux具有被移植到 窗口,但这样的问题就不会存在于Java编写代码。

因为最终低级别的东西总是归结为进行系统调用,所以在不同的操作系统之间Java只能抽象出很多东西。

只要你使用纯java逻辑或简单的操作系统实用程序,你就会变成黄金。你想打开一个TCP套接字并连接到google.com?没问题。你想打开一个已知位置的文件,读取一些行,处理它们,并将结果写入不同的文件?没问题,Java有你覆盖。但是,如果你想用Java来做更多低级的事情,你很快就会遇到麻烦。你想打开一个原始套接字并发送一个TCP数据包?你不能,windows doesn't allow that。你想在Linux上获取文件的创建时间?你不能,Linux不保留这些信息。 Java的BasicFileAttributes.creationTime()will return a file's modification time on Linux。你想获得纳秒级的时间戳?那么,你可以,but only on some OSes。或者说你想在没有采取网络查询(这取决于网络实际可用)的情况下获得计算机的主机名,那么,准备好some hacking(这是我自己的答案)。

现在,你更具体的问题:

就是Java编写这些应用&公用事业正确的语言(如上所述)?

我坦率地不知道。我从来没有尝试过使用Java以编程方式对文件进行碎片整理或恢复。但是由于它涉及到一些非常低级的文件系统操作,所以我建议你在转移到Java之前做一些认真的阅读。检查您需要的API是否存在于语言本身或一些好的库中。

我理解Java将提供库和类来访问系统资源 /网络/插座但Java的抽象是在某些时候成为障碍 (这将限制其C/C++ 提供了灵活性)?

是的。例如,使用纯Java打开原始套接字是不可能的。如果我记得正确的话,也不可能设置一些套接字选项。

例如,如果我想写一个实用程序来修复文件系统/或 检索Windows & Unix的数据...我会使用相同的API两个 OS或有不同的操作系统不同的API ?

我从来没有试过在Java中修复文件系统的,所以我不能告诉你有关的API。但是我发现很难相信你会发现一个纯粹的Java API用于在文件系统中执行低级别的事情。您可能必须编写自己的本地代码(并通过JNI运行它)或使用其他人的库(可能使用JNI,就像我之前提到的原始套接字库)。