簡體   English   中英

如何干凈地讀取同時包含ASCII和Java編碼的文件?

[英]How Can I read a file with both ASCII and another encoding in Java cleanly?

我有一個自定義圖像文件,其中第一個數據塊是ASCII元數據。 我需要能夠使用Java讀取文件的ASCII元數據部分,並知道何時結束以及何時以另一種編碼的“原始圖像數據”開始。

我正在考慮將所有文件讀入byte [],然后以某種方式開始從中讀取字節並將其轉換為ASCII,直到到達ascii元數據部分的末尾為止,此時我將存儲該字節數據。 然后,我可以按原樣以不同順序重新排列原始二進制數據(無需讀取)。 但是,我想到的唯一方法是逐字節讀取ascii內容並查找新行,並在新行之前合並所有內容,然后查看這是否是表示開始的標簽。原始圖像數據。 但是,必須有更好的方法通過readLine()讀取文件的ascii部分,然后能夠立即從原始圖像二進制文件開始,而無需在新的閱讀器中重新打開文件並轉到其中的行。其他讀者我發現了“開始圖片”標簽。

有任何想法嗎?

  • 打開文件作為FileInputStream (包裝在BufferedInputStream
  • 創建一個ByteArrayOutputStream
  • 逐字節讀取輸入流,使用字符串搜索算法查找“開始圖像”標簽。 將單個字節轉換為char (隱式使用ASCII)
  • 同時,將您查看過的每個字節寫入ByteArrayOutputStream
  • 找到標簽后,就可以開始從輸入流中讀取圖像數據了
  • ByteArrayOutputStream獲取字節數組,然后使用new String(array, "US-ASCII");將其轉換為String new String(array, "US-ASCII");

可能可以通過在輸入流上使用Scanner來輕松地搜索字符串,但是您必須小心使用哪種模式,以確保在不開始讀取圖像數據的情況下可以找到標簽(因為要讀取)從基礎輸入流中自己獲取的信息,您需要單獨引用)。

編輯:不幸的是,看起來Scanner也隱式地使用了緩沖區,因此剩下的唯一選擇是“手動”實現字符串搜索。

不知道是否可以自己決定格式,但是無論如何:

一種替代策略是在文件的第一個位置寫入一個整數值,該值包含用於ascii分區的字節數。 然后,您可以讀取該字節數,也可以輕松地跳過ascii並直接進入二進制blob。

此策略是有效的,但是您不能在不更改計數的情況下更改ascii文本字符的數量。

順便說一句,請確保清理您的輸入:不要嘗試讀取更多的數據,而后文件包含或分配更多的內存,而計算機則無法這樣做。

就我個人而言,我還將使用文件的前幾個字符來包含一些魔術代碼,以便您可以最小程度地檢查文件是否使用了數據格式以及數據格式的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM