使用用户输入从分隔的文本文件中删除特定行。 (JAVA)

时间:2017-02-28 07:34:44

标签: java text io

这是我目前的代码:

import java.util.*;
import java.io.*;

public class Adding_Deleting_Car extends Admin_Menu {

        public void delCar() throws IOException{
        Scanner in = new Scanner(System.in);
        File inputFile = new File("inventory.txt");
        File tempFile = new File("myTemp.txt");

        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

        String currentLine;

        String lineToRemove;
        System.out.println("Enter the VIN of the car you wish to delete/update: ");
        lineToRemove = in.next();

        while((currentLine = reader.readLine()) != null) {
            String trimmedLine = currentLine.trim();
            if(trimmedLine.equals(lineToRemove)) continue;
            System.out.println(trimmedLine);
            writer.write((currentLine) + System.getProperty("line.separator"));
        }
        writer.close();
        reader.close();
        boolean successful = tempFile.renameTo(inputFile);
        System.out.println(successful);
    }
}

我想根据用户输入从文件中删除某一行文本。例如,这是我的文本文件:

AB234KXAZ;Honda;Accord;1999;10000;3000;G

AB234KL34;Honda;Civic;2009;15000;4000;R

CD555SA72;Toyota;Camry;2010;11000;7000;S

FF2HHKL94;BMW;535i;2011;12000;9000;W

XX55JKA31;Ford;F150;2015;50000;5000;B

我希望用户输入他们选择的字符串,这将是列中的第一个字段(例如XX55JKA31),然后从文件中删除该行文本。我在网上找到了一些代码,但我一直无法成功使用它。

我当前的代码似乎只是重写临时文本文件中的所有内容,但不会删除它。

2 个答案:

答案 0 :(得分:1)

您正在使用File.renameTo,此处记录了: https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-

根据文档,如果文件已经存在,它可能会失败,你应该使用Files.move。

以下是与Files.move相同的代码:

boolean successful;
try {
    Files.move(tempFile.toPath(), inputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    successful = true;
} catch(IOException e) {
    successful = false;
}

注意: 您搜索VIN的代码也是错误的。请参阅Jure Kolenko关于该问题的一种可能解决方案的答案。

继续前进,您应该考虑使用实际数据库来存储和操作此类信息。

答案 1 :(得分:0)

您的错误在于

if(trimmedLine.equals(lineToRemove)) continue;

它将整行与您要删除的VIN进行比较,而不仅仅是第一部分。将其改为

if(trimmedLine.startsWith(lineToRemove)) continue;

它有效。如果您想要与其他列进行比较,请改用String::contains。也像Patrick Parker所说,使用Files.move而不是File :: renameTo修复了重命名问题。

完整的固定代码:

import java.util.*;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;



public class Adding_Deleting_Car{

        public static void main(String... args) throws IOException{
        Scanner in = new Scanner(System.in);
        File inputFile = new File("inventory.txt");
        File tempFile = new File("myTemp.txt");

        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

        String currentLine;

        String lineToRemove;
        System.out.println("Enter the VIN of the car you wish to delete/update: ");
        lineToRemove = in.next();

        while((currentLine = reader.readLine()) != null) {
            String trimmedLine = currentLine.trim();
            if(trimmedLine.startsWith(lineToRemove)) continue;
            System.out.println(trimmedLine);
            writer.write((currentLine) + System.getProperty("line.separator"));
        }
        writer.close();
        reader.close();
        Files.move(tempFile.toPath(), inputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }
}

请注意,我将类定义更改为不继承,将方法定义更改为main(String ... args),因此我可以在我的系统上进行编译。