Java InputStream size

10 浏览
0 Comments

Java InputStream size

我需要获取InputStream的字节大小,但不想创建一个File实例。是否有办法在Java NIO中实现这个功能?

0
0 Comments

Java中的InputStream对象是用来读取数据的,但是它本身并没有提供直接获取输入流大小的方法。如果想要获取输入流的大小,可以采用以下几种方法。

第一种方法是通过不停地读取输入流,并计算读取的字节数,直到流的末尾。但是这种方法不能同时读取数据本身,如果需要同时读取数据,可以将数据复制到一个ByteArrayOutputStream中。

第二种方法是在读取数据的同时进行处理。可以使用一个循环来读取数据,每次将数据读入同一个缓冲区,并增加一个计数器来记录读取的字节数。这种方法不需要额外的缓冲区或计数器,也不会浪费内存空间。

第三种方法是在读取数据的同时将数据复制到目标位置。这种方法可以避免计数和使用ByteArrayOutputStream的操作,也减少了延迟和内存空间的浪费。但是,这种方法假设在读取数据时已经确定了目标位置。

根据具体的需求,选择适合的方法来获取输入流的大小。如果不确定输入流的大小,可以在读取数据的同时进行处理。需要注意的是,在读取整个输入流之前就获取其大小的方法可能并不适用于大型输入流。

0
0 Comments

Java中的InputStream是用于读取字节流的抽象类,但是它并不提供获取流大小的方法。这是因为流的大小在原则上是无法确定的,例如一个永远不停止写入的对等方。另外,实际上我们也并不需要知道流的大小。解决这个问题的方法是使用一个固定大小的缓冲区,在循环中读取和写入数据。Java的NIO也没有提供任何魔法解决方案来获取流的大小。所以,我们可以使用以下代码来读取InputStream中的数据:

InputStream inputStream = // 获取InputStream对象
byte[] buffer = new byte[1024]; // 创建一个大小为1024的缓冲区
int bytesRead; // 用于记录每次读取的字节数
while ((bytesRead = inputStream.read(buffer)) != -1) {
    // 处理读取到的数据,例如写入到另一个OutputStream中
}

上述代码中,我们使用一个大小为1024的缓冲区来读取输入流中的数据。通过循环不断读取数据,直到读取到末尾(返回值为-1)。在每次循环中,我们可以对读取到的数据进行处理,例如写入到另一个输出流中。

Java的InputStream并不提供获取流大小的方法,因为流的大小是无法确定的。解决这个问题的方法是使用一个固定大小的缓冲区,在循环中读取和处理数据。

0
0 Comments

Java InputStream的size问题是指如何获取InputStream的大小(即字节数),以及解决这个问题的方法。

根据讨论内容,有两种额外的解决方法:

1. 可以调用InputStream的available()方法来获取可读取的字节数。但需要注意的是,available()方法并不返回流的大小。

2. 如果流比较小,可以将其写入PushbackInputStream中,通过计算字节数并进行倒回操作来获取大小。

然而,有人对第一种方法的可行性提出了异议,认为available()方法并不能返回流的大小。在Java文档中明确指出了这一点,并且所有的输入流都是阻塞的。

另一方面,也有人提出反驳,认为available()方法的返回值指定了可以在不阻塞的情况下读取的字节数。特别是对于FileInputStreams,它经常是一个可靠的大小指示器。但这个解决方法并不适用于所有情况,而且与问题本身是否涉及FileInputStream没有直接关系。

根据Java文档的警告,不建议使用available()方法来获取流的大小。

获取Java InputStream的大小并不是一个简单的问题,没有直接的方法可以解决。根据讨论内容,使用available()方法来获取流的大小是不可靠的,而且并不适用于所有类型的输入流。因此,需要根据具体情况选择合适的解决方法。

0