我正在使用propriatery Java庫,將其數據直接保存到java.io.File
中,但我需要能夠讀取數據以便直接進行流式傳輸。數據是二進制的,一些媒體文件。從文件讀取數據時,它正在寫入
java.io.File
作爲參數傳遞給此庫,但我不知道如何從中獲取流。有沒有一些簡單的方法來做到這一點,除了打開文件也讀取和嘗試同步讀/寫操作!?
因爲我從一個applet使用它,所以我想跳過寫入文件系統部分,在這種情況下需要額外的權限。
我正在使用propriatery Java庫,將其數據直接保存到java.io.File
中,但我需要能夠讀取數據以便直接進行流式傳輸。數據是二進制的,一些媒體文件。從文件讀取數據時,它正在寫入
java.io.File
作爲參數傳遞給此庫,但我不知道如何從中獲取流。有沒有一些簡單的方法來做到這一點,除了打開文件也讀取和嘗試同步讀/寫操作!?
因爲我從一個applet使用它,所以我想跳過寫入文件系統部分,在這種情況下需要額外的權限。
如果你的程序的一部分寫入文件,那麼您應該可以使用另一個線程中的普通new FileInputStream(someFile)
流來讀取該文件,儘管這取決於操作系統對此類操作的支持。你不需要同步任何東西。現在,您處於輸出流的擺佈之中,程序的寫入部分多長時間調用flush()
以便可能會有延遲。
這是我寫的little test program,證明它工作正常。讀取部恰恰是在一個循環中看起來類似:
FileInputStream input = new FileInputStream(file);
while (!Thread.currentThread().isInterrupted()) {
byte[] bytes = new byte[1024];
int readN = input.read(bytes);
if (readN > 0) {
byte[] sub = ArrayUtils.subarray(bytes, 0, readN);
System.out.print("Read: " + Arrays.toString(sub) + "\n");
}
Thread.sleep(100);
}
謝謝,它真的很容易 – user1015922
取決於操作系統。有些人不會讓你寫入正在閱讀的文件...其他人有各種麻煩或需要特殊的「共享」模式才能這樣做。特別是Windows似乎討厭它。 – cHao
因此,在Windows中,在同一個應用程序中,如果沒有「共享」模式,就無法讀取自己的文件?不知道。 – Gray
假設文件寫入行爲是庫固有的,您應該檢查其文檔以查看是否可以避免寫入文件系統。 一般來說,如果你想讀取一個正在寫入的文件(即* nix類尾行爲),你可以使用java.io.RandomAccessFile
是的雙重檢查了文檔 – user1015922
我會看看RandomAccessFile,10x – user1015922
如果你能傳遞一個OutputStream相反,這會更容易些。這是一個選擇嗎? – laher