Исключение пустого файла базы данных при попытке открыть файл базы данных Access с помощью Jackcess

Кажется, шифрование Jackcess не может открыть предоставленный файл.

Вот код. Я пытаюсь открыть базу данных, защищенную паролем, и экспортировать указанную таблицу в виде файла .csv.

    public class DBTool {
    private final String source = "/Users/myMac/Desktop/database.mdb";
    private final String destination = "/Users/myMac/Desktop/table.csv";
    private File sourceF;
    private File destinationF;
    private Database db;

    public DBTool() {

    }

    public void openEDB(){
        sourceF = new File(source);
        try {
            db = new DatabaseBuilder(sourceF)
                    .setCodecProvider(new CryptCodecProvider("password"))
                    .open();
        } catch (IOException ex) {
            Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void exportDB(){
        sourceF = new File(destination);
        try {
            ExportUtil.exportFile(db, "TableName", destinationF);
        } catch (IOException ex) {
            Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Вот ошибки Я не могу понять, как просто открыть файл для экспорта.

java.io.IOException: Empty database file
    at com.healthmarketscience.jackcess.impl.JetFormat.getFormat(JetFormat.java:276)
    at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:378)
    at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:248)
    at accesstoolssim.DBTool.openEDB(DBTool.java:30)
    at accesstoolssim.AccessToolsSim.main(AccessToolsSim.java:9)

Exception in thread "main" java.lang.NullPointerException
    at java.io.FileOutputStream.<init>(FileOutputStream.java:203)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
    at java.io.FileWriter.<init>(FileWriter.java:90)
    at com.healthmarketscience.jackcess.util.ExportUtil.exportFile(ExportUtil.java:204)
    at com.healthmarketscience.jackcess.util.ExportUtil.exportFile(ExportUtil.java:172)
    at accesstoolssim.DBTool.exportDB(DBTool.java:39)
    at accesstoolssim.AccessToolsSim.main(AccessToolsSim.java:10)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

person snowflake    schedule 18.05.2015    source источник
comment
Пробовали ли вы открыть базу данных обычным способом, т. е. db = DatabaseBuilder.open(sourceF);, чтобы посмотреть, что это делает?   -  person Gord Thompson    schedule 18.05.2015
comment
Тот же вывод, потому что файл пуст, поэтому он попадает в .open и выдает пустой файл базы данных. Я не думаю, что это может быть проблема с самим источником, либо я использую БД, и она отлично работает в Access.   -  person snowflake    schedule 18.05.2015
comment
В openEDB() попробуйте проверить sourceF.length(), чтобы убедиться, что оно не равно нулю. Кроме того, я думаю, вы хотите destinationF = new File(destination); в ExportDB.   -  person Gord Thompson    schedule 18.05.2015
comment
ИсточникF.length(); вернул 0. и я определенно хотел, чтобы пункт назначенияF не был источником. Итак, если длина файла равна нулю, используя переменную, а также полный путь, может ли это быть проблемой пути? Или более серьезные проблемы с методом, который я использую для открытия файла? Открытие файла - это то, что поставило меня в тупик, все остальное после этого кажется довольно простым. Спасибо за советы.   -  person snowflake    schedule 18.05.2015
comment
Да, почти наверняка это случай, когда строка source на самом деле не указывает на входной файл .mdb. Дважды проверьте, и если вы работаете на машине, отличной от Windows, помните, что пути и имена файлов * nix чувствительны к регистру (я не помню, чувствительны ли они и к Mac).   -  person Gord Thompson    schedule 18.05.2015
comment
Вы также можете проверить, действительно ли существует исходный файл, который вы пытаетесь использовать, проверив значение sourceF.exists().   -  person Gord Thompson    schedule 19.05.2015
comment
Спасибо, после переключения на мою виртуальную машину я смог заставить программу работать в Windows (все, что мне нужно, это работать с Windows)   -  person snowflake    schedule 19.05.2015
comment
Проблема была в пути к файлу. Все остальное отлично, за исключением того, что первая строка, которая обычно сортируется по первому столбцу (ключу), спрыгнула до 10.   -  person snowflake    schedule 19.05.2015
comment
Извините за несколько сообщений, по-видимому, ключ возврата на iOS отправлен. Но в любом случае ключи упорядочены от 0 до 5000, а 0 не первый, когда я экспортирую его 10-й ... Странно   -  person snowflake    schedule 19.05.2015
comment
ExportUtil.exportWriter может работать с курсором (детали здесь), поэтому вы можете использовать это возможность контролировать порядок экспорта. Попробуйте и задайте новый вопрос, если вам нужна дополнительная помощь.   -  person Gord Thompson    schedule 20.05.2015


Ответы (1)


java.io.IOException: Empty database file
    at com.healthmarketscience.jackcess.impl.JetFormat.getFormat(JetFormat.java:276)

говорит вам, что Jackcess считает, что файл, который вы пытаетесь открыть, не содержит байтов. Даже база данных Access без (пользовательских) таблиц, запросов и т. д. все равно будет иметь ненулевой размер файла из-за системных объектов, которые должны присутствовать, чтобы она была действительным файлом базы данных.

Таким образом, либо файл, который вы пытаетесь открыть, действительно существует, но имеет нулевую длину, либо указанный вами путь недействителен.

person Gord Thompson    schedule 19.05.2015