BufferedInputStream不为空,但没有可读取的数据

时间:2015-02-13 13:26:11

标签: java

我第一次遇到这种行为。我有从SFTP服务器获取文件的方法,并返回byte []表示。但我无法得到适当的结果(它总是字节[0]) InputStream也不为空,BufferedInputStream也是如此。 BufferedInputStream buf []包含大约8kb的数组(我在另一边有小图片) 但是

  

bis.available()

总是返回0;
我错过了什么?

public static byte[] downloadFileasBytes(String remoteFilePath){
    StandardFileSystemManager manager = new StandardFileSystemManager();

    try {
        manager.init();

        // Create remote file object
        FileObject remoteFile = manager.resolveFile(createConnectionString(hostName, username, password, remoteFilePath), createDefaultOptions());
        try(InputStream is = remoteFile.getContent().getInputStream();){
            BufferedInputStream bis = new BufferedInputStream(is);
            byte[] byterepr = new byte[bis.available()];
            bis.read(byterepr);

            return byterepr;
        }catch(Exception ex){
            Logger.getLogger(SFTPUtility.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    } catch (Exception ex) {
        Logger.getLogger(SFTPUtility.class.getName()).log(Level.SEVERE, null, ex);
            return null;
    } finally {
        manager.close();
    }

}


UPD


我将来会尽量不这样做。
现在我用这种方式解决了这个问题。

try(InputStream is = remoteFile.getContent().getInputStream();BufferedInputStream bis = new BufferedInputStream(is);ByteArrayOutputStream baos = new ByteArrayOutputStream()){
            IOUtil.copy(bis, baos);
return baos.toByteArray();

}

2 个答案:

答案 0 :(得分:0)

正如InputStream.available()(强调我的)的javadoc所述,你不应该依赖available()

  

返回可以读取的字节数的估计值(或   从此输入流中跳过...

     

请注意,虽然InputStream的某些实现将返回   流中的总字节数,很多不会永远不会   正确使用此方法的返回值来分配缓冲区   旨在保存此流中的所有数据。

答案 1 :(得分:0)

您可以使用FileContent.getSize()以字节为单位获取远程文件的大小。

请注意FileContent.getInputStream()的文档说:

  

输入流是缓冲的,因此无需将其包装在BufferedInputStream中。

所以你可以使用这样的东西:

InputStream is = remoteFile.getContent().getInputStream();    
try {
    byte[] byterepr = new byte[remoteFile.getContent().getSize()];
    is.read(byterepr);
} finally {
    is.close();
}