从文件Java中读取字节

时间:2014-10-07 20:50:54

标签: java file

我试图解析我的文件,该文件以二进制形式保存所有数据。如何从偏移量为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();
    }   

可能会有不同的方式来执行此操作吗?

1 个答案:

答案 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)或类似的东西 - 当然,选择适当的编码。