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

标签 java file-io ejb-3.0

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

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

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

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

当一个简单的文件在性能和使用的资源方面是一个更好的解决方案时,我想要这样做以避免在数据库中使用 BLOB。

你会如何解决这个问题?

最佳答案

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

一种选择可能是使用您的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());

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

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

或者,您可以使用 java.beans persistent XML(即 XMLDecoderXMLEncoder)对您的将实例作为 XML 字符串保存到 JNDI 中。

关于java - 如何从 EJB 3 访问文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1357667/

相关文章:

perl - 如何解决 Perl 中的 "print() on closed filehandle"错误?

java - 如何将文件行与带有占位符的字符串进行比较?

java - 在 Android 上从/res/raw/检索表格数据并将其存储到 2D 数组中的最快方法

java - 帮助 EJB 创建无状态 session Bean

java - 有关管理 UDP 调用的架构建议

java - 创建接听电话通知

java - 从命令行将 JAR 依赖项与可执行 JAR (Über JAR) 捆绑在一起

java - Mongodb:循环查询的模式设计是否正确?

java - JTA EntityManager 不能使用 getTransaction()

java - spring orm 4.0.6 中的 HibernateTemplate 缺少 saveOrUpdateAll