【问题标题】:to edit a specific line in a textfile using java program使用 java 程序编辑文本文件中的特定行
【发布时间】:2012-06-21 10:59:11
【问题描述】:

好的,假设我有一个名为“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 论坛时,我发现 StringBuilderStringBuffer 应该足以满足我的需求,但我不确定如何实现。它们可以用来直接写入文本文件吗?我希望这可以直接从用户输入中工作。

【问题讨论】:

  • 欢迎来到 Stack Overflow,aravindsai2。本网站旨在帮助您自助。获得答案的最简单方法是尝试自己解决问题,然后发布您的代码。话虽如此,您首先需要从文件中读取文本。尝试学习 TextReader 和 TextWriter。

标签: java java-io


【解决方案1】:

刚刚为您创建了一个示例

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());
        }
    }

【讨论】:

  • @aleroot 已将 ID 与startsWith 进行比较,如果文件中有多个以1 开头的ID,例如1、11、111、1111,此逻辑将失败,因此它将更新所有这4 行.
  • 你应该在打开文件写入之前移动in.close(),否则你可能会遇到异常,因为文件可以被锁定
【解决方案2】:

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

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

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

另外,在读(写)完文件后不要忘记关闭读取器(也就是写入器),这样后续对文件的访问不会因为文件仍然打开而被阻止

【讨论】:

  • 谢谢Attila............我完成了creatin文件......就像插入......我不知道如何通过ID号从该文本文件中删除特定行......请帮忙
  • 如果您需要删除该行,则不要将其写出来(例如,不要将其存储在最后写出的行列表中)。
  • 我删除了行......我应该如何更新特定行......????
  • 我在一个站点中阅读了一些步骤... 1. 打开当前文件进行阅读。 2. 打开一个新文件进行写入。 3. 将数据从当前文件复制到新文件,直至您要修改数据的位置。 4. 将修改后的数据写入新文件。 5. 将当前文件的其余部分复制到新文件中。 6. 关闭文件。 7、删除当前文件,将新文件重命名为当前文件名。我不知道该怎么做所有这些
  • @aravindsai2 - 查看 Rahul 的回答。剩下的就是在原始位置输出。为此,在创建FileWriter (fstreamWrite) 之前移动in.close(),并将打开的文件名称更改为原始位置的名称(将"d:/new6.txt" 更改为"people.txt"
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多