java - 通过 ftp 发送数据库 - 获取不同的文件

标签 java android sqlite apache-commons bufferedinputstream

我目前正在使用此代码通过 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 浏览器没有显示任何内容。它适用于非常小的数据库,但一旦数据库变大,我就会遇到这个问题。

我想知道这是否与缓冲区大小有关?谁能阐明为什么会发生这种情况?

谢谢

最佳答案

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

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()。此外,正如评论者所建议的,您需要检查服务器的返回码并进行适当的错误处理。

关于java - 通过 ftp 发送数据库 - 获取不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956161/

相关文章:

java - 带有斜杠的 Hamcrest 匹配器被解释为验证的一部分

sql - 加入SQLite获取所需的记录

Android setVideoEncodingBitRate() 未在包 MediaRecorder 中定义

android - 如何从 "failed to sync vcpu reg"修复 Android 模拟器崩溃

java - 当正在加载的 Activity 保持不变时, Activity 滑到底部(就好像它向下滑动以显示新 Activity 一样)

android - 如何在多个 Activity 中添加数据

java - 游标 RawQuery 上的 NullPointerException - Android

java - Spring Cloud Stream Test 在消息负载中硬编码 "Hello World"

java - Android - 不同实现的切换 Activity

java - Spring DriverManagerDataSource vs apache BasicDataSource