2017-04-04 52 views
2

"bytefile"からバイトを読み込み、それをStringに変更して "stringfile"に格納しようとしました。以下のコードは私がどのように実行するかです。バイトから文字列への変換

PrintWriter writer = new PrintWriter(new FileOutputStream(new File("stringfile"), true)); 
    RandomAccessFile file = new RandomAccessFile("bytefile", "r"); 
    byte[] b = new byte[(int)file.length()]; 
    file.readFully(b); 
    String str = new String(b, StandardCharsets.UTF_8); 
    writer.write(str); 
    writer.close(); 

次に、 "stringfile"の文字列をバイトに変換して "newbytefile"に格納しようとします。しかし、結果は私の期待を満たしていません。

String charset = "UTF-8"; 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("stringfile"), charset)); 
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("newbytefile"), charset)); 
    String line; 
    while ((line = reader.readLine()) != null){ 
     writer.println(line.getBytes()); 
    } 
    reader.close(); 
    writer.close(); 

"bytefile" のパターンは、このようなものです:

�zg�oG^[email protected]�^B*�^X�u��^@�� V� 

しかし、「newbytefile内のパターン:

<9e>zgóoG^[email protected]<81>^B*É^X¿uú<9b>^@ 

"stringfile" のパターンは、このようなものです"は次のようなものです:

[[email protected] 

"stringfile"の文字列を "bytefile"の元のpattenと同じバイトに変換するにはどうすればよいですか?

+0

文字列に配列を変換する方法:あなたのバイト配列を適切に変換することができ、これは動作します提供

http://stackoverflow.com/questions/409784/whats-the-simplest-way- –

+0

'writer.println(line.getBytes());'は実際に 'println(Object)'を呼び出し、次に 'Object'のデフォルトの' toString'を呼び出します。 – Berger

答えて

2

問題は次のとおりです。PrintWriterなしバイトの配列を書き込むメソッドです。

したがって、println(getBytes())を呼び出すと、コンパイラは一致するオーバーロードされたメソッドを見つけようとします。 println(Object)が見つかります(最終的に、Java配列はいずれもオブジェクト)。

あなたはそのてjavap逆アセンブラを使用して見ることができます:

するINVOKEVIRTUAL#22 //メソッドJAVA/IO/PrintWriter.println:(Ljava/LANG /オブジェクト;)V

と内このメソッドは、受信オブジェクトに対してtoString()が呼び出されます。そして、バイト配列のtoString()を呼び出すと、 "[B ....]"のような結果が得られます。理由はhereを参照してください。

つまり、オーバーロードのために、バイト配列そのものを印刷するのではなく、そのバイト配列のデフォルト文字列表現を印刷しています。

+0

'println(String)'は、String参照を渡す場合にのみ呼び出されます。 –

+1

それは配列のアドレスを与える配列のtoStringメソッドを暗黙的に呼び出すprintln(Object)メソッドを使用します –

+0

javaの経験が少ない他の人には絶対に明確になるため、 "コンパイラはprintln Object) "の文字列に変換され、文字列に変換されます。答えを読んでいる他の人が文字列に変換されて、println(String)オーバーロードを使用しない理由がわからないようにするだけですか? –

0

あなたが注意すべきいくつかの点:

  • ファイルは常にバイトストリームです。あなたは特定のエンコーディングを想定して、それらがテキストであるふりをすることができます。
  • 最初の例では、PrintWriterを書き込むために特定のエンコーディングを使用しないので、ファイルを読み込むために使用する必要があります。
  • あなたはすでに文字コードを使って読み書き、エンコード、デコードを行う方法を知っています。一貫して行う必要があります。
  • Object.toString()は、オブジェクトの型、 '@'および識別ハッシュコードを出力します。 byte []はこのメソッドをオーバーライドしません。なぜなら、これをコードのように見ているからです。変換の複数の方法があることを覚えておいてください

    new String(line.getBytes(), "UTF-8"); 
    

-1

あなたは正しい軌道に乗っているが、あなたはまだ右の引数を持つものを構築することにより、文字列にバイトの配列に変換する必要がありますバイト配列をStringに変換します。

0

入力データが問題を引き起こしている可能性があります。文字列に正しくエンコードできません。

あなたが実行している場合:!

package au.com.redbarn.stackoverflow.convert_byte_to_string_to_byte; 

import java.nio.charset.StandardCharsets; 

public class NoFiles { 

    public static void main(String[] args) { 

     byte[] byteIn = {60, 57, 101, 62, 122, 103, -13, 111, 71, 94, 80, 36, 64, 48, 60, 56, 49, 62, 94, 66, 42, -55, 94, 88, -65, 117, -6, 60, 57, 98, 62, 94, 64}; 
     String s = new String(byteIn, StandardCharsets.UTF_8); 
     byte[] byteOut = s.getBytes(StandardCharsets.UTF_8); 
     System.out.println(byteOut); 
    } 
} 

BYTEINを= BYTEOUT

たぶん、あなたが適切に文字列に変換します知っているバイト配列で始まります。あなたが実際にやろうとしていることは何ですか?

package au.com.redbarn.stackoverflow.convert_byte_to_string_to_byte; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.FileSystems; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.List; 

public class ConvertByteToStringToByte { 

    public static void main(String[] args) { 

     try { 
      // Read bytes, write String. 
      byte[] b = Files.readAllBytes(FileSystems.getDefault().getPath("bytefile-in")); 
      String strOut = new String(b, StandardCharsets.UTF_8); 

      try (PrintWriter pw = new PrintWriter("stringfile")){ 
       pw.println(strOut); 
      } 
      catch (IOException e) { 
       throw (e); 
      } 

      // Read String, write bytes. 
      List<String> strsIn = Files.readAllLines(FileSystems.getDefault().getPath("stringfile")); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      for (String strIn : strsIn) { 
       baos.write(strIn.getBytes(StandardCharsets.UTF_8)); 
      } 

      Files.write(Paths.get("bytefile-out"), baos.toByteArray());   
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
関連する問題