2016-07-13 16 views
-2

我有一個以固定大小創建的流。緩衝區是空的。 我想能夠得到這個緩衝區的大小。什麼是這樣做的有效方式?如何獲得空的「未寫入」流的大小?

這是我所做的。

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 - 這個流只被分配了,但實際上沒有寫入它。在沒有實際複製數據的情況下獲得空輸出流大小的好實現是什麼?

+1

如果你希望100出門,我相當確定你要求的是不可能的。不是在一個香草的'ByteArrayOutputStream'中,不是沒有邪惡的反射hackery。 API是專門設計的,以避免回答這個問題。 –

+1

不要在你的問題中提出答案。 – shmosel

+0

這是一個錯誤。我正在更新適當的討論,最後添加了錯誤的版本。糾正。謝謝。 – nikk

回答

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(); 
} 
+0

謝謝。正是我需要的。乾杯。 – nikk

+1

@nikk雖然這在技術上*回答你的問題,但是你是否真的需要這個問題還是很值得懷疑的,正如EJP的回答中所解釋的那樣。 – shmosel

+0

謝謝。答案解決了我的問題。我只需要爲我的應用程序獲得這個大小。謝謝。 – nikk

1

我有一個用一個固定大小創建一個java.io.OutputStream

不,你不知道。您有一個ByteArrayOutputStream,它是使用非零初始容量創建的。

緩衝區爲空。我想能夠獲得這個緩衝區的大小。

緩衝區的邏輯大小爲零。緩衝區的初始容量是您在構造函數中指定的任何值。

這樣做的有效方法是什麼?

記住你在構造函數中指定的內容。

我希望100

您應該會爲零。看到Javadoc。

我知道它爲什麼是0 - 流只被分配,但實際上沒有寫入它。

沒錯。那麼爲什麼你預期100是一個謎。

如何在不實際複製數據的情況下獲得空輸出流的大小?

'空輸出流的大小'爲零。您的ByteArrayOutputStream的初始容量是您在構建時指定的任何容量。不清楚爲什麼你認爲你需要這個。能力將根據需要有效改變。你似乎在「固定大小」和「初始容量」之間感到困惑。你指定的是後者。