【问题标题】:Error in creating a copy of mdb in memory在内存中创建 mdb 副本时出错
【发布时间】:2018-08-31 15:27:27
【问题描述】:

我正在使用下面的代码在内存中创建 mdb 文件的副本,但它在 DatabaseBuilder 构造函数上给出了空指针异常,即不存在文件,我想要的是创建此操作的副本并将副本返回到 outputstream。

文件 tmp = new File("test.mdb");

FileChannel 频道 = MemFileChannel.newChannel(tmp,DatabaseImpl.RW_CHANNEL_MODE);

FileUtils.copyFile(file , tmp);

数据库 db = new DatabaseBuilder(tmp).setChannel(channel).open();

【问题讨论】:

  • 如果你这样指定test.mdb,你必须正确放置文件。例如。如果从命令行运行它,该文件必须在当前工作目录中。如果您尝试从 eclipse 或 maven 运行它,它搜索的目录就是 java 项目目录。
  • @m4gic 我想在内存中创建 test.mdb 目标文件是资源文件夹中正确加载的物理文件
  • DatabaseBuilder 也有一个没有参数的构造函数。你试过new DatabaseBuilder().setChannel ... ...吗?
  • @GordThompson 然后它说空数据库文件,如果我删除 cahnnel 创建代码并编写新的 DatabaseBuilder(tmp).open() 则一切正常,这就是我现在使用的
  • 当您说“资源文件夹中存在的物理文件”时,您是否打算将数据库作为可执行 jar 文件的一部分分发,并希望在运行时打开数据库的内存副本你的应用?

标签: java jackcess


【解决方案1】:

因此,您在项目中有一个预先制作的 Access 数据库文件作为资源。您可以先使用 Class#getResourceAsStream 打开资源,然后使用 Jackcess 打开该数据库的内存副本...

final String dbResourcePath = "/embedded.accdb";
@SuppressWarnings("rawtypes")
Class thisClass = JackcessTestMain.class;  // my "main" class
InputStream dbResourceStream = null;
// for running from executable jar 
dbResourceStream = thisClass.getResourceAsStream("/resources" + dbResourcePath);
if (dbResourceStream == null) {
    // for running inside the Eclipse IDE
    dbResourceStream = thisClass.getResourceAsStream(dbResourcePath);
}

... 将 InputStream 传递给 Jackcess MemFileChannel ...

MemFileChannel mfc = MemFileChannel.newChannel(dbResourceStream);

...然后使用DatabaseBuilder从频道打开Database

Database db = new DatabaseBuilder().setChannel(mfc).open()

完成对数据库内存副本的更改后,您可以将通道的内容发送到 OutputStream。例如,

db.close();
FileOutputStream fos = new FileOutputStream("C:/Users/Public/zzz.accdb");
mfc.transferTo(fos);
fos.close();

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 2021-12-18
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2014-09-25
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多