使用java程序编辑文本文件中的特定行

使用java程序编辑文本文件中的特定行,java,java-io,Java,Java Io,好的,假设我有一个名为“people.txt”的文本文件,它包含以下信息: 1 adam 20 M 2 betty 49 F 3 charles 9 M 4 david 22 M 5 ethan 41 M 6 faith 23 F 7 greg 22 M 8 heidi 63 F 基本上,第一个数字是人的ID,然后是人的姓名、年龄和性别。假设我想用不同的值替换第2行,或者ID为2的人。现在,我知道我不能使用RandomAccessFile进行此操作,因为名称的字节数不总是相同的

好的,假设我有一个名为“people.txt”的文本文件,它包含以下信息:

 1 adam 20 M
 2 betty 49 F
 3 charles 9 M
 4 david 22 M
 5 ethan 41 M
 6 faith 23 F
 7 greg 22 M
 8 heidi 63 F

基本上,第一个数字是人的ID,然后是人的姓名、年龄和性别。假设我想用不同的值替换第2行,或者ID为2的人。现在,我知道我不能使用
RandomAccessFile
进行此操作,因为名称的字节数不总是相同的,年龄也不总是相同的。在随机搜索Java论坛时,我发现
StringBuilder
StringBuffer
应该足以满足我的需要,但我不确定如何实现这两个功能。它们可以直接写入文本文件吗?我希望直接从用户输入中执行此操作。

一种解决方案是逐行读取文件,操作所需的行(执行一些解析/标记以获取ID/名称/等),然后将所有行写入文件(覆盖其当前内容)。此解决方案取决于您正在处理的文件的大小:文件太大会消耗大量内存,因为您一次将其所有内容保存在内存中

另一种方法(减少内存需求)是逐行处理文件,但不是将所有行保留在内存中,而是在处理每行后将当前行写入临时文件,然后将临时文件移动到输入文件的位置(覆盖该文件)

FileReader
FileWriter
应该可以帮助您读取/写入文件。您可能希望将它们包装在
BufferedReader
/
BufferedWriter
中以提高性能


另外,在完成文件的读(写)操作时,不要忘记关闭读(写)器,这样就不会因为文件仍处于打开状态而阻止对文件的后续访问

public static void main(String args[]) {
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream("d:/new6.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;
            StringBuilder fileContent = new StringBuilder();
            //Read File Line By Line
            while ((strLine = br.readLine()) != null) {
                // Print the content on the console
                System.out.println(strLine);
                String tokens[] = strLine.split(" ");
                if (tokens.length > 0) {
                    // Here tokens[0] will have value of ID
                    if (tokens[0].equals("2")) {
                        tokens[1] = "betty-updated";
                        tokens[2] = "499";
                        String newLine = tokens[0] + " " + tokens[1] + " " + tokens[2] + " " + tokens[3];
                        fileContent.append(newLine);
                        fileContent.append("\n");
                    } else {
                        // update content as it is
                        fileContent.append(strLine);
                        fileContent.append("\n");
                    }
                }
            }
            // Now fileContent will have updated content , which you can override into file
            FileWriter fstreamWrite = new FileWriter("d:/new6.txt");
            BufferedWriter out = new BufferedWriter(fstreamWrite);
            out.write(fileContent.toString());
            out.close();
            //Close the input stream
            in.close();
        } catch (Exception e) {//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }

欢迎来到堆栈溢出,aravindsai2。本网站旨在帮助您自助。获得答案的最简单方法是尝试自己解决问题,然后发布代码。也就是说,您首先需要从文件中读取文本。尝试学习TextReader和TextWriter。谢谢Attila。。。。。。。。。。。我完成了创建文件。。。比如插入。。。。我不知道如何通过id号删除文本文件中的特定行。。。。。。如果您需要删除该行,请提供帮助,然后不要将其写出来(例如,不要将其存储在您在末尾写出的行列表中)。我已删除该行。。。。。。我应该怎么做来更新一个特定的行….???我在一个网站上读了一些步骤。。。1.打开当前文件进行读取。2.打开一个新文件进行写入。3.将数据从当前文件复制到新文件,直到要修改数据的位置。4.将修改后的数据写入新文件。5.将当前文件的其余部分复制到新文件。6.关闭文件。7.删除当前文件并将新文件重命名为当前文件的名称。我不知道该怎么做these@aravindsai2-看看Rahul的答案。剩下的就是将输出放在原始位置。为此,请在创建
FileWriter
fstreamWrite
)之前将
移入.close()
,并将为写入而打开的文件的名称更改为原始位置的名称(将
“d:/new6.txt”
更改为
“people.txt”)@aleroot已将ID与StartWith进行比较,此逻辑将失败,如果文件中有多个ID,以1开头,例如1、11、111、1111,那么它将更新所有这4行。在打开文件进行写入之前,应将
移入.close()
,否则可能会出现异常,因为文件可能会被锁定