Java在读取文件后从文本中删除一行

时间:2014-05-04 22:01:24

标签: java file

我有这个文件

1007    book1           5      3
1004    book2           4      1
1003    book3           3      0
1002    book4           2      1

我试图从文件中删除图书编号1004,但在此之前我让用户输入他要删除的图书编号。 首先检查文件是否存在于文件中,如果书籍存在,如果没有显示“书籍不存在”,我将其删除。

Scanner kb = new Scanner(System.in);
        FileInputStream book = new FileInputStream("input.txt");
Scanner infile = new Scanner(book);
FileOutputStream out = new FileOutputStream("output.txt");
PrintWriter pw = new PrintWriter(out);
boolean found = false;
System.out.print("Enter the bookID : ");
int bID = kb.nextInt();
while(infile.hasNext()){
    int id = infile.nextInt();
    String title = infile.next();
    int quantity = infile.nextInt();
    int bQuantity = infile.nextInt();
    if(bID == id){
        found = true;
    }
    if(found == true){
            pw.printf("%8d\t%-30s\t%8d\t%8d", infile.nextInt(), infile.next(), infile.nextInt(), infile.nextInt());
            infile.nextLine();
            System.out.println("The book has been deleted");
            break;
        }
}
if(found == false)
    System.out.print("Not found");
pw.close();
infile.close();

我正在尝试用我删除的书打印所有文件。

3 个答案:

答案 0 :(得分:0)

你需要一本书类,如下:

public class Book {
    private int series;
    private String name;
    private int intA;
    private int intB;

    public Book(int series,String name, int intA, int intB) {
        this.series = series;
        this.name = name;
        this.intA = intA;
        this.intB = intB;
    }
    ....
    .... (add other methods as needed, you will definitely need a 
           toString() method, and getIntA(), getIntB(), getSeriesNum(),
           getName() etc.)
}

使用扫描仪读取文件时,请将它们读入Book类型的arraylist。当用户输入数字时,使用for循环查找与该数字匹配的Book,并从arraylist中删除该book对象。

此外,尝试将数据保留在内存中,而不是经常写入文件。与更改内存中的数据相比,将文件写入磁盘效率非常低。用户完成所有操作后,您可以使用打印机将数据写入文件。

要将文件读入此对象数组,您可以执行以下操作:

public static ArrayList<Book> readbooklist() {

    ArrayList<Book> booklist = new ArrayList<Book>();
    File file = new File("path/filename.fileextension");

    try {
        Scanner scnr = new Scanner(file);

        while (scnr.hasNextLine()) {
            String entry = scnr.nextLine();
            String [] parts = entry.split("\t"); // Depends on how data was delimited
            int series = Integer.parseInt(parts[0]);
            int intA = Integer.parseInt(parts[2]);
            int intB = Integer.parseInt(parts[3]);
            Book single = new Book(series, parts[1], intA, intB);
            booklist.add(single);
        }

        scnr.close();

    } catch (FileNotFoundException e) {
        System.out.println("File Not Found!");
    }

    return booklist;
}

请记住在课程开头导入适当的依赖项。希望它有所帮助!

答案 1 :(得分:0)

我建议使用Map将每行存储为值,将Id作为键存储一次。这样,您不必每次要删除或添加条目时重新打开文件并阅读它,您只需将其删除并将其添加到地图中即可。完成后,您可以通过存储在地图中的值覆盖您拥有的旧文件,或者只创建一个新的临时文件来保存数据,删除旧文件,然后使用旧文件名重命名临时文件

答案 2 :(得分:0)

将要保存的所有行存储在字符串中并关闭扫描仪。创建一个printwriter,将字符串打印到文件并关闭它。

示例代码:

File file = new File("yourTextFile.txt");
Scanner in = new Scanner(file);
String saveThisToFile = "";
while (in.hasNext()) {
    String temp = in.nextLine();
    if (condition to be true if you whant to keep this line) {
        saveThisToFile += temp + "\n";
    }
}
in.close();

PrintWriter printWriter = new PrintWriter(file);
printWriter.print(saveThisToFile);
printWriter.close();