代码之家  ›  专栏  ›  技术社区  ›  NullPointerException

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

  •  0
  • NullPointerException  · 技术社区  · 6 年前

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

    我的代码有问题,因为它假定我必须写一些二进制的不可读的东西,但是当我打开文件时,我可以读到:

    原始字符串:

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

    谢谢您。

    1 回复  |  直到 6 年前
        1
  •  1
  •   hardillb    6 年前

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

    如果您想加密文件的内容,使其仅通过散射文件就无法读取,那么您需要选择适当的加密方法。

    其次,在Java中混合读写器和流并不是一个好主意,选择一种风格并坚持下去。

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

    将char作为2字节值写入底层输出流,首先是高字节。如果不引发异常,则计数器写入的值将增加2。

    由于字符串是由单字节字符组成的,这将导致用空字节填充字符串,当重新读取时,这些字节将转换为空格。如果你把这个改成 writeBytes() 然后您应该得到不带额外空字节的输出。

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