2013-09-26 44 views
1

我需要能夠從android中的文件中讀取字節。從文本中讀取數字值已經在Android中編寫的文件

我到處看,應該用FileInputStream從文件中讀取字節,但這不是我想要做的。

我希望能夠讀取包含(編輯)文本表示的字節寬度數值(/編輯),我想要保存到一個數組的文本文件。 我想已經轉換爲一個字節數組的文本文件的一個例子如下:

0x04 0xF2 0x33 0x21 0xAA 

最終文件將要長得多。使用FileInputStream獲取每個字符的值,我想要保存長度爲五的數組以獲得上面列出的值。 我想數組一樣進行處理:

ExampleArray[0] = (byte) 0x04; 
ExampleArray[1] = (byte) 0xF2; 
ExampleArray[2] = (byte) 0x33; 
ExampleArray[3] = (byte) 0x21; 
ExampleArray[4] = (byte) 0xAA; 

上的文本文件使用FileInputStream返回字符的ASCII值,而不是我需要寫入到陣列中的值。

+0

不清楚你想要什麼 – njzk2

+0

@Talls:請告訴我們你的實際要求是什麼!如果它的行爲是存儲字節**這個效率低下,我們將幫助你,如果不是,我們會阻止你犯大錯誤 – tilpner

回答

-1

你剛纔店字節的文本。決不! 由於0x00可以寫入文件中的一個字節,或者作爲一個字符串,在這種情況下(十六進制)佔用4倍的空間。 如果您需要這樣做,請討論這個決定會有多糟糕!
編輯我的答案,如果你可以提供一個明智的理由,但。

你只會保存的東西,實際文本,如果:

  • 更容易(不是這樣)
  • 它增加值(如果超過4(空格數增加文件大小)增加值,那麼是的)
  • 如果用戶應該能夠編輯文件(那麼你會省略「0x」...)

你可以寫字節是這樣的:

public static void writeBytes(byte[] in, File file, boolean append) throws IOException { 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(file, append); 
     fos.write(in); 
    } finally { 
     if (fos != null) 
      fos.close(); 
    } 
} 

,讀這樣的:

public static byte[] readBytes(File file) throws IOException { 
    return readBytes(file, (int) file.length()); 
} 

public static byte[] readBytes(File file, int length) throws IOException { 
    byte[] content = new byte[length]; 
    FileInputStream fis = null; 

    try { 
     fis = new FileInputStream(file); 

     while (length > 0) 
      length -= fis.read(content); 
    } finally { 
     if (fis != null) 
      fis.close(); 
    } 

    return content; 
} 

,因此有:

public static void writeString(String in, File file, String charset, boolean append) 
     throws IOException { 
    writeBytes(in.getBytes(charset), file, append); 
} 

public static String readString(File file, String charset) throws IOException { 
    return new String(readBytes(file), charset); 
} 

寫入和讀取字符串。

請注意,我不使用try-with-resource結構,因爲Android的當前Java源代碼級別太低。 :(

+0

字節始終以文本形式存儲 - 當需要人們閱讀它們時,希望通過不會通過整個二進制代碼空間的通道進行轉換時,當需要保持構圖時...是的,它效率低下,但這不一定是最重要的因素。 –

+0

@ChrisStratton :但是,那麼爲什麼在開始時需要「0x」,爲什麼沒有像JSON或XML這樣的進一步結構呢?我沒有看到這種存儲方式的好處。唯一的缺點......通過構圖你是什麼意思? – tilpner

+0

'0x'的原因是爲了清楚起見而指定基數,或者因爲hex不是唯一允許的選項。有趣的是,你會抱怨這種開銷,然後提到JSON或XML。構建可以像換行符一樣簡單,以分隔消息或記錄或塊 - 一旦進入純粹的二進制文件,處理這些內容確實不是微不足道的。 –

0

最簡單的解決方案是使用FileInputStream.read(byte [] a)方法將文件中的字節傳輸到字節數組中。

+0

原來這張海報的真正願望是做一些不同於它最初出現的東西 –

0

編輯:看來我誤解了要求。所以該文件包含字節的文本表示。

Scanner scanner = new Scanner(new FileInputStream(FILENAME)); 
String input; 
while (scanner.hasNext()) { 
    input = scanner.next(); 
    long number = Long.decode(input); 
    // do something with the value 
} 

老答案(顯然是錯誤的這種情況,但我會離開它爲後人):

使用FileInputStreamread(byte[])方法。

FileInputStream in = new FileInoutStream(filename); 
byte[] buffer = new byte[BUFFER_SIZE]; 
int bytesRead = in.read(buffer, 0, buffer.length); 
+0

這會返回字母的ASCII字節而不是長度爲5的數組, 25個元素 – Talls