Java 从InputStream获取大小的最低影响方法

Java 从InputStream获取大小的最低影响方法,java,inputstream,Java,Inputstream,我试图获取InputStream的大小,以便与文件传输进行比较,以确保传输所有文件数据。我正在使用Jcraft的ChannelSftp和sftprogressMonitor,但是sftprogressMonitor.init()没有为InputStreams提供max,所以我希望在内部找到它 在系统中的这一点上,我知道InputStream将不会被进一步写入,我无法轻松访问原始文件来读取该大小,并且我已经看到了许多其他读取字节数组或ByteArrayOutputStream的实现。如果我想为实际

我试图获取InputStream的大小,以便与文件传输进行比较,以确保传输所有文件数据。我正在使用Jcraft的ChannelSftp和sftprogressMonitor,但是
sftprogressMonitor.init()
没有为InputStreams提供
max
,所以我希望在内部找到它


在系统中的这一点上,我知道InputStream将不会被进一步写入,我无法轻松访问原始文件来读取该大小,并且我已经看到了许多其他读取字节数组或ByteArrayOutputStream的实现。如果我想为实际的SFTP调用维护InputStream,那么什么方法对系统的总体影响最小?正在写入的文件可能相当大(1+GB),因此简单的实现可能会产生重大影响。

在使用JSch API的上下文中,在调用ChannelSftp.get()之前,可以调用

这将返回一个包含.getSize()方法的值,该方法以字节为单位返回文件大小。这将告诉您需要获取多少字节才能检索整个文件


请记住,如果您正在获取的文件大小经常变化,那么在获取文件大小和开始文件传输之间可能存在竞争条件。因此,如果您只是简单地将其用作进度指标,那么这种方法应该是不错的,但是如果您正在分配静态缓冲区或类似的东西,您可能需要重新考虑您的方法。

如果不做您提到的不能做的事,就无法确定流的大小。如果一个流不能正常完成,你应该得到一个IOException,所以只要读取,如果没有,那么你就读取整个流。为什么不在读取时存储从输入流读取的字节呢?您可以使用read(bytes[]),它返回读取的字节,并跟踪该字节,最后根据预期大小进行检查。可能无法确定输入流的“大小”。例如,System.in是一个InputStream-您建议如何在用户开始键入之前确定其大小?对于一般的
InputStream
来说,这样做有点困难。但是如果您使用特定的实现(如您提到的
ByteArrayInputStream
),那么您可以获得大小。