【问题标题】:Writing in the beginning of a text file Java写在一个文本文件Java的开头
【发布时间】:2011-09-01 22:16:53
【问题描述】:

我需要在文本文件的开头写一些东西。我有一个包含内容的文本文件,我想在此内容之前写一些东西。说我有;

下午好,先生,你今天好吗?
我很好,你好吗?
谢谢提问,我很好

修改后,我希望它是这样的:

第 1 页-场景 59
25.05.2011

下午好,先生,你今天好吗?
我很好,你好吗?
谢谢提问,我很好

只是编了内容:) 我怎样才能像这样修改文本文件?

【问题讨论】:

  • @Turuko 您必须识别的第一件事是分隔符。如果没有分隔符(无论是显式的还是隐式的),您将无法实现目标。通过问自己这个问题更容易理解这一点,“我怎么知道何时在对话框上方插入页面和场景标题?”如果你无法确定你在文本文件中的位置,那么你就无法做到。
  • @Matthew:我看不出这里有什么问题——它在文本文件的开头写了一段固定的文本。没有必要承认任何事情,至少就所提出的问题而言。
  • @Jon 也许我误解了这个问题。我理解这个问题要问,“我有这个文本文件,我该如何修改它以在整个文件的某些部分之间添加这个元数据”。
  • @Jon 和@Turuko 如果您只是想在文件开头插入此标题信息,那么您可以忽略我的评论。 =P

标签: java file text


【解决方案1】:

你不能真正修改那样 - 文件系统通常不允许你在任意位置插入数据 - 但你可以:

  • 创建一个新文件
  • 给它写前缀
  • 将旧文件中的数据复制到新文件中
  • 将旧文件移至备份位置
  • 将新文件移动到旧文件的位置
  • 可选择删除旧的备份文件

【讨论】:

  • 这看起来对我的问题是可行的。感谢您的回答。非常感谢。我马上进入。
  • 这个过程是不是非常浪费资源?我正在寻找一种具有成本效益的实施方式。
  • @Poutrathor:您所说的“成本效益”到底是什么意思? (如果效率低下有真正的成本,这与“高效”相同。)基本上,如果您希望能够执行随机插入/删除,您可能不想将其存储为纯文本文件......
  • @JonSkeet 英语不是我的强项,抱歉。我在硬件限制设备上工作(该设备不是那么强大)。因此,我应该尝试实施减少 CPU 和 RAM 负载工作的解决方案。文件操作可能很繁重,特别是如果我必须复制。上下文:我想以反时限显示我的日志:首先是最后一个日志。我只看到两种方法:在文件顶部写入最后一个日志,从下到上读取文件。我不知道哪个最好。由于这是一个悬而未决的问题,我也不知道在哪里问,所以我正在浏览 SO 答案以便自己找到:)
  • @Poutrathor:好吧,在这种情况下,我肯定会实现向后读取文件......可能会将文件分成块(例如每小时一个新的日志文件)以使其更简单。
【解决方案2】:

我认为你想要的是随机访问。查看related java tutorial。但是,我不相信您可以在文件中的任意位置插入数据;如果我没记错的话,你只会覆盖数据。如果你想插入,你必须有你的代码

  1. 复制一个块,
  2. 用你的新东西覆盖,
  3. 复制下一个块,
  4. 用之前复制的块覆盖,
  5. 返回 3 直到没有更多块

【讨论】:

  • 随机访问通常允许您在任意点覆盖数据 - 而不是在文件中插入数据。
  • 乔恩,是的,当你发表评论时,我正在编辑我的回复:)
【解决方案3】:

正如@atk 建议的那样,java.nio.channels.SeekableByteChannel 是一个很好的界面。但它仅适用于 1.7。

更新:如果您使用 FileUtils 没有问题,请使用

String fileString = FileUtils.readFileToString(file);

【讨论】:

    【解决方案4】:

    这不是问题的直接答案,但通常通过 InputStreams 访问文件。如果这是您的用例,那么您可以通过SequenceInputStream 链接输入流以实现相同的结果。例如

    InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my line\n".getBytes()), new FileInputStream(new File("myfile.txt")));
    

    【讨论】:

      【解决方案5】:

      以防万一它对这里的某人有用的是使用Apache Commons IO库将行添加到文件的方法的完整源代码。该代码不会将整个文件读入内存,因此可以处理任何大小的文件。

      public static void prependPrefix(File input, String prefix) throws IOException {
          LineIterator li = FileUtils.lineIterator(input);
          File tempFile = File.createTempFile("prependPrefix", ".tmp");
          BufferedWriter w = new BufferedWriter(new FileWriter(tempFile));
          try {
              w.write(prefix);
              while (li.hasNext()) {
                  w.write(li.next());
                  w.write("\n");
              }
          } finally {
              IOUtils.closeQuietly(w);
              LineIterator.closeQuietly(li);
          }
          FileUtils.deleteQuietly(input);
          FileUtils.moveFile(tempFile, input);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多