Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedInputStream不是空的,但没有可读取的数据_Java - Fatal编程技术网

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

Java BufferedInputStream不是空的,但没有可读取的数据,java,Java,我第一次面对这种行为。我有一个方法从SFTP服务器获取文件,并返回它的字节[]表示形式。但是我无法获得正确的结果(总是字节[0])。 InputStream不为空,BufferedInputStream也为空。BufferedInputStream buf[]包含大约8kb的数组(我在另一侧有一个小图片)。 但是 之二.可用() 返回值始终为0 我错过了什么 public static byte[] downloadFileasBytes(String remoteFilePath){

我第一次面对这种行为。我有一个方法从SFTP服务器获取文件,并返回它的字节[]表示形式。但是我无法获得正确的结果(总是字节[0])。
InputStream不为空,BufferedInputStream也为空。BufferedInputStream buf[]包含大约8kb的数组(我在另一侧有一个小图片)。
但是

之二.可用()

返回值始终为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();

}

正如javadoc for(emphasis mine)中所述,您不应该依赖可用的
):

返回可读取字节数的估计值(或 已跳过)从该输入流

注意,虽然InputStream的一些实现将返回 流中的总字节数,许多字节将不会<从来都不是 正确使用此方法的返回值分配缓冲区 用于保存此流中的所有数据

您可以使用以字节为单位获取远程文件的大小

请注意,的文档说明:

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

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

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

“返回可从此输入流读取(或跳过)的字节数的估计值,而不会被此输入流的方法的下一个调用方阻止。”不要指望它…但如何定义结果数组大小?我没有其他可用的数据可以使用。通常的做法是使用固定的数组大小,然后在循环中从流中读入该数组,直到read()操作返回-1,这意味着流结束。在许多情况下,您不会事先知道可以从流中读取多少字节,除非数据大小实际上是作为流中的第一个数据给定的。该方法可用于获取远程文件的字节大小。哦,thanx用于提及缓冲区!