如何从字符串写入二进制文件,然后再次将其检索到字符串?

时间:2018-10-13 14:29:35

标签: java inputstream outputstream fileoutputstream dataoutputstream

我有一个字符串,希望将其持久化到文件中,并能够再次将其检索为字符串。

我的代码出了点问题,因为它假定我必须编写一些二进制不可读的文件,但是当我打开文件时,我可以看到以下内容:

原始字符串:

[{"name":"asdasd","etName":"111","members":[]}]

在二进制文件中存储的字符串:

[ { " n a m e " : " a s d a s d " , " e t N a m e " : " 1 1 1 " , " m e m b e r s " : [ ] } ]

我发现了两个问题:

  1. 未存储为二进制!我看得懂。应该是一个混乱的二进制文本,无法读取,但我可以阅读。
  2. 当我检索它时,它正在字符之间的那个奇怪的空间被检索。因此它不起作用。

这是我存储字符串的代码:

public static void storeStringInBinary(String string, String path) {
    DataOutputStream os = null;
    try {
        os = new DataOutputStream(new FileOutputStream(path));        
        os.writeChars(string);
        os.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }        
}

这是我的将其从二进制读取为字符串的代码:

public static String retrieveStringFromBinary(String file) {
    String string = null;
    BufferedReader reader = null;
    try {           
        reader = new BufferedReader(new FileReader (file));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();      
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {               
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return string;
}   

谢谢。

2 个答案:

答案 0 :(得分:1)

首先,文本文件和二进制文件之间并没有真正的区别。文本文件只是内容属于与字符对应的字节值范围内的文件。

如果要加密文件的内容,以致仅通过添加文件就无法读取文件的内容,则需要选择适当的加密方法。

在Java中第二种混合阅读器/编写器和流绝不是一个好主意,选择一种样式并坚持下去。

将字符串保存到文件的函数存在的问题是您正在使用writeChars()方法,该方法从文档中执行以下操作:

  

将char作为2字节的值写到基础输出流,高字节在前。如果未引发异常,则写入的计数器将增加2。

由于您的字符串是由单字节字符组成的,因此会导致字符串以空字节填充,而在读回时将其转换为空格。如果将其更改为writeBytes(),则应该得到的输出没有多余的空字节。

由于文件中的前导0x00,空字节也会使您的读取函数停止工作,因为readLine()函数在第一次调用时将返回null

答案 1 :(得分:0)

尝试一下:

public static void storeStringInBinary(String string, String path) {
    try(ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path))) {
        os.writeObject(string);
    } catch (IOException e) {
        e.printStackTrace();
    }    
}

public static String retrieveStringFromBinary(String file) {
    String string = null;
    try (ObjectInputStream reader = new ObjectInputStream(new FileInputStream(file))){           
        string = (String) reader.readObject();
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }
    return string;
}