我遇到了一個問題,試圖解析文件的ascii部分,一旦我打到結束標記,IMMEDIATELY開始讀取該點上的字節。我在Java中所知道的讀取一行或整個單詞的所有內容都會創建一個緩衝區,這會破壞在停止點之後立即獲取字節的任何機會。唯一的方法就是逐字節地讀取數據,找到換行符,在換行之前重建所有內容,查看它是否是我的結束標記,然後從那裏開始?Java - 是否可以逐行讀取文件,停止,然後立即開始讀取停止的字節?
回答
這個文件有多大?我的第一個想法是將整個事件讀入ByteBuffer或ByteArrayOutputStream而不嘗試處理它,然後通過比較字節值來定位標記。一旦您知道文本部分結束並開始二進制部分,就會適當地處理每個部分。
是的,你是正確的逐字節。抽象有其缺點。
@crimson:AAAAAAARRRRRRRRRRRRGGGGGGGGGGGGGG – sepiroth 2009-08-27 14:22:03
Java的性格和字節流之間的強區別,同時確保您始終正確處理數據和字符串和編碼區分它們有用,確實讓這個有點困難。 – 2009-08-27 14:23:02
這是可能的,但據我所知不是從API的類。
您可以手動完成 - 將其打開爲BufferedInputStream,它支持mark
/reset
。您逐塊讀取(byte[]
),並將其解析爲ASCII。最終你將它累積在一個緩衝區中,直到你點擊標記。 但在此之前read
請致電mark
。如果您確信自己讀取了ASCII中所需的所有內容,則可致電reset
,然後致電read
轉儲剩餘的ASCII部分。現在你有一個BufferedInputStream
(這是一個InputStream
)準備好讀取文件的二進制部分。
等待,這將如何工作?我不知道結束標記有多遠,所以我能想到的唯一數據結構就是一個數組列表。看着緩衝區,似乎我需要知道分配給它多少,我不知道。是處理這個東西的最佳方式一個數組列表? – sepiroth 2009-08-27 17:10:07
您讀取100個字節。它是否包含結束標記(由於ASCII編碼,易於測試)?不,那是它的一部分。記住它在某處(將其解析爲字符串)。你讀下一個塊。再次,它不包含結束標記,您可以跟蹤它。等等。有一次,你讀了一個有結束標記的塊。您剪下拳頭部分(在標記之前),將其存儲爲字符串解析。您回滾到塊的開頭,您讀取/跳過字節,直到標記之後,並且您擁有正確的二進制輸入流。 您連接累積的部分並使用'Reader'。 TBC – Marian 2009-08-27 18:25:38
您需要注意橫跨兩個連續塊的結束標記。 您可以在連接之前將'byte []'作爲'List
我認爲最好的想法是放棄「線條」的概念。要查找結束標記,請創建一個大小足以容納結束標記的ring buffer,逐字節讀入,並在每個字節後檢查它是否包含標記。
還有更復雜和高效的搜索算法,但區別只在於較長的搜索條件(可能您的結束標記很短)。
文件是否在增長,還是靜態的?
如果它是靜態的,看到http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html
它是靜態的,但我沒有看到mappedbytebuffer爲了讀取數組中的所有字節等等而如何爲我提供比普通的bytebuffer更多的功能。 – sepiroth 2009-08-28 08:52:50
- 1. 在讀取00字節後停止讀取/讀取字節
- 2. 文件讀取停止
- 3. 是否可以停止在讀取或提示中停止的命令?
- 4. Java讀取來自CONSOL的粘貼輸入,然後停止
- 5. 停止讀取某一行的文本文件java
- 6. iBeacon廣播開始,立即停止
- 7. 異常停止讀取文件python
- 8. 如何停止fgets讀取FIFO文件
- 9. 麻煩停止文件讀取過程
- 10. 文件讀取停止線時達到
- 11. 程序不會停止讀取文件
- 12. 停止觀看android - 暫停,然後開始並從停止的地方開始
- 13. Python的停止讀取使用文件讀取
- 14. Python串口停止讀取
- 15. 從stdin停止讀取
- 16. 空行後Java停止閱讀
- 17. 如何在EOF後停止讀取值
- 18. 當使用BinData無法讀取時停止從文件讀取
- 19. Java Applet開始執行後停止
- 20. 從文件中讀取的Python突然停止
- 21. 在RX溢出後SocketCAN停止讀取,是否正常?
- 22. Eclipse是否允許立即停止tomcat?
- 23. Java - 如何逐字讀取大文件而不是逐行讀取?
- 24. 停止Parallel.ForEach立即
- 25. IntentService立即停止
- 26. 立即停止NSTimer
- 27. 是否有可能停止Backbone「讀取」請求
- 28. 優雅的方式來防止開始後立即停止事件發射
- 29. R,是否可以從最後一行讀取CSV文件的開始行?
- 30. 網站開始加載,然後停止
不是很大的文件;我喜歡這個簡單。我會試試看。 – sepiroth 2009-08-27 18:43:47
其實我真的很喜歡這個,現在我讀了它。所以這個計劃是將漏洞讀入一個字節緩衝區(我知道文件有多大,以字節爲單位,所以這個緩衝區將是正確的大小)。然後我搜索我的結束標記的字節緩衝區,然後我在那裏切分緩衝區。那會有用嗎?我想想搜索我的結束標籤將涉及搜索第一個字節,如果找到,檢查第二,第三等確認。 – sepiroth 2009-08-27 18:48:30
這就是我的想法。 – 2009-08-27 18:55:56