如何从 EJB 3 访问文件系统?
我想知道如何从 EJB 3 Bean 访问文件系统?
我在互联网上搜索了这个话题,没有找到一个好的答案。
有些人建议使用 java.io/java.nio 即使规范禁止这种用法。无论如何,大多数应用程序服务器似乎都允许访问此API。
另一个想法是使用JCA连接器访问文件系统或LDAP目录。
我想这样做是为了避免在数据库中使用BLOB,因为一个简单的文件在性能和使用的资源方面是一个更好的解决方案。
您将如何解决这个问题?
我想知道如何从 EJB 3 Bean 访问文件系统?
我在互联网上搜索了这个话题,没有找到一个好的答案。
有些人建议使用 java.io/java.nio 即使规范禁止这种用法。无论如何,大多数应用程序服务器似乎都允许访问此API。
另一个想法是使用JCA连接器访问文件系统或LDAP目录。
我想这样做是为了避免在数据库中使用BLOB,因为一个简单的文件在性能和使用的资源方面是一个更好的解决方案。
您将如何解决这个问题?
在 EJB 中禁止您访问文件系统的原因是,您无法控制应用程序在 (Java EE) 容器中的运行方式。例如,您的应用程序可能在服务器集群上运行,在这种情况下,将某些对象保存到一台服务器上的目录中可能用处不大。(当然,您可能有一个网络文件系统,因此限制可能不适用)。
一种选择可能是使用容器附带的 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();
或者,您可以使用持久性 XML(即 , )将实例编码为 XML 字符串,并将其保存到 JNDI 中。java.beans
XMLDecoder
XMLEncoder
如果您知道永远不会对应用程序进行群集(或者您将能够对驱动器进行网络映射),则只需使用 java.io.*。
请务必介绍有关文件存储的根位置的正确配置。