可以用Java生成动态InputStream吗?

可以用Java生成动态InputStream吗?,java,inputstream,Java,Inputstream,我在线查看了InputStreams,似乎您只能使用预定义的输入来定义InputStream,它将从中读取。如果我想要一个InputStream,我们不确定数据是什么样子或者它有多长,但它是在某个地方动态生成的,但当它完成时,最终将返回零字节,该怎么办 我所说的预定义是指大多数构造函数接受您已经定义的要读取的内容(例如:ByteArrayInputStream(byte[]数组)、FileInputStream(File File)) 我在这里的使用案例是,我有一个方法返回一定数量的数据(这个方

我在线查看了InputStreams,似乎您只能使用预定义的输入来定义InputStream,它将从中读取。如果我想要一个InputStream,我们不确定数据是什么样子或者它有多长,但它是在某个地方动态生成的,但当它完成时,最终将返回零字节,该怎么办

我所说的预定义是指大多数构造函数接受您已经定义的要读取的内容(例如:ByteArrayInputStream(byte[]数组)、FileInputStream(File File))


我在这里的使用案例是,我有一个方法返回一定数量的数据(这个方法调用服务的时间未知,我想在动态生成数据时对其进行流式处理)

当然,只需扩展
InputStream
并让它做任何你想做的事情
ByteArrayInputStream
正是这样做的。

该类是一个抽象类。它包含所有相关方法的定义,以下方法除外:

public int read() throws IOException
文件说:

从输入流读取数据的下一个字节。值字节作为0到255范围内的整数返回。如果由于到达流的结尾而没有字节可用,则返回值-1

因此,显示如何从“任意”数据源创建输入流的示例可能如下所示:

import java.io.IOException;
import java.io.InputStream;
import java.util.function.IntSupplier;

public class DynamicInputStreamExample
{
    public static void main(String[] args) throws IOException
    {
        IntSupplier supplier = () -> methodThatProvidesTheData();
        InputStream inputStream = createStream(supplier);

        while (true)
        {
            int read = inputStream.read();
            System.out.println("Read " + read + " from stream");
            if (read == -1)
            {
                break;
            }
        }
    }

    private static InputStream createStream(IntSupplier supplier)
    {
        return new InputStream()
        {
            @Override
            public int read() throws IOException
            {
                return supplier.getAsInt();
            }
        };
    }

    // Dummy implementation of a method that provides the data,
    // as a sequence of 6 bytes. It returns -1 if no more data
    // is available.
    private static final int data[] = { 'H', 'e', 'l', 'l', 'o' };
    private static int index = 0;
    private static int methodThatProvidesTheData()
    {
        if (index >= data.length)
        {
            return -1;
        }
        return data[index++];
    }

}

注意:根据数据的生成方式,另外重写
InputStream
类的其他方法可能会有所帮助。特别是,从源读取字节数组的。这样做的主要好处是,您可以在一次读取多个字节时获得(更)高的性能。但是当这与您无关时,只需重写
int read()
方法就足够了