【问题标题】:Draw data from InputStream every fixed byte length?每个固定字节长度从 InputStream 中提取数据?
【发布时间】:2016-03-05 17:20:58
【问题描述】:

给定一个 InputStream,我想要一个我调用 next() 的工具,当前执行块直到流中累积 50 个字节,此时 next() 返回长度为 50 的 byte[],包含相关数据。

在 Google 上找到正确的短语非常困难,这就是我在这里的原因。

谢谢。

【问题讨论】:

  • 您是否想要一个具有这种行为的 InputStream,因为您希望 next() 调用将数据“返回”给正在等待的代码,还是我误解了什么?
  • 你说得对,我脑子里想错了。编辑问题。

标签: java inputstream


【解决方案1】:

JDK 中没有这样的工具,但您可以简单地将您的 InputStream 包装成 DataInputStream 并在其上调用 readFully(byte[])

InputStream is = // ...
DataInputStream dis = new DataInputStream(is);
byte[] bytes = new byte[50];
dis.readFully(bytes);
// "bytes" now contains exactly 50 bytes from the stream

要拥有一个具有next() 方法的类,请实现Iterator 接口并在内部执行上述操作。

【讨论】:

    【解决方案2】:

    您绝对应该参考标准 JDK 库,以了解用于读写 IO 的优秀类。但是你的要求很有趣。您想要输入流的“迭代器”类型的接口。所以,这是我的尝试。当然,一些优化是可能的,但希望它能很好地提出这个想法。让我知道这是否是您正在寻找的。我承认合约有一个细微的变化,hasNext() 方法阻塞了底层输入流。我希望没关系。

    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.function.Consumer;
    
    /** An attempt for:
     * http://stackoverflow.com/questions/35817251/draw-data-from-inputstream-every-fixed-byte-length
     *  <b>This class is NOT thread safe.</b>
     * Created by kmhaswade on 3/5/16.
     */
    public class InputStreamIterator extends BufferedInputStream implements Iterator<byte[]> {
    
        private final InputStream in;
        private final byte[] bytes;
        private int bytesRead;
        /**
         * Returns a buffered input stream that "iterates" over a given stream. Follows the decorator pattern.
         * @param in the input stream that should be buffered
         * @param n
         */
        public InputStreamIterator(InputStream in, int n) {
            super(in);
            this.in = in;
            if (n <=0 || n > Integer.MAX_VALUE)
                throw new IllegalArgumentException("illegal value: " + n);
            bytes = new byte[n];
        }
    
        @Override
        public boolean hasNext() {
            try {
                bytesRead = super.read(this.bytes);
                if (bytesRead == -1) {
                    this.close();
                    return false;
                }
                return true;
            } catch (IOException e) {
                throw new RuntimeException(e); // could be handled better ...
            }
        }
    
        @Override
        public byte[] next() {
            if (bytes.length == bytesRead)
                return bytes;
            else
                return Arrays.copyOf(bytes, bytesRead);
        }
    
        @Override
        public void remove() {
            throw new RuntimeException("no way to push back yet");
        }
    
        @Override
        public void forEachRemaining(Consumer<? super byte[]> action) {
            throw new RuntimeException("not yet implemented");
        }
    
        public static void main(String[] args) {
            InputStreamIterator itIn = new InputStreamIterator(System.in, 50);
            while (itIn.hasNext()) {
                byte[] bs = itIn.next();
                for (byte b : bs) {
                    System.out.println("byte read: " + b);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2017-10-04
      • 2015-07-31
      相关资源
      最近更新 更多