Java EE程序员不会写入文件

时间:2009-11-24 11:54:37

标签: java java-ee jboss

今天有人告诉我“Java EE程序员不写文件”。为什么我不能从Java EE容器中写入文件(例如从JBoss)?有什么问题?

8 个答案:

答案 0 :(得分:32)

您应该在Java EE容器中执行所有操作:您无法确定是否可以对文件系统进行任何一致的访问。这有很多原因,最明显的是容器内运行的应用程序将具有:

  • 不确定任何后续的EJB调用甚至可以在相同的物理服务器上,并且可以访问相同的文件/文件系统(例如,在群集时)
  • 不可能互相干扰(多个应用程序试图写入同一文件)
  • 没有安全问题(一个应用程序编写另一个应用程序可以阅读的机密数据)

你还应该假设你不应该

  • 创建自己的线程(容器将为您管理;如果您创建自己的线程,您可能会在CPU时间容器中使其他应用程序饿死)
  • 使用socket-IO(也有安全问题)

答案 1 :(得分:16)

要查看的最佳页面是:http://www.oracle.com/technetwork/java/restrictions-142267.html

详细介绍了Java EE编程模型的限制。

除了上面提到的安全性,可移植性,群集,线程之外,还考虑了事务和错误处理(文件系统不是事务性的)。

然而,JVM中没有黑魔法发生,你可以创建文件(只要你有相应的权限),使用静态变量,如果你知道你在做什么就创建线程。

最好花些时间来理解为什么通常会建议这些限制,而不是为了符合要求而跳转和编写JCA连接器。

答案 2 :(得分:5)

即使你有权访问文件系统,使用分布式系统也无法确定下次调用方法时,它将在编写文件的同一台机器上处理。

答案 3 :(得分:5)

根据Java EE规范,除了通过“资源管理器”(JDBC,JNDI,JCA等)之外,严格禁止EJB访问任何外部资源,这尤其包括通过类的访问本地文件系统java.io包。此外,ClassLoader也不能用于此类访问,例如从应用程序的类路径加载属性文件。

其他答案中已经提到了这个原因:

  • 安全问题
  • 便携性问题
  • 群集问题
  • 线程问题

最终,这些事项的最佳资源是数据库。

答案 4 :(得分:3)

如果您的实例没有群集,或者可以保证所有实例都可以使用网络驱动器,那么使用File apis读取/写入文件并不是一个真正的问题。但是,必须注意使路径正确并适当地清理。通常没有任何真正需要写文件所以再考虑一下。大多数人给出的主要原因是,在群集中,不同的服务器不会看到相同的文件,因为路径会发生变化等等。最后,大多数小应用程序都没有在这样的集群中运行......

答案 5 :(得分:3)

您应该将文件系统视为企业信息系统(EIS)。然后,您可以创建一个访问此EIS的ResourceAdapter,类似于访问数据库的JDBC适配器。规范在这里:http://java.sun.com/j2ee/connector/download.html。这意味着可以访问文件,但更复杂。此规范甚至允许您创建某种称为Work的“线程”。

答案 6 :(得分:2)

因为Java EE规范不提供用于写入文件的API。当然,您可以使用普通的Java IO API来创建文件,但是您必须确保此代码是线程安全的,有人清理文件,文件名传递给下一个bean,文件是将bean移动到集群中的另一个节点等时迁移

因此,虽然你可以这样做,但在实践中,你会遇到许多小问题,这些问题使得在Java EE中处理文件变得非常困难。

答案 7 :(得分:1)

为了与传统的非j2ee系统进行互操作,您偶尔必须执行“糟糕的事情”,例如socket i / o,写入文件等。在最好的世界中,将遵循j2ee规范严格来说,为了方便和完成工作,人们总是侥幸逃脱非j2ee的东西。有办法安全而周密地把这些东西拉下来。