gpt4 book ai didi

java - java中的字节数组到文件而不覆盖,

转载 作者:行者123 更新时间:2023-12-01 07:49:51 25 4
gpt4 key购买 nike

下面的代码从HTTP请求中获取一个字节数组并将其保存在bytes[]中,最终的数据将保存在message[]中。

我通过将其转换为 String[] 来检查它是否包含 header ,如果包含,我会从 header 中读取一些信息,然后通过将 header 后面的字节保存到 message[] 来切断它。

然后我尝试使用 FileOutputStream 将 message[] 输出到文件,它的效果稍差,但只保存 10KB 的信息,一次 while 循环迭代(似乎被覆盖),如果我设置 FileOutputStream(file, true)来附加信息,它可以工作......一次,然后该文件只是添加到我下次运行它时,这不是我想要的。如何在每次迭代中使用多个字节 block 写入同一文件,但如果再次运行程序,仍然完整地覆盖该文件?

byte bytes[] = new byte[(10*1024)];
while (dis.read(bytes) > 0)
{
//Set all the bytes to the message
byte message[] = bytes;
String string = new String(bytes, "UTF-8");

//Does bytes contain header?
if (string.contains("\r\n\r\n")){
String theByteString[] = string.split("\r\n\r\n");
String theHeader = theByteString[0];
String[] lmTemp = theHeader.split("Last-Modified: ");
String[] lm = lmTemp[1].split("\r\n");
String lastModified = lm[0];
//Cut off the header and save the rest of the data after it
message = theByteString[1].getBytes("UTF-8");

//cache
hm.put(url, lastModified);
}

//Output message[] to file.
File f = new File(hostName + path);
f.getParentFile().mkdirs();
f.createNewFile();
try (FileOutputStream fos = new FileOutputStream(f)) {
fos.write(message);
} catch (IOException ioe) {
ioe.printStackTrace();
}

}
}

最佳答案

您将在循环的每次迭代中打开一个新的FileOutputStream。不要那样做。在循环外部打开它,然后按照您正在做的方式循环并编写,然后在循环结束时关闭。 (如果您使用带有 while 循环的 try-with-resources 语句,那就没问题了。)

但这只是问题的一部分 - 您还在循环的每次迭代中执行其他所有操作,包括检查 header 。如果您读取的字节数组包含 header 集的部分,或者确实包含 header 分隔符的部分,那么这将是一个真正的问题。

此外,正如 EJP 所指出的,除了使用它来判断是否已完成之外,您还忽略了 read 的返回值。您应该始终使用read的返回值来了解字节数组中有多少是实际可用的数据。

从根本上来说,您要么需要将整个响应读取到字节数组中 - 这很容易做到,但内存效率可能较低 - 或者接受您正在处理的事实一个流,并编写更复杂的代码来检测 header 的结尾。

不过,IMO,更好的是使用一个 HTTP 库,它已经理解所有这些 header 处理,这样您就不需要自己做。除非您自己编写低级 HTTP 库,否则您不应该处理低级 HTTP 详细信息,而应该依赖一个好的库。

关于java - java中的字节数组到文件而不覆盖,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40051776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com