如何实现InputStream的read()方法?

时间:2016-12-01 17:03:55

标签: java sockets inputstream

对于特定任务,我试图覆盖扩展InputStream的自定义类的read()方法。

到目前为止,我的实施是:

private ArrayList<byte[]> inputBuffer = new ArrayList<>(); 
...
@Override
public int read(@NonNull byte[] b) throws IOException {
    if (inputBuffer.size() > 0) {
        b = inputBuffer.get(0);
        inputBuffer.remove(0);
    } else
        return -1;

    return b.length;
}

我正在向我的InputStream添加数据:

boolean writeDataToInputStream(byte[] data) {
    int arrSize = inputBuffer.size();
    if (data.length > 0) {
        inputBuffer.add(data);
    }
    return arrSize < inputBuffer.size();
}

我已阅读文档,我知道默认情况下此方法的工作原理。但我需要以某种方式将ArrayList元素传递给输入参数byte[] b

我已经在java中编写了几年的代码,但我从未关注过如何实际实现此方法。如何将数据传递给传入参数并从我写的ArrayList元素中返回字节数?

由于我的架构,我必须使用自定义套接字专门用于BLE w /输入和输出流,我使用WiFi套接字,BT套接字。

请为我揭开这个谜。

1 个答案:

答案 0 :(得分:1)

当您创建自己的InputStream时,您必须实现的唯一方法是abstract方法searching motifs,这也比实现{{1}更不容易出错和/或read(byte[] b)。此外请注意,read(byte b[], int off, int len)的默认实现已经为您检查了参数,因此除非您想自己重新验证参数,否则您应该仅实现read(byte b[], int off, int len)

所以在你的情况下,这个方法可能是:

read()

但是如果你真的想要实现// Current index in the last byte array read private int index; private List<byte[]> inputBuffer = new ArrayList<>(); ... @Override public int read() throws IOException { if (inputBuffer.isEmpty()) { return -1; } // Get first element of the List byte[] bytes = inputBuffer.get(0); // Get the byte corresponding to the index and post increment the current index byte result = bytes[index++]; if (index >= bytes.length) { // It was the last index of the byte array so we remove it from the list // and reset the current index inputBuffer.remove(0); index = 0; } return result; } ,它的外观如下:

read(byte b[], int off, int len)