如何获得一个空的"不成文的大小"流?

时间:2016-07-13 22:11:04

标签: java stream outputstream bytearrayoutputstream

我有一个用固定大小创建的流。缓冲区为空。 我希望能够获得此缓冲区的大小。这样做的有效方法是什么?

这就是我所做的。

static OutputStream CreateBuffer()
{
    return (OutputStream) new ByteArrayOutputStream(100);
}

static int GetBufferSize(OutputStream out)
{
    return ( (ByteArrayOutputStream) out).size();
}


public static void main(String[] args)
{
    System.out.println(GetBufferSize(CreateBuffer()));
}

我希望100。我知道为什么它是0 - 流只是分配但实际上还没有写入它。在没有实际复制数据的情况下获得空输出流大小的良好实现是什么?

2 个答案:

答案 0 :(得分:1)

您可以通过继承ByteArrayOutputStream

来获取内部缓冲区大小
private static class ByteArrayOutputStreamWithCapacity extends ByteArrayOutputStream {
    public ByteArrayOutputStreamWithCapacity(int size) {
        super(size);
    }

    public synchronized int capacity() {
        return buf.length;
    }
}

void CreateBuffer()
{
    OutputStream out = new ByteArrayOutputStreamWithCapacity(100);
}

int GetBufferSize(OutPutStream out)
{
    return ( (ByteArrayOutputStreamWithCapacity) out). capacity();
}

答案 1 :(得分:1)

  

我创建的java.io.OutputStream是固定大小的。

不,你没有。您创建的ByteArrayOutputStream初始容量为非零。

  

缓冲区为空。我希望能够获得这个缓冲区的大小。

缓冲区的逻辑大小为零。缓冲区的初始容量是您在构造函数中指定的任何内容。

  

这样做的有效方法是什么?

记住你在构造函数中指定的内容。

  

我期待100。

你应该期待零。见Javadoc。

  

我知道为什么它为0 - 只分配了流,但实际上还没有写入任何内容。

完全。那么为什么你期望100是一个谜。

  

在没有实际复制数据的情况下获取空输出流的大小有什么好的实现?

'空输出流的大小'是零。 ByteArrayOutputStream的初始容量是您在构造时指定的任何内容。不清楚为什么你认为你需要这个。容量将根据需要有效地改变。你好像在固定尺寸和#39;之间感到困惑。和'初始容量'。你指定的是后者。