我想基于一些正则表达式替换文件中的一些项目。为了做到这一点:
完成所有这些后,我尝试删除该文件(为了使用替换的行再次重新创建它)。
由于某些原因,这不起作用:即使在关闭了BufferedReader之后,似乎Java仍然保留了该文件的句柄。
有没有人为这个(新手)问题找到解决方案?
代码摘录:
%// Get cumulative sums row-wise and column-wise
csums = cumsum(cumsum(W,1),2)
%/ Get IDs of shifts and thus get cumsums at those positions
[~,idx] = unique(ci) %// OR find(diff([ci numel(ci)]))
csums_indexed = csums(idx,idx)
%// Get the blockwise summations by differentiations on csums at shifts
col1 = diff(csums_indexed(:,1),[],1)
row1 = diff(csums_indexed(1,:),[],2)
rest2D = diff(diff(csums_indexed,[],2),[],1)
out = [[csums_indexed(1,1) ; col1] [row1 ; rest2D]]
输出日志:
Pattern oDatePattern = Pattern.compile("at \\d{2}:\\d{2}:\\d{2} "); // meaning: "at xx:xx:xx"
Pattern oTimePattern = Pattern.compile("Kernel time [0-9]*\\.?[0-9]+ User time: [0-9]*\\.?[0-9]+"); // "[0-9]*\.?[0-9]+" stands for any floating point number
Pattern oMemoryPattern = Pattern.compile("\\([0-9,A-F]*\\)"); // "[0-9,A-F]*" stands for any hexadecimal number
Matcher oDateMatcher;
Matcher oTimeMatcher;
Matcher oMemoryMatcher;
List<String> sLog_Content = new ArrayList<String>();
BufferedReader br = new BufferedReader(new FileReader(sLp_LogFile));
try {
String sLine = br.readLine();
while (sLine != null) {
System.out.println("ORIG : " + sLine);
oDateMatcher = oDatePattern.matcher(sLine);
sLine = oDateMatcher.replaceAll("at <timestamp> ");
oTimeMatcher = oTimePattern.matcher(sLine);
sLine = oTimeMatcher.replaceAll("Kernel time <Kernel_Time_usage> User time: <User_Time_usage>");
oMemoryMatcher = oMemoryPattern.matcher(sLine);
sLine = oMemoryMatcher.replaceAll("<Memory_Address>");
System.out.println("REPL : " + sLine);
sLog_Content.add(sLine);
sLine = br.readLine();
}
} finally {
br.close();
}
System.out.println("All lines are read and regex replaced, try to delete the file");
File tst_File = new File(sLp_LogFile);
if (tst_File.exists()) {
System.out.println(sLp_LogFile + " exists");
} else {
System.out.println(sLp_LogFile + " does not exist");
}
if (tst_File.delete()) {
System.out.println(sLp_LogFile + " is deleted");
} else {
System.out.println(sLp_LogFile + " is not deleted");
}
答案 0 :(得分:2)
一种可能的解释是您的应用程序在其他位置打开了文件。
或者它可能是另一个打开文件的应用程序。
或许应用程序/用户有权读取文件但不能删除它。
我同意使用Files.delete
..
答案 1 :(得分:2)
我发现您的代码中没有任何问题。
似乎关闭BEGIN
UPDATE bets
JOIN users_steam on bets.steamid = users_steam.steamid
SET bets.complete = 1,bets.won=20000
WHERE bets.round = 1337 AND bets.complete = 0;
UPDATE users_steam
JOIN bets on bets.steamid = users_steam.steamid
SET users_steam.coins = users_steam.coins + 20000
WHERE bets.round = 1337 AND bets.complete = 0;
END
确保文件已关闭。 (参见this response)。
也许您可以试试Files.delete
cf this response
它会通过抛出不同的异常来提供有关删除失败的更多信息。
答案 2 :(得分:0)
我是初学者,我不像你那样了解很多东西。但如果我知道你应该首先保存你的更改临时文件。之后,您将再次读取临时文件,稍后您将写入您的真实文件。我希望我的评论会对你有所帮助。
答案 3 :(得分:0)
下午好,
我想感谢大家寻找这个问题的解决方案。不幸的是,这个问题不是基于Java的:我试图写入的文件是由重定向cmd /c <program>.exe >> <output>.log
创建的,而且似乎Windows没有将输出缓冲区完全刷新到输出文件,从而产生了问题
我目前正在使用以下(非常脏)解决此问题:
boolean bFile_can_be_opened = false;
while (!bFile_can_be_opened) {
try {
fwLog2 = new FileWriter(sLp_LogFile, true);
bFile_can_be_opened = true;
}
catch (Exception e)
{}
}
有关此问题的更多信息,请参阅以下新的StackOverflow问题:How to release a file, locked by the application, in Java