该进程无法访问该文件,因为该文件正被另一个进程使用(缓冲区读取并尝试使用资源无效)

qyzbxkaa  于 2022-10-07  发布在  其他
关注(0)|答案(1)|浏览(255)

大家好,我以https://stackoverflow.com/a/1377322为例,尝试实现CSV编辑方法。除了我尝试创建文件之外,一切都可以正常工作。复制/移动/删除它时,我收到了这样的错误:“该进程无法访问该文件,因为它正被另一个进程使用”。我也使用(尝试使用资源)和线程实现它仍然不起作用。这个错误只是基于缓冲区读取器文件,所以我可以问一下问题出在哪里吗?

protected static void edit_csv_data(String columname, String new_data) throws IOException {
        try (FileReader fr = new FileReader(accountfile); BufferedReader reader = new BufferedReader(fr)) {

            File tempFile = new File(tempfile);
            BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
            String currentLine;
            int index = 10;
            int line = 0;
            while ((currentLine = reader.readLine()) != null) {
                if (line == Userprofile.getUserline()) {
                    currentLine.trim();
                    String[] data = currentLine.split(",");
                    for (int x = 0; x < data.length; x++) {
                        if (index == x) {
                            writer.write(new_data);
                        } else writer.write(data[x]);
                        if (x < data.length - 1) writer.write(",");
                    }
                    writer.write(System.getProperty("line.separator"));
                    continue;
                }else {
                    writer.write(currentLine + System.getProperty("line.separator"));
                }
                line += 1;
            }
            writer.flush();
            writer.close();
            reader.close();
            System.err.println("write fin");
            return;
        }

我也尝试了在Windows11中的资源监视器。进程java.exe和我也不能删除文件,当Java正在运行时,甚至在抛出错误之后,我可以在关闭Java后编辑帐户文件,或者让程序打开足够长的时间,即使Java正在运行,我也可以删除文件,所以我相信BufferReader被卡住了,没有正确关闭。

CSV文件‘’

Username,Password,Account_Type,Name,Surname,ID,Email,Picture_name,Ban_status,Attemp_Login_during_Baned,Last_Login
admin,1234,admin,Chicken,Little,62001,ASD.l@hotmail.com,picture.jpg,false,0,132

“”“

protected static void update_user_data(String columname, String new_data) throws IOException {
        DataEdit.edit_csv_data(columname,new_data);
        System.err.println(Files.isWritable(Path.of(accountfile)));
        Files.copy(Path.of(tempfile), Path.of(accountfile_back),StandardCopyOption.REPLACE_EXISTING);
        Files.copy(Path.of(accountfile), Path.of(accountfile_back), StandardCopyOption.REPLACE_EXISTING);
        Files.copy(Path.of(tempfile), Path.of(accountfile),StandardCopyOption.REPLACE_EXISTING);
        return;
    }

误差率

java.nio.file.FileSystemException: srcmainjavaallaccountdataAccount.csv: The process cannot access the file because it is being used by another process

仅供参考,我使用IntelliJ IDE,Maven for Build,Java 17

roqulrg3

roqulrg31#

该代码只包含一个严重的错误,continue会导致替换Userprofile.getUserline()之后的所有行。

而字符串对象是不可变的。因此,您需要执行s = s.trim(),因为trim()传递的新字符串值不会改变原始字符串。

此外,我还使用了带有实用函数的Files

protected static void editCsvData(String columname, String newData) throws IOException {
    Path accountPath = accountfile.toPath();
    // When File. Or when String: Paths.get(accountfile).
    Path tempPath = tempFile.toPath();
    try (BufferedReader reader = Files.newBufferedReader(accountPath,
                                     Charset.defaultCharset());
            BuffedWriter writer = Files.newBufferedWriter(tempPath,
                                      Charset.defaultCharset())) {

        String currentLine;
        int index = 10;
        int line = 0;
        while ((currentLine = reader.readLine()) != null) {
            if (line == Userprofile.getUserline()) {
                currentine = currentLine.trim();
                String[] data = currentLine.split(",");
                for (int x = 0; x < data.length; x++) {
                    if (x > 0) {
                        writer.write(",");
                    }
                    writer.write(index == x ? newData : data[x]);
                }
            } else {
                writer.write(currentLine);
            }
            writer.write(System.getProperty("line.separator"));
            ++line;
        }
        System.err.println("write fin");
    }
}

错误:这里有两个文件:帐户文件和临时文件。任何一个都不可能关闭-继续使用-并导致上述错误。

相关问题