簡體   English   中英

Java中的隨機訪問文件和額外的ASCII字符

[英]Random Access File and extra ASCII characters in Java

我有一個充滿字符串的隨機訪問文件(我知道它們並不是真正的字符串,盡管它可以幫助我解釋問題)。 我想做的是查看某個字符串,比如說字符串4。 盡管對於整數和通常為原始數據類型的整數類型來說,這很簡單,因為它們具有固定的字節長度,並且我可以通過對所有先前的字節求和來讀取正確的字節。

我設法通過給所有String固定長度的16個字符來解決此問題,因此,如果我有單詞“ dog”,那么RAF中的這個單詞就是“ dog”(dog + 13個空格),字節長度為也固定。 同樣,我可以使用以下方法輕松讀取正確的值:

static String loadOne(int n) throws IOException {
    raf = new RandomAccessFile(file, "rw");
    raf.seek((n-1)*(fix+2));
    String x = raf.readUTF();
    return x;
}

其中n是我要讀取和修復的值的數量,是一個String的字符(和字節)數量。

一切似乎都很好,直到我在一個字符串中使用了一個額外的ASCII字符-波蘭字母-因為它由2個字節組成。 字符長度仍然相同-16,但是有17個字節,整個內容崩潰了。

我能做什么?

我強烈懷疑您沒有以預期的方式使用readUTF 您確切閱讀了它的內容嗎?

從當前文件指針開始讀取前兩個字節,就像通過readUnsignedShort一樣。 此值給出編碼字符串中的后續字節數,而不是結果字符串的長度。 然后,將以下字節解釋為以修改后的UTF-8格式編碼字符的字節,並將其轉換為字符。

這與您文件中存儲的內容匹配嗎? (您尚未指定任何有關文件格式的信息。)

鑒於UTF-8的寬度不是固定的,因此聽起來不適合您的方案。

我建議每個條目使用32個字節,它將始終以UTF-16代碼單位提供16個char值。 您可以使用new String(data, "UTF-16BE")text.getBytes("UTF-16BE")非常簡單地進行轉換(如果需要,也可以使用LE代替BE )。 這樣一來,您將擁有一個真正固定長度的字符串,以字節為單位,而不僅僅是字符。

暫無
暫無

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

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