读取文件的第一个字节

时间:2013-04-14 14:10:03

标签: java matlab ftp

我需要一个非常简单的函数,允许我通过FTP读取文件的前1k字节。我想在MATLAB中使用它来读取第一行,并根据一些参数,下载最终我真正需要的文件。我在网上发现了一些不幸的例子。在这里,我建议我尝试下载一个文件的示例代码(我正在使用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时出现错误!

我肯定被卡住了。一些评论非常有用!

3 个答案:

答案 0 :(得分: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));

它肯定有效

答案 1 :(得分: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);
}

答案 2 :(得分:-1)

我无法理解为什么它不起作用。我发现这个link,他们使用Apache库每次读取4096个字节。我读了前1024个字节并且它最终起作用,唯一的事情是如果使用了completePendingCommand(),程序将永远保留。因此,我已将其删除,一切正常。