gpt4 book ai didi

Java输入流/输出流写入同名文件

转载 作者:行者123 更新时间:2023-12-02 11:53:00 25 4
gpt4 key购买 nike

我有一些代码可以遍历文件树并将根添加到没 Root过的 xml 文件中。我的问题是当我尝试从输入流写入输出流时。我想用更新的版本(添加了根的版本)替换当前的 xml 文件。我认为如果我将输出流设置为与输入流相同的文件,就会出现问题。直觉上这似乎是一个问题。如果没有,请告诉我。

我该如何解决这个问题?我怎样才能本质上“更新”xml 文件,实际上覆盖另一个文件?我已经看过这里的其他答案,但还没有走得太远。

private static void addRootHelper(File root){
FileInputStream fis;
List<InputStream> streams;
InputStream is;
OutputStream os;

File[] directoryListing = root.listFiles();
if (directoryListing != null) {
for (File child : directoryListing) {
addRootHelper(child);
}
}
else {
try{
// Add root to input stream and create output stream
fis = new FileInputStream(root);
streams = Arrays.asList(new ByteArrayInputStream("<root>".getBytes()),fis, new ByteArrayInputStream("</root>".getBytes()));
is = new SequenceInputStream(Collections.enumeration(streams));
os = new FileOutputStream(root.getAbsolutePath());

// Write from is -> os
byte[] buffer = new byte[1024];
int bytesRead;

// Read from is to buffer
while((bytesRead = is.read(buffer)) !=-1){
os.write(buffer, 0, bytesRead);
}
is.close();
os.flush();
os.close();
System.out.println("Added root to " + root.getName());

}
catch(IOException ex){
ex.printStackTrace();
}
}
}

最佳答案

如果您不想使用流行的临时文件方法,那么您始终可以读取整个文件,然后再写回它。

这是一个简单的实现。

public static void addRootTag(File xml) throws IOException {
final List<String> lines = new ArrayList<>();;
try (Scanner in = new Scanner(xml)) {
while (in.hasNextLine())
lines.add(in.nextLine());
}

try (PrintStream out = new PrintStream(xml)) {
out.println("<root>");
for (String line : lines) {
// indentation, if you want
out.print(" ");
out.println(line);
}
out.println("</root>");
}
}

关于Java输入流/输出流写入同名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762583/

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