Ошибка при создании копии МДБ в памяти - PullRequest
0 голосов
/ 31 августа 2018

Я использую приведенный ниже код для создания копии файла mdb в памяти, но он дает исключение нулевого указателя на конструкторе DatabaseBuilder, что файл не существует, я хочу создать копию этого манипулировать им и вернуть копию в outputtream.

Файл tmp = новый файл ("test.mdb");

Канал FileChannel = MemFileChannel.newChannel (TMP, DatabaseImpl.RW_CHANNEL_MODE);

FileUtils.copyFile (файл, tmp);

База данных db = новый DatabaseBuilder (tmp) .setChannel (канал) .open ();

1 Ответ

0 голосов
/ 10 сентября 2018

Итак, у вас есть готовый файл базы данных Access в качестве ресурса в вашем проекте. Вы можете открыть копию этой базы данных в памяти с помощью Jackcess, сначала используя Class#getResourceAsStream, чтобы открыть ресурс ...

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 Джексе 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();
...