首页 > 解决方案 > 如何从字符串写入二进制文件并将其再次检索到字符串?

问题描述

我有一个字符串,想将它保存到一个文件中,并能够再次将它检索到一个字符串中。

我的代码出了点问题,因为假设我必须写一些二进制不可读的东西,但是当我打开文件时,我可以读到这个:

原始字符串:

[{"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;
}   

标签: javainputstreamoutputstreamfileoutputstreamdataoutputstream

解决方案


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

如果您想加密文件的内容以使其仅通过 catting 文件不可读,那么您将需要选择适当的加密方法。

其次,在 Java 中混合 Readers/Writers 和 Streams 绝不是一个好主意,选择一种风格并坚持下去。

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

将 char 作为 2 字节值写入底层输出流,先是高字节。如果没有抛出异常,则写入的计数器加 2。

由于您的字符串由单字节字符组成,这会导致用空字节填充字符串,在读回时将其转换为空格。如果您将其更改为,writeBytes()那么您应该在没有额外空字节的情况下获得输出。

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


推荐阅读