我试图解析我的文件,该文件以二进制形式保存所有数据。如何从偏移量为M的文件中读取N个字节?然后我需要使用new String(myByteArray, "UTF-8");
将其转换为String。谢谢!
这里有一些代码:
File file = new File("my_file.txt");
byte [] myByteArray = new byte [file.lenght];
UPD 1:我看到的答案并不合适。我的文件以字节形式保存字符串,例如:当我输入字符串" str"在我的文件中它实际上打印出类似于[B @ 6e0b ...在我的文件中的smth。因此,我需要从这个字节码中得到我的字符串" str"试。
UPD 2:当我发现问题时,我会使用toString():
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(System.getProperty("db.file")), true), "UTF-8")));
Iterator it = storage.entrySet().iterator();//storage is a map<String, String>
while (it.hasNext()){
Map.Entry pairs = (Map.Entry)it.next();
String K = new String(pairs.getKey().toString());
String V = new String(pairs.getValue().toString);
writer.println(K.length() + " " + K.getBytes() + " " + V.length() + " " + V.getBytes());//this is just the format I need to have in file
it.remove();
}
可能会有不同的方式来执行此操作吗?
答案 0 :(得分:5)
从Java 7开始,阅读整个文件非常简单 - 只需使用Files.readAllBytes(path)
即可。例如:
Path path = Paths.get("my_file.txt");
byte[] data = Files.readAllBytes(path);
如果您需要手动执行此操作,则应使用FileInputStream
- 您的代码到目前为止已分配数组,但不会从文件中读取任何内容。
要只读取文件的部分,您应该使用RandomAccessFile
,这样您就可以在任何地方寻找。请注意,read(byte[])
方法不保证一次性读取所有请求的数据。你应该循环直到你已经阅读了所需的一切,或者使用readFully
代替。例如:
public static byte[] readPortion(File file, int offset, int length)
throws IOException {
byte[] data = new byte[length];
try (RandomAccessFile raf = new RandomAccessFile(file)) {
raf.seek(offset);
raf.readFully(data);
}
return data;
}
编辑:您的更新谈到了查看[B@6e0b..
等文字。这表明您在某个时间点toString()
正在呼叫byte[]
。不要这样做。相反,您应该使用new String(data, StandardCharsets.UTF_8)
或类似的东西 - 当然,选择适当的编码。