如何用Java读/写文件

时间:2016-04-18 14:31:51

标签: java io file-handling

我想基于一些正则表达式替换文件中的一些项目。为了做到这一点:

  • 我每行读取文件行
  • 对于每一行,我检查正则表达式并执行替换
  • 每一行都以字符串数组写

完成所有这些后,我尝试删除该文件(为了使用替换的行再次重新创建它)。

由于某些原因,这不起作用:即使在关闭了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");
      }

4 个答案:

答案 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