大家好,我以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
1条答案
按热度按时间roqulrg31#
该代码只包含一个严重的错误,
continue
会导致替换Userprofile.getUserline()
之后的所有行。而字符串对象是不可变的。因此,您需要执行
s = s.trim()
,因为trim()
传递的新字符串值不会改变原始字符串。此外,我还使用了带有实用函数的
Files
。错误:这里有两个文件:帐户文件和临时文件。任何一个都不可能关闭-继续使用-并导致上述错误。