我正在从事图书馆计划。
删除方法工作正常。
第一次我将文字存储在Arraylist上并在从Arralist中删除Desire Book之后。
再次使用方法writer.write();
text之前还要删除那里和新文本。看起来像:
删除前:
第一册
第二册
删除Book2后:
第一册
第二册
第一册
public static void main(String[] args) throws IOException{
Admin admin=new Admin();
Charset charset=Charset.forName("US-ASCII");
Path Source=admin.createTextFile();
admin.removeBook(Source,charset);
}
private void removeBook(Path source, Charset charset) {
Scanner input=new Scanner(System.in);
System.out.println("Enter Book Name For Remove");
String bookName=input.nextLine();
try(
BufferedReader reader=Files.newBufferedReader(source,charset);
BufferedWriter writer=Files.newBufferedWriter(source, charset,StandardOpenOption.APPEND);
)
{
ArrayList<String> lines=new ArrayList<>();
String s;
while((s=reader.readLine())!=null){
lines.add(s);
}
for(int i=0;i<lines.size();i++){
if( lines.get(i).contains(bookName)){
lines.remove(i);
}
}
//Write after removing
for(int i=0;i<lines.size();i++){
writer.write(lines.get(i));
writer.newLine();
}
writer.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
答案 0 :(得分:1)
@RealSkeptic已经提到了它,但是从一开始就存在错误。
除非您确定自己在做什么,否则不要打开同一时间阅读和写作的相同文件。而这个“除非”是罕见的,更不用说在这种情况下你可能会使用FileChannel
代替。
创建一个临时文件,其中包含修改内容,将修改后的内容写入其中,然后重命名为原始文件。
例如:
final Path src = ...;
final Path dst = ...;
try (
final BufferedReader reader = Files.newBufferedReader(src, StandardCharsets.UTF_8);
final BufferedWriter writer = Files.newBufferedWriter(dst, StandardCharsets.UTF_8);
) {
String line;
while ((line = reader.readLine()) != null)
if (!line.equals(bookToRemove)) {
writer.write(line);
writer.newLine();
}
}
Files.move(dst, src, StandardCopyOption.REPLACE_EXISTING);