2

我正在使用以下方法将字节数组输出到文本文件:

try{
    FileOutputStream fos = new FileOutputStream(filePath+".8102");
    fos.write(concatenatedIVCipherMAC);
    fos.close();
    }catch(Exception e)
    {
        e.printStackTrace();
    }

它向文件输出 UTF-16 编码的数据,例如:

¢¬6î)ªÈP~m~LïiƟê•Àe»/#Ó ö¹¥'þ²XhÃ&¼lG:Öé )GU3«´DÃ{+í—Ã]íò

但是,当我读回它时,我会þÿ在数据的前面加上,例如:

þÿ¢¬6î)ªÈP~m~LïiƟê•Àe»/?#Ó ö¹¥'þ²XhÃ&¼lG:Öé )GU3«´DÃ{+í—Ã]íò

这是我用来读取文件的方法:

private String getFilesContents()
{
    String fileContents = "";
    Scanner sc = null;

    try {
        sc = new Scanner(file, "UTF-16");
        System.out.println("Can read file: "+file.canRead());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    while(sc.hasNextLine()){
        fileContents += sc.nextLine();                     
    }
    sc.close();
    return fileContents;
 }

然后byte[] contentsOfFile = fileContents.getBytes("UTF-16");将字符串转换为字节数组。

一个快速的 Google 告诉我 þÿ 代表字节顺序,但是是 Java 把它放在那里还是 Windows?如何避免在我正在读取的数据开头添加 þÿ?我想忽略前两个字节,但如果是 Windows,那么这显然会破坏其他平台上的程序。

编辑:将附加更改为前置。

4

2 回答 2

3

文件是IV+data+MAC。它不是可读的文本吗?我应该做一些不同的事情吗?

是的。您不应该试图在任何地方将其视为文本。

如果确实需要将任意二进制数据转成文本,请使用 Base64 进行转换。除此之外,坚持使用字节数组InputStreamOutputStream.

我不确切知道为什么你应该得到额外的字符,但你没有真正的文本开始这一事实表明它并不值得诊断那一面。只需开始将二进制数据作为二进制数据处理即可。

编辑:为了简单起见,看看GuavaIO 助手......

于 2012-12-06T17:06:15.870 回答
3

þÿ是保存为 UTF16-BE的字节顺序标记 (BOM) unicode 字符,解释为 ISO-8859-1。

如果您想避免此类错误,则不应将二进制数据视为文本(以任何编码方式)。

于 2015-12-09T14:58:30.490 回答