【问题标题】:Sending a databse via ftp - Getting a different file通过 ftp 发送数据库 - 获取不同的文件
【发布时间】:2012-03-31 13:11:33
【问题描述】:

我目前正在使用此代码通过 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 浏览器时,它什么也不显示。它适用于一个非常小的数据库,但一旦数据库更大,我就会遇到这个问题。

我想知道这是否与缓冲区大小有关?谁能解释一下为什么会这样?

谢谢

【问题讨论】:

标签: java android sqlite apache-commons bufferedinputstream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多