今天有人告诉我“Java EE程序员不写文件”。为什么我不能从Java EE容器中写入文件(例如从JBoss)?有什么问题?
答案 0 :(得分:32)
您应该在Java EE容器中执行所有操作:您无法确定是否可以对文件系统进行任何一致的访问。这有很多原因,最明显的是容器内运行的应用程序将具有:
你还应该假设你不应该:
答案 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的东西。有办法安全而周密地把这些东西拉下来。