如何将base64的文本文件转换为xml文件(或任何其他类型的文件)

时间:2014-06-30 18:16:26

标签: java byte bytearray inputstream fileinputstream

我在文本文件中有这些Base64:

77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxSb290Pg0KICA8SXRl
bXM+DQogICAgPEl0ZW0gTmFtZT0iQ2xhaW1OdW1iZXIiIFZhbHVlPSI0ODY1MTQ4MDQiIC8+DQog
ICAgPEl0ZW0gTmFtZT0iRG9jVHlwZSIgVmFsdWU9IkxpdGlnYXRpb24iIC8+DQogICAgPEl0ZW0g
TmFtZT0iRG9jU3ViVHlwZSIgVmFsdWU9IklOVCBBbnN3ZXJzIiAvPg0KICAgIDxJdGVtIE5hbWU9
IkRvY0RhdGVzIiBWYWx1ZT0iNi8xNC8yMDExIDEyOjAwOjAwIEFNIiAvPg0KICAgIDxJdGVtIE5h
bWU9IkNvbW1lbnRzIiBWYWx1ZT0iUGx0ZiBhbnN3ZXJzIHRvIGludHMgYW5kIHN1bW1hcnkgYnkg
ZGVmZW5zZSBjb3Vuc2VsIiAvPg0KICAgIDxJdGVtIE5hbWU9IlNlY3VyaXR5R3JvdXAiIFZhbHVl
PSJTcGVjIEdlbiIgLz4NCiAgICA8SXRlbSBOYW1lPSJDbGFpbU9mZmljZSIgVmFsdWU9IkFsdCBN
a3RzIE5KIiAvPg0KICAgIDxJdGVtIE5hbWU9IkNsYWltYW50TmFtZSIgVmFsdWU9IkpvYW4gS2Vs
bGV5IiAvPg0KICAgIDxJdGVtIE5hbWU9Ikluc3VyZWROYW1lIiBWYWx1ZT0iQm96dXR0byAmYW1w
OyBBc3NvY2lhdGVzIiAvPg0KICAgIDxJdGVtIE5hbWU9IlByaXZpbGVnZWQiIFZhbHVlPSJObyIg
Lz4NCiAgICA8SXRlbSBOYW1lPSJEaXNwb3NpdGlvbiIgVmFsdWU9IlNlbnQgdG8gRmlsZSIgLz4N
CiAgICA8SXRlbSBOYW1lPSJGZWF0dXJlIiBWYWx1ZT0iIiAvPg0KICAgIDxJdGVtIE5hbWU9IlNl
bnRUbyIgVmFsdWU9IiIgLz4NCiAgICA8SXRlbSBOYW1lPSJGbGFnIiBWYWx1ZT0iMCIgLz4NCiAg
ICA8SXRlbSBOYW1lPSJSZXRhaW5JbWFnZSIgVmFsdWU9Ik5vIiAvPg0KICAgIDxJdGVtIE5hbWU9
IlJldGFpbk9yaWdpbmFsIiBWYWx1ZT0iRG8gTm90IFJldGFpbiIgLz4NCiAgICA8SXRlbSBOYW1l
PSJTb3VyY2UiIFZhbHVlPSJJTkRFWEVEIiAvPg0KICA8L0l0ZW1zPg0KICA8Um91dGU+DQogICAg
PHRvIC8+DQogICAgPGNjIC8+DQogICAgPE5vdGUgLz4NCiAgPC9Sb3V0ZT4NCjwvUm9vdD4=

我需要能够从文本文件中获取那些基本的64个字符并输出新的XML文件。目前,InputStream未正确转换为base 64

public static void main(String[] args) {
    try {
    File file = new File("C:\\Users\\khurt\\Desktop\\xml.txt");
    InputStream myScan = new FileInputStream(file);
    byte[] b = new byte[(int)file.length()];
    myScan.read(b);
    String cowo = myScan.toString();
    String decoded = DatatypeConverter.printBase64Binary(b);
    String cat = b.toString();
    System.out.println(decoded);
    byte[] bArray = cat.getBytes();
        OutputStream out = new FileOutputStream("C:\\Users\\gdfurt\\Desktop\\cow.xml");
        out.write(b);
        out.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我使用了System.out.println(decode);检查字符是否与文件中的字符匹配,而不是。我无法弄清楚为什么,我尝试过使用扫描仪并将其抛出更多。

2 个答案:

答案 0 :(得分:3)

您获得的数据是Base64编码。并且您没有在代码中解码它。这是其他程序无法将其作为XML文件读取的主要原因。

另一个隐藏在您的数据字节中。字节数据的开始是 77u / ,这表示数据是BINARY数据并且在此处成为问题。

使用链接体验解码数据:

http://www.opinionatedgeek.com/dotnet/tools/base64decode/

如果您将使用77u / at数据开头,您将体验数据是BINARY并将作为文件下载。如果您不使用77u /它将仅在线显示输出。

在处理数据时删除前4个字符,然后你就可以进入java代码了。

编辑

请使用以下代码段。您正在重新编码字节数组。你需要解码它。此过程也需要少量字符串转换为字节,反之亦然。

try {
File file = new File("C:\\Users\\ABC\\Desktop\\xml.txt");
InputStream myScan = new FileInputStream(file);
byte[] b = new byte[(int)file.length()];
myScan.read(b);
String cowo = new String(b);
System.out.println( cowo );
String decoded = new String(DatatypeConverter.parseBase64Binary(cowo));
String cat = b.toString();
System.out.println(decoded);
byte[] bArray = cat.getBytes();
    OutputStream out = new FileOutputStream("C:\\Users\\ABC\\Desktop\\cow.xml");
    out.write(decoded.getBytes());
    out.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

答案 1 :(得分:1)

读取字节:

        byte[] b;
        try (InputStream in = new FileInputStream(file)) {
            b = new byte[(int) file.length()];
            in.read(b);
        } // Closes in

Java 7中的哪个更容易:

        b = Files.readAllBytes(file.toPath());

或立即使用Path i.o. Fiile:

        Path path = Paths.get("C:\\Users\\khurt\\Desktop\\xml.txt");
        b = Files.readAllBytes(path);

由于Base64仅使用ASCII do:

        String encoded = new String(b, StandardCharsets.US_ASCII);

将Base64文本解析为byte []

        b = DatatypeConverter.parseBase64Binary(encoded);

如果您希望XML作为文本:

        String decoded = new String(b, StandardCharsets.UTF_8);

顺便说一句,XML以"\ufeff" Unicode BOM字符开头,这是冗余的。