6

FTP 経由でファイルの最初の 1k バイトを読み取ることができる非常に単純な関数が必要です。これを MATLAB で使用して最初の行を読み取り、いくつかのパラメーターに従って、最終的に本当に必要なファイルのみをダウンロードしたいと考えています。残念ながら機能しない例をいくつかオンラインで見つけました。ここでは、1 つのファイルをダウンロードしようとしているサンプル コードを提案しています (Apache ライブラリを使用しています)。

FTPClient client = new FTPClient();
    FileOutputStream fos = null;

    try {
        client.connect("data.site.org");

        // filename to be downloaded. 
        String filename = "filename.Z";
        fos = new FileOutputStream(filename);

        // Download file from FTP server
        InputStream stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z");
        byte[] b = new byte[1024];
        stream.read(b);
        fos.write(b);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fos != null) {
                fos.close();
            }
            client.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

エラーは空で返されるストリームにあります。フォルダー名を間違った方法で渡していることはわかっていますが、どうすればよいかわかりません。私は多くの方法で試しました。

また、URL の Java クラスを次のように試しました。

    URL url;

    url = new URL("ftp://data.site.org/pub/obs/2008/021/ab120210.08d.Z");

    URLConnection con = url.openConnection();
    BufferedInputStream in =
            new BufferedInputStream(con.getInputStream());
    FileOutputStream out =
            new FileOutputStream("C:\\filename.Z");

    int i;
    byte[] bytesIn = new byte[1024];
    if ((i = in.read(bytesIn)) >= 0) {
        out.write(bytesIn);
    }
    out.close();
    in.close();

しかし、InputStream を閉じるとエラーが発生します。

私は間違いなく立ち往生しています。についてのいくつかのコメントは非常に役立ちます!

4

3 に答える 3

1

このテストを試す

    InputStream is = new URL("ftp://test:test@ftp.secureftp-test.com/bookstore.xml").openStream();
    byte[] a = new byte[1000];
    int n = is.read(a);
    is.close();
    System.out.println(new String(a, 0, n));

それは間違いなく機能します

于 2013-04-14T14:27:41.197 に答える
0

から取得したストリームからバイトを読み取るときの私の経験からftpClient.retrieveFileStream、最初の実行では、バイトバッファーがいっぱいになることが保証されていません。stream.read(b);ただし、それに基づくサイクルで囲まれた戻り値を読み取るか、高度なライブラリを使用して長さ 1024 の byte[] バッファを埋める必要があります。

InputStream stream = null;
try {
    // Download file from FTP server
    stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z");
    byte[] b = new byte[1024];
    IOUtils.read(stream, b); // will call periodically stream.read() until it fills up your buffer or reaches end-of-file
    fos.write(b);

} catch (IOException e) {
    e.printStackTrace();
} finally {
    IOUtils.closeQuietly(inputStream);
}
于 2014-03-14T14:05:08.250 に答える