在内存中创建mdb副本时出错

时间:2018-08-31 15:27:27

标签: java jackcess

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

  

文件tmp =新文件(“ test.mdb”);

     

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

     

FileUtils.copyFile(file,tmp);

     

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

1 个答案:

答案 0 :(得分:2)

因此,您有一个预制的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传递给Jack 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();