2016-04-12 6 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]。 "cool"をバイトに戻す必要があります。 "99111111108" – xpcoffee

答えて

1

チェックこのアウト:https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)

のtoString

のpublic static String型のtoString(バイトb)

は、指定されたbyteを表す新規Stringオブジェクトを返します。戻り値を変換するバイト - B:指定されたバイト

の文字列 表現関連項目:持つInteger.toString(int型)

を基数 は10

パラメータであると仮定されます

問題は、文字列をバイトに変換することですが、次に に行き、そのバイトを文字列/文字(基数10の数字として解釈 - 基数= 10)に変換することです。各文字(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 

dnaultが提案のようにちょうど

new String(byteArray, encoding); 

と直接文字列にデータを読み取るために良いだろうように思えるのに。任意の文字列を使用すると、また、それはあなたのループ内でcharへのバイトをキャストすることにより、直接文字を取得することが可能です

"string".charAt(index); 

で文字を取得します。あなたはこの

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

を行うことができ、これは非常に単純なアプローチですが、このコードは、あなたが提供した例入力与えられた「クール」印刷し、バイトの最大値より大きい値を持つ文字を使用するときに問題に実行します。

関連する問題