我第一次遇到这种行为。我有从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();
}
}
try(InputStream is = remoteFile.getContent().getInputStream();BufferedInputStream bis = new BufferedInputStream(is);ByteArrayOutputStream baos = new ByteArrayOutputStream()){
IOUtil.copy(bis, baos);
return baos.toByteArray();
}
答案 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();
}