【问题标题】:file overwrite in java -- user-mapped section open error [duplicate]java中的文件覆盖-用户映射部分打开错误[重复]
【发布时间】:2012-08-31 19:01:26
【问题描述】:

java 程序中的以下函数是为了从文件中读取并在之后覆盖回同一个文件而编写的。

public static void readOverWrite(File dir) throws IOException {
    for (File f : dir.listFiles()) {
        String[] data = readFile(f).split("\n");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(f))) {
            for (int i = 0; i < data.length; i++) {
                writer.write((data[i]+"\n"));
            }
            writer.close();
        }
    }
} 

尝试运行程序的错误信息是:

Exception in thread "main" java.io.FileNotFoundException: ..\..\data\AQtxt\APW19980807.0261.tml (The requested operation cannot be performed on a file with a user-mapped section open)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileWriter.<init>(Unknown Source)
    at General.SplitCreationDate.splitLine(SplitCreationDate.java:37)
    at General.SplitCreationDate.main(SplitCreationDate.java:53)

请求帮助解决错误。


读取文件的代码

protected static String readFile(File fullPath) throws IOException {
    try(FileInputStream stream = new FileInputStream(fullPath)) {
        FileChannel fc = stream.getChannel();
        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        stream.close();
        return Charset.defaultCharset().decode(bb).toString();
    }
} 

在另一个线程中读取这是一个 Windows 问题,因此 readFile 方法中的 MappedByteBuffer 是问题的原因。重写 readFile 方法如下。有效!

protected static String readFile(File fullPath) throws IOException {
    String string = "";
    try (BufferedReader in = new BufferedReader(new FileReader(fullPath))) {
        String str;
        while ((str = in.readLine()) != null) {
            string += str + "\n";
        }
    }
    return string;
} 

【问题讨论】:

  • 您是否拥有正确的文件权限?我在 goolge 上找到了一个有同样问题但移动到另一个目录解决了它的人。
  • 我们能看到 readFile 的代码吗?
  • 文件权限对我来说似乎很好,豪尔赫。

标签: java overwrite


【解决方案1】:

您需要在打开文件流后关闭它们,否则它们仍会在您的系统中。这可能会导致损坏和类似的错误。查看Java Learning Tutorials on File I/OThis tutorial 也指明了方向。

import java.io.*;

public class ReadWriteTextFile {

  /**
  * Fetch the entire contents of a text file, and return it in a String.
  * This style of implementation does not throw Exceptions to the caller.
  *
  * @param aFile is a file which already exists and can be read.
  */
  static public String getContents(File aFile) {
    //...checks on aFile are elided
    StringBuilder contents = new StringBuilder();

    try {
      //use buffering, reading one line at a time
      //FileReader always assumes default encoding is OK!
      BufferedReader input =  new BufferedReader(new FileReader(aFile));
      try {
        String line = null; //not declared within while loop
        /*
        * readLine is a bit quirky :
        * it returns the content of a line MINUS the newline.
        * it returns null only for the END of the stream.
        * it returns an empty String if two newlines appear in a row.
        */
        while (( line = input.readLine()) != null){
          contents.append(line);
          contents.append(System.getProperty("line.separator"));
        }
      }
      finally {
        input.close();
      }
    }
    catch (IOException ex){
      ex.printStackTrace();
    }

    return contents.toString();
  }

注意 finally 块。这样可以确保无论是否发生异常,流都会关闭。您应该使用一个来关闭打开的流。

【讨论】:

  • 已尝试关闭打开的流...问题仍然存在。更改包含在我上面的代码中。
  • 如何调用 readFile()?
【解决方案2】:

当基础文件关闭时,内存映射不会关闭。如果必须,请使用另一种技术将文件读入内存。通常最好一次处理一个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多