将字节转换为字符串到字节

时间:2017-04-04 14:16:33

标签: java string byte

我尝试从" 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();

"字节文件中的模式"是这样的:

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

&#34; stringfile&#34;中的模式是这样的:

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

然而,&#34; newbytefile&#34;中的模式是这样的:

[B@40226788

如何在'#34; stringfile&#34;中转换字符串?在&#34; bytefile&#34;?

中与原始模式相同的字节

4 个答案:

答案 0 :(得分:2)

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

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

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

  

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

在该方法中,在传入对象上调用toString()。当你在一个字节数组上调用toString()时,你会得到一个看起来像“[B ....” - 的结果 - 见here为什么会这样。

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

答案 1 :(得分:0)

你应该注意的一些事情:

  • 文件始终是字节流。您可以通过假设特定编码来假装它们是文本。
  • 您的第一个示例并没有使用特定的编码来编写PrintWriter,因此您使用的是默认值,您也必须使用该默认值来读取文件。
  • 您已经知道如何使用字符编码进行读/写,编码和解码,只需要一致地完成。
  • Object.toString()打印类型,&#39; @&#39;以及对象的标识哈希码。 byte []不会覆盖此方法,这就是您将其视为代码的原因。

答案 2 :(得分: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();
        }
    }
}

答案 3 :(得分:-1)

你是在正确的轨道上,你仍然需要通过构造一个具有正确参数的字节将字节数组转换为字符串:

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

请记住,有多种方法可以将字节数组转换为String。