如何从EJB 3访问文件系统?

Pie*_*ult 23 java file-io ejb-3.0

我想知道如何从EJB 3 bean访问文件系统?

我在互联网上搜索了这个主题,并没有找到一个好的答案.

有人建议使用java.io/java.nio,即使规范禁止这种用法.大多数应用程序服务器似乎都允许访问此API.

另一个想法是使用JCA连接器来访问文件系统或LDAP目录.

我想要做的就是避免在数据库中使用BLOB,因为在性能和使用的资源方面,简单文件是一个更好的解决方案.

你会如何解决这个问题?

oxb*_*kes 9

不允许在EJB中访问文件系统的原因是您无法控制应用程序在(Java EE)容器中的运行方式.例如,您的应用程序可能跨服务器集群运行,在这种情况下,将某个对象保存到一台服务器上的目录可能没什么用处.(当然,您可能拥有网络文件系统,因此限制可能不适用).

一种选择可能是使用Container附带的JNDI实现.您可能能够将原始数组保存在某个JNDI位置,因此您可以始终保存对象的序列化形式:byte[]

ByteArrayOutputStream baos= new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(myObj);

//Now save into JNDI
new InitialContext().bind("path/to/myobject", baos.toByteArray());
Run Code Online (Sandbox Code Playgroud)

这可以在以后查找并重新转换为您的对象:

byte[] bs = (byte[]) new InitialContext().lookup("path/to/myobject");
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs));
MyObj myObj = (MyObj) ois.readObject();
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用java.beans 永久XML(即XMLDecoder,XMLEncoder)到您的实例编码为XML字符串的保存到JNDI.


fly*_*ire 7

如果您知道永远不会集中应用程序(或者您将能够对驱动器进行网络映射),那么只需使用java.io.*即可.

请务必引入有关文件存储的根位置的正确配置.

  • @oxbow_lakes为今天或明天不需要的未来设计也是一种不好的做法.我看到人们完全过度复杂化他们的设计以"在未来变得灵活",但所有这些所谓的灵活性在10年的使用寿命之后并没有被使用过一次.一直以来,它都减缓了各种任务.一如既往,使用常识. (8认同)
  • *"如果你知道你永远不会集中你的申请"* - 如果你发现你可以看到未来,你可能会认为在赌博行业有更有利可图的职业生涯. (7认同)
  • 通过编写不符合Java EE规范的应用程序,您无法确定它是否可移植且可维护.例如,在12个月的时间内,您可能已经离开了这个项目,因为给您的应用程序聚类的任务给穷人带来了巨大的惊喜.或者将其移植到不同的容器中. (2认同)
  • 现在,对于未来的技术而言,这些复杂的事情往往最终都不适合未来,并且从未使用过,无论如何都不会支持大量重写. (2认同)

Con*_*nor 5

封装您对文件数据的访问权限.然后你可以使用上面列出的任何方法.甚至使用数据库.衡量系统的性能.如果它符合要求那么你就完成了.如果不是,您的文件访问权限已在一个位置本地化,您可以替换其他解决方案.如果必须将软件移植到另一个容器和/或必须由其他人维护,则具有相同的好处.