2016-04-12 70 views
1

我有一個文本文件,其中包含「酷」字。我讀取了這個文件中的所有字節,並把它變成一個字符串。但是,在另一個函數中,我試圖把相同的字符串轉換回字節寫入文件,我沒有得到我的預期。如何將字符串轉換回字節以寫入Java文件?

Path path = Paths.get(fileName); 
byte[] data = Files.readAllBytes(path); 

String x = new String(); 
for(byte b: data){ 
    x += Byte.toString(b); 
} 
System.out.println(x); 

輸出: 「酷」 變成字節

99111111108 

不幸的是下面的代碼不寫 「酷」 迴文件,而不是將其寫入99111111108.

str = "99111111108"; 
FileOutputStream C = new FileOutputStream("new.txt"); 
C.write(str.getBytes()); 
C.close(); 
+0

如果你創建這樣的字符串會怎麼樣:'String x = new String(data,「UTF-8」);'...你的程序的其餘部分是否按照你的想法行事? – dnault

+0

不,是否有任何其他方式將字符串轉換回除getBytes()以外的字節? – Lui

+1

@Lui - 你可以,但「99111111108」不是你的字符串 - 它是一個由表示字節爲小數的字符串。酷 - > [99] [111] [111] [108]。你需要把「酷」變成字節,而不是「99111111108」 – xpcoffee

回答

1

檢查了這一點:https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)

的toString

公共靜態字符串的ToString(BYTE B)

返回表示指定byte的一個新String對象。基數 被假定爲10

參數:b - 的字節將被轉換返回:指定字節的字符串 表示

另請參見:Integer.toString(INT)

問題是,你將字符串轉換爲字節,但是你要去 並將該字節轉換爲字符串/字符(解釋爲基數爲10的數字 - radix = 10),這意味着您實際上獲得了ascii等效的每個字符(c = 99,o = 111,o = 111,l = 108),這是以10爲底的數字。然而,你是每個數字的數字字符。當你將字符串轉換回一個字節時,你會得到數字字符的字節,而不是像你想要的字母字節。

取決於你實際上是什麼後,你將需要找到一種不同的方法。目前還不清楚你想通過轉換爲字節來顯示什麼,但是如果你真的想轉換爲字符串(由0和1的數字字符組成的字符串),你必須做更多的工作。

如果您使用逗號等其他字符(例如99,111,111,108)來分隔字符串,那麼您可以假設分隔的子字符串是整數(用於常規ascii)並將它們傳遞給'Integer.parseInt(s)'或'Integer.valueOf(s)',然後進行轉換爲char,然後將字符串構建爲字符串。

例如:

StringBuilder sb = new StringBuilder(); 

String str = "99,111,111,108"; // result of initial conversion 
String[] sa = str.split(","); 

char ch = ''; 

for(String s : sa) { 
    ch = Integer.parseInt(s); 
    sb.append(ch); 
} 

FileOutputStream fos = new FileOutputStream("new.txt"); 

fos.write(sb.toString().getBytes()); 
fos.close(); 

這裏一個重要的注意的是,對Java至少,字符都只是剛剛整數他們一個char被解釋爲ASCII字符。

我認爲,將字節轉換爲字符串的基本困境是破壞性的操作,其中上下文丟失。即計算機不再知道原始字節的任何內容,只有新生成的字符串是什麼。字節是二進制數據,但字符串是一組字符(通常是ascii,但也是各種UTF)。

4

無法完成。問題是在字符串「99111111108」中不包括字節開始和結束位置的分界。換句話說,在這個字符串中是「9」的第一個字符,還是「99」?

+0

可以說我有子字符串99,111,111,108 – Lui

+0

我可以使用子字符串來轉換它們嗎? – Lui

2

如果您將字節值表示爲字符串,則可以使用Byte.valueOf方法將它們轉換回字節。

byte b = getByte(); 
String byteAsString = Byte.toString(b); 
System.out.println(byteAsString); //might print something like '111' 

byte o = Byte.valueOf(byteAsString); 
assertEquals(b,o); //true 

對我來說,雖然它看起來這將是更好的只是

new String(byteArray, encoding); 

將數據讀入一個字符串一樣,直接dnault建議。對於任何字符串你得到一個字符用

"string".charAt(index); 

也有可能在你的循環,直接鑄造字節爲char進入一個人物。你可以這樣做

for(byte b: data){ 
    x += (char)b; 
} 
System.out.println(x); 

而這個代碼將打印給你提供的示例中輸入「酷」,儘管這是一個非常幼稚的做法,你會使用比字節的最大值更大值的字符時遇到麻煩。

相關問題