如何获取空 "unwritten" 流的大小?

How to get the size of an empty "unwritten" stream?

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

这是我所做的。

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——流只是分配了但实际上还没有写入任何内容。什么是在不实际复制数据的情况下获取空输出流大小的好实现?

您可以通过继承 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();
}

I have a java.io.OutputStream that is created with a fixed size.

不,你不知道。您有一个 ByteArrayOutputStream 是用非零初始容量创建的。

The buffer is empty. I want to be able to get the size of this buffer.

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

What is an efficient way of doing this?

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

I expect 100.

你应该期待零。请参阅 Javadoc。

I know why it is 0 -- the stream was only allocated but nothing has actually been written to it yet.

没错。所以你为什么期望 100 是个谜。

What is a good implementation to get the size of an empty outputstream without actually copying data?

'The size of an empty output stream' 为零。 ByteArrayOutputStream 的初始容量是您在构造它时指定的任何值。不清楚为什么你认为你需要这个。容量将根据需要有效地改变。您似乎混淆了 'fixed size' 和 'initial capacity'。你指定的是后者。