4

我目前正在使用此代码通过 ftp 发送数据库(使用 apache commons)

File file = getDatabasePath("database");

FTPClient ftp = new FTPClient();

try {
    ftp.connect(InetAddress.getByName(domain));
    ftp.login(username, password);
    ftp.setFileType(FTP.BINARY_FILE_TYPE);
    FileInputStream is = new FileInputStream(file);
    BufferedInputStream buffIn = new BufferedInputStream(is);
    ftp.enterLocalPassiveMode();
    ftp.storeFile("database", buffIn);
    buffIn.close();
    ftp.logout();
    ftp.disconnect();
} catch (Exception e) {
    // TODO: handle exception
}

我用它来发送一个文本文件,它可以工作。但是,我已经用我的数据库进行了尝试,并且在服务器上放置了一个相同大小的文件,但是当我打开它时,SQLite 浏览器什么也不显示。它适用于一个非常小的数据库,但是一旦数据库更大,我就会遇到这个问题。

我想知道这是否与缓冲区大小有关?任何人都可以解释为什么会这样吗?

谢谢

4

2 回答 2

0

您发布的代码不适用于不适合缓冲输入流缓冲区的文件。您需要做的是从输入流中重复读取直到结束:

ftp.enterLocalPassiveMode();
ftp.storeFile("database", buffIn);
byte[] buffer = new byte[8192];
OutputStream os = ftp.storeFileStream("database");
int readCount = 0;
while ((readCount = buffIn.read(buffer)) > 0) {
    os.write(buffer, 0, readCount);
}
os.close();
buffIn.close();

重要的是使用storeFileStream()代替storeFile()。此外,正如评论者所建议的,您需要检查服务器的返回代码并进行适当的错误处理。

于 2012-04-17T11:16:06.093 回答
0

SQLite 数据库副本在由设备而不是模拟器生成时出现损坏

在不同的程序中打开数据库文件似乎可行。见上面的链接。

于 2012-04-24T00:47:16.840 回答