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

エミュレータではなくデバイスによって生成された SQLite データベース コピーが破損しているように見える

別のプログラムでデータベース ファイルを開くと、うまくいくようです。上記のリンクを参照してください。

于 2012-04-24T00:47:16.840 に答える
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 に答える