我尝试从“ 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”中的字符串转换为byte并存储在“ 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”中的模式如下所示:

<9e>zgóoG^P$@0<81>^B*É^X¿uú<9b>^@


“ stringfile”中的模式如下所示:

�zg�oG^P$@0�^B*�^X�u��^@�� V�


但是,“ newbytefile”中的模式如下所示:

[B@40226788


如何将“ stringfile”中的字符串转换为与“ bytefile”中原始模式相同的字节?

最佳答案

问题是:PrintWriter没有方法写入byte []数组。

因此,当您调用println(getBytes()) ...时,编译器将尝试查找匹配的重载方法。它将找到println(Object)(因为:最后,任何java数组也是Object)。

您可以看到使用javap反汇编程序:


  invokevirtual#22 //方法java / io / PrintWriter.println:(Ljava / lang / Object;)V


在该方法中,在传入对象上调用toString()。而且,当您在字节数组上调用toString()时,您将得到一个类似于“ [B ....””的结果-为何请参见here

换句话说:由于重载,您不是在打印字节数组本身,而是在打印该字节数组的默认字符串表示形式。

07-26 09:30
查看更多