Java EE程序员不会写入文件

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

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

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

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

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

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

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

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

你还应该假设你不应该

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

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

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

其他答案已经给出了这方面的原因:

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

最终,这些问题的最佳资源是数据库。

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

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

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

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

为了与传统的非j2ee系统互操作,你偶尔必须做“坏事”,如socket i / o,写入文件等。在最好的世界中,j2ee规范将严格遵守,但是为了方便起见并完成工作,人们总是侥幸逃脱非j2ee的东西。 有办法安全,周到地把这些东西拉下来。