1

我需要能够根据行中的特定文本(不是整行)删除一行。

到目前为止,这就是我所拥有的,但它正在删除整个文件!我可能错过了一个半冒号或一些愚蠢的东西..有人可以帮忙吗?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;


public class DeleteStudent 
{

    public static void removeStudentData()
    {
        File inputFile = new File("StudentsII.txt");
        File tempFile = new File("myTempFile.txt");
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(inputFile));
        } catch (FileNotFoundException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter(tempFile));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        CharSequence sID = null;
        String lineToRemove = (String) sID;
        String currentLine;

        Scanner UI = new Scanner(System.in);
        boolean found = false;

        System.out.println("\n***DELETE STUDENT RECORD***\n");
        System.out.println("Enter a student ID: ");
        sID=UI.next();
        try {
            while((currentLine = reader.readLine()) != null)
            {
                String trimmedLine = currentLine.trim();
                if(trimmedLine.contains(sID))
                    continue;
                try {
                    writer.write(currentLine);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        boolean successful = tempFile.renameTo(inputFile);
        Menu.displayMenu();
    }
}

txt 文件包含以下信息...

Martha Stewart 123 Freshman
Cindi Lauper 234 Senior
Tina Turner 345 Freshman
4

3 回答 3

2

完成编写后,您需要关闭流和文件:

writer.close();
tempFile.close();
//etc.
于 2012-05-08T00:48:27.483 回答
1

使用调试器(或只是 println)来查看您的代码的哪些位正在被执行。例如 printsIDtrimmedLine- 它们是您所期望的吗?

快速浏览一下,我看不到任何实际错误,但有一些风格的东西(这通常可以帮助使代码更具可读性,以便更容易找到错误)

被调用的变量UI有点令人困惑——看起来像一个类名或其他东西(由于大写字母)——它是 100% 的合法代码,但你不会看到太多程序员使用这种局部变量的命名约定。

if (condition) continue;

有点奇怪 - 我可以看到它有效,但将其写成会更明显

if (!condition) { /* write the line */ }
于 2012-05-08T01:04:46.050 回答
0

简单看一下,我发现下面这段代码很可疑。tempFile.renameTo(inputFile);

原因是临时文件想要重命名为输入文件,但尚未正确关闭。在我看来,这应该会导致文件 IO 错误。

也许明天,我将使用 Eclipse 调试器来确定这个问题。但你也应该这样做。如果您用您对最佳答案的投票来奖励我,那将激励我这样做:)

问题如您所说,哪个文件被删除了?我猜是临时文件吗?

祝你好运,

于 2012-05-08T06:43:51.237 回答