当前位置: 首页 > 知识库问答 >
问题:

从InputStream创建java.util.Stream.Stream的最佳方法是什么?

洪华皓
2023-03-14
public Stream<byte[]> toStream(final InputStream is, final int bufferSize);

共有1个答案

况鸿雪
2023-03-14

您需要编写自己的拆分器,如下所示:

public final class ChunkingInputStreamSpliterator implements Spliterator<byte[]> {

    private final InputStream is;
    private final int bufferSize;

    public ChunkingInputStreamSpliterator(InputStream is, int bufferSize) {
        this.is = is;
        this.bufferSize = bufferSize;
    }

    @Override
    public boolean tryAdvance(Consumer<? super byte[]> action) {
        byte[] bytes;
        try {
            bytes = this.is.readNBytes(this.bufferSize);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
        if (bytes.length == 0)
            return false;
        action.accept(bytes);
        return true;
    }

    @Override
    public Spliterator<byte[]> trySplit() {
        return null; // cannot split an InputStream
    }

    @Override
    public long estimateSize() {
        return Long.MAX_VALUE; // unknown
    }

    @Override
    public int characteristics() {
        return Spliterator.ORDERED | Spliterator.NONNULL;
    }

}

然后像这样实现您的方法:

public static Stream<byte[]> toStream(InputStream is, int bufferSize) {
    return StreamSupport.stream(new ChunkingInputStreamSpliterator(is, bufferSize), false);
}

如果您没有Java11,因此没有非常方便的readnbytes方法,那么您可以像下面这样做:

public boolean tryAdvance(Consumer<? super byte[]> action) {
    byte[] bytes = new byte[this.bufferSize];
    int len = 0;
    try {
        for (int read; len < bytes.length; len += read)
            if ((read = this.is.read(bytes, len, bytes.length - len)) <= 0)
                break;
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
    if (len == 0)
        return false;
    if (len < bytes.length)
        bytes = Arrays.copyOfRange(bytes, 0, len);
    action.accept(bytes);
    return true;
}
 类似资料:
  • 问题内容: 我已经看到了许多不同的方法来创建和填充数字表。但是,创建和填充一个的最佳方法是什么?从“最重要”到“最不重要”定义“最佳”: 用最佳索引创建的表 产生最快的行 用于创建和填充的简单代码 问题答案: 这是一些从网上获取的代码示例,以及对该问题的解答。 对于每种方法,我都修改了原始代码,因此每种方法都使用相同的表和列:NumbersTest和Number,具有10,000行或尽可能接近的行

  • null 另外,如果使用,是否需要导入文件,或者不导入文件,常量将全局可用? 我可以从逻辑上得出一个结论,即是定义自定义错误域之类的东西时的最佳选择(我真的对吗?)。但其他人呢?

  • 问题内容: 好吧,这并不是一个问题,因为我并没有真正“卡住”我的代码,但是我发现Android API在访问外部存储设备和File.createTempFile()方法方面有些奇怪的行为, d想了解正在发生的事情… 请注意,我的清单 中不 包含。 第1部分 : 我有以下代码,它 确实可以 发挥作用: 它会为我创建一个临时文件,并且我可以毫无问题地在其中写入数据。 问题1 :为什么该功能有效,因为我

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我一直在阅读有关使用PHP创建PDF文件的信息,并且想知道最简单的选择是什么。 创建PDF模板,将其打开并替换占位符文本-我应使用哪个功能打开现有PDF进行编辑

  • 本文向大家介绍ThreadPoolExecutor 创建方法最佳实践?相关面试题,主要包含被问及ThreadPoolExecutor 创建方法最佳实践?时的应答技巧和注意事项,需要的朋友参考一下 在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 为什么呢? 使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开

  • 为了让这个布局正常工作,我已经挣扎了好几个小时。 这是我的代码: 每个片段都是一个简单的RelativeLayout(都有相同的视图): 现在我想让它像这样工作: > 1) 无嵌套layout_weight 2)完全没有嵌套(例如嵌套2个第一个片段等) 3)在视图呈现后,不使用代码以编程方式完成。 在我看来,最简洁、可读性最强的方法是将片段1和片段2的方向设置为水平,将片段3设置为垂直,但它不起作