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