java - 如何从字符串写入二进制文件并将其再次检索到字符串?
问题描述
我有一个字符串,想将它保存到一个文件中,并能够再次将它检索到一个字符串中。
我的代码出了点问题,因为假设我必须写一些二进制不可读的东西,但是当我打开文件时,我可以读到这个:
原始字符串:
[{"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 " : [ ] } ]
我发现两个问题:
- 不是以二进制形式存储的!我可以阅读它。它应该是一个混乱的二进制文本,无法阅读,但我可以阅读它。
- 当我检索它时,它被检索到字符之间的那个奇怪的空间。所以它不起作用。
这是我存储字符串的代码:
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;
}
解决方案
首先,文本文件和二进制文件之间没有真正的区别。文本文件只是一个文件,其内容落在与字符对应的字节值范围内。
如果您想加密文件的内容以使其仅通过 catting 文件不可读,那么您将需要选择适当的加密方法。
其次,在 Java 中混合 Readers/Writers 和 Streams 绝不是一个好主意,选择一种风格并坚持下去。
将字符串保存到文件的函数的问题是您正在使用该writeChars()
方法,该方法从文档中执行以下操作:
将 char 作为 2 字节值写入底层输出流,先是高字节。如果没有抛出异常,则写入的计数器加 2。
由于您的字符串由单字节字符组成,这会导致用空字节填充字符串,在读回时将其转换为空格。如果您将其更改为,writeBytes()
那么您应该在没有额外空字节的情况下获得输出。
空字节也将停止您的读取函数工作,因为由于文件中的前导 0x00,该readLine()
函数将在第一次调用时返回。null
推荐阅读
- css - 移除子元素的不透明度
- powershell - 用于运行桌面应用程序的 Windows 虚拟帐户
- javascript - Jquery 到 React js
- python - Python 内存溢出
- java - 如何使用毫秒在 android 中获取两个日期之间的差异?
- visual-studio-code - vscode this.~调用变量未自动完成
- c# - 允许在 where-expression 中使用类函数
- python - 从请求 django 中提取承载令牌
- rust - 初始化 RAM 时生锈 STM32F4 HardFault
- postgresql - 如何在 ubuntu 服务器上运行的 Postgresql 12 中安装包/模块/库?