是否可以在Java中生成动态InputStream?

时间:2018-02-26 01:44:09

标签: java inputstream

我在网上看了一下InputStreams,似乎你只能定义一个带有预定义输入的InputStream,它将从中读取。如果我想要一个InputStream,我们不知道数据是什么样的,或者它有多长但是它是在运行的某个地方生成但是当它完成时最终将返回零字节会怎么样?

我预先定义的意思是大多数构造函数接受你已经定义要读取的东西(例如:ByteArrayInputStream(byte [] array),FileInputStream(File file))

我的用例是我有一个返回一定数量数据的方法(这个方法调用服务的时间不明,我希望在动态生成时传输这些数据)

2 个答案:

答案 0 :(得分:3)

当然,只需延长InputStream并让它做任何你想做的事。 ByteArrayInputStream就是这样做的。

答案 1 :(得分:1)

InputStream class是一个抽象类。它包含所有相关方法的定义,除了一个:

public int read() throws IOException

文档说:

  

从输入流中读取下一个数据字节。值字节作为int返回,范围为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类的其他方法可能会有所帮助。特别是,从源中读取数组字节的read(byte[] b, int off, int len) method。这样做的主要好处是,您可以在一次读取多个字节时实现(更高)性能。但是当这与您无关时,那么只需覆盖int read()方法就足够了。