Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

file overwrite in java -- user-mapped section open error [duplicate]

Tags:

java

overwrite

The following function in a java program is written with the intent to read from a file and overwrite back to the same file after.

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();
        }
    }
} 

The error message on trying to run the program is:

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)

Request help in resolving the error.


Code for readFile

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();
    }
} 

Read in another thread that this is a windows issue and so MappedByteBuffer in the readFile method was the cause of the problem. Re-wrote the readFile method as below. It works!

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;
} 
like image 597
leba-lev Avatar asked Nov 13 '22 23:11

leba-lev


1 Answers

You need to close your file streams after opening them, or they will still be around on your system. This can lead to corruption, and errors like this. Review the Java Learning Tutorials on File I/O. This tutorial also shows the way.

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();
  }

Notice the finally block. This ensures that the stream gets closed whether an Exception happens or not. You should use one to close your open streams.

like image 120
Visionary Software Solutions Avatar answered Nov 15 '22 11:11

Visionary Software Solutions