2016-09-16 10 views
0

バイト形式(.getbytesを使用)の8つの異なる値をテキストファイルに書き込むコードを書きました。バイト形式の文字列からJavaの元の文字列へ

私はそれを実行した後、ファイルは次を含む作成されます。 5f18cd5 @ [B [1c515979 @ B [20c92575 @ B [75ba3523 @ B [Bする@ f4c7f77 [67446579 @ B [B @ 3b621fe6 [271c537f

@ Bこれまでのところは良い...

私は今、別のJavaプロジェクトでは、このプロセス全体を逆にしたいと思います。このために私は例えば[B @ 1c515979を元の値の0.7071に戻す方法を知る必要があります。

私は戻って、文字列にバイトコードを変換することを望んだこれで

System.out.println("Text [Byte Format] : " + bytes.toString()); 

を使用しようとしました。 しかし、問題は、テキストファイルから読み込んでいるので、読み込まれたデータは文字列だと思うので、実際には文字列に変換するだけです。

これは私の現状です...誰でもアイデアがありますか?

お寄せいただきありがとうございます。

+0

なぜ値をテキストとして最初に保存しないのですか? – aviad

+0

String上で 'getBytes()'を呼びますか?次に、 'bytes.toString();'の代わりに 'new String(bytes);'を使うべきです。 – Clayn

+0

"これまでのところ良い" ...いいえ、良くない。あなたは間違った方法でデータを書いています。表示される[B @ ...文字列は、バイト配列の表現ではありません。配列には 'toString'メソッドがないので、これを取得します。 – Jesper

答えて

2

[[email protected]はバイトではない、それは参照の文字列表現です。 何かに戻すことはできません。

public class Ref { 
    public static void main(final String[] args) { 
     System.out.println(new Ref()); 
    } 
} 
//Outputs: [email protected] 

[email protected]を参考にしてください。実際にはファイルに値を書き込むのではなく、Stringとして参照します。 B[は、ファイルにbyte[]を書き込んでいますが、という配列には実際のバイトではありません。

あなたは、おそらくこのような何かを探している

更新:あなたが表示さ

public static void main(final String[] args) throws FileNotFoundException, 
     IOException { 
    final File f = new File("/tmp/output"); 

    final ObjectOutputStream oos = new ObjectOutputStream(
      new FileOutputStream(f)); 

    for (int i = 0; i < 8; i++) { 
     final double d = Math.sin(i); 
     System.out.println(d); 
     oos.writeDouble(d); 
    } 

    oos.flush(); 
    oos.close(); 

    System.out.println("---"); 

    final ObjectInputStream ois = new ObjectInputStream(
      new FileInputStream(f)); 

    for (int i = 0; i < 8; i++) 
     System.out.println(ois.readDouble()); 

    ois.close(); 

} 
1

できません。あなたはすでにすべての重要なデータを失ってしまっています。 byte[]toString()を呼び出すと便利なことはありません。Javaの配列はtoString() ...をオーバーライドしないため、Objectから実装が得られます。これは型とハッシュコードを示しています配列のハッシュコード)。バイト配列の内容を変更してtoString()を呼び出すと、同じ値になります。

代わりに、データの保存方法を変更する必要があります。テキストファイルがまったく必要ないのであれば理想的ですが、にはにテキストファイルが必要です。最も単純なオプションはおそらく、バイナリデータをbase64に変換することです。 java.util.Base64使用:

String text = Base64.getEncoder().encodeToString(bytes); 
// Write out text... 

... 

// String text = // read from a file 
byte[] bytes = Base64.getDecoder().decode(text); 
0

文字列([[email protected]など)はバイト値のエンコーディングではありません。むしろ、それらはjava.lang.ObjectのデフォルトのtoString()メソッドの出力です: 'class name' + "@" 'ハッシュコードin hex'。

これをバイトの内容に変換することはできません。

バイトを書き込む方法を変更する必要があります。各バイト配列を書き込むにはDataOutputStreamを試してください。

アレイごとに、DataOutputStream.writeInt()を使用して配列の長さを書き、次にバイト自体を書き込みます。それらを読み取るには、DataInputStreamを使用してください。最初に長さを読み取ってから、その長さのバイト配列を作成し、データを配列に読み戻します。