Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java文本文件的开头写入_Java_File_Text - Fatal编程技术网

在Java文本文件的开头写入

在Java文本文件的开头写入,java,file,text,Java,File,Text,我需要在文本文件的开头写点东西。我有一个包含内容的文本文件,我想在这个内容之前写一些东西。说我有 下午好,先生,今天好吗? 我很好,你好吗? 谢谢你的邀请,我很好 修改后,我希望它是这样的: 第1页-场景59 2011年5月25日 下午好,先生,今天好吗? 我很好,你好吗? 谢谢你的邀请,我很好 刚编好内容:)我怎样才能这样修改文本文件?你不能这样修改它-文件系统通常不允许你在任意位置插入数据-但是你可以: 创建一个新文件 写上前缀 将数据从旧文件复制到新文件 将旧文件移动到备份位置 将新文件

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

下午好,先生,今天好吗?
我很好,你好吗?
谢谢你的邀请,我很好

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

第1页-场景59
2011年5月25日

下午好,先生,今天好吗?
我很好,你好吗?
谢谢你的邀请,我很好

刚编好内容:)我怎样才能这样修改文本文件?

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

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

    • 我想你想要的是随机访问。看看这本书。但是,我不相信您可以在文件中的任意点插入数据;如果我没记错的话,你只会覆盖数据。如果你想插入,你必须有你的代码

    • 复制一个块
    • 用你的新东西覆盖
    • 复制下一个块
    • 用以前复制的块覆盖
    • 返回到3,直到没有更多的块

    • 正如@atk所建议的,
      java.nio.channels.seekablebytechnel
      是一个很好的接口。但它仅从1.7版开始提供

      更新:如果使用FileUtils没有问题,那么使用

      String fileString = FileUtils.readFileToString(file);
      

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

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

      为了以防万一,这里有一个方法的完整源代码,可以使用库将行预先添加到文件中。该代码不会将整个文件读入内存,因此可以处理任何大小的文件

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

      @Turuko您首先必须标识的是分隔符。如果没有分隔符(无论是显式的还是隐式的),就无法实现目标。通过问自己这样一个问题,“我如何知道何时在对话框上方插入页面和场景标题?”更容易理解这一点。如果您无法确定您在文本文件中的位置,那么您就不能这样做。@Matthew:我看不出这一问题-它是在文本文件的最开始处写入一个固定的文本位。没有必要承认任何事情,至少就问题的提出而言。@Jon也许我误解了这个问题。我理解这个问题的意思是,“我有这个文本文件,我如何修改它以在整个文件的某些部分之间添加元数据”@Jon和@Turuko如果您只想在文件开头插入一次标题信息,那么您可以忽略我的评论=PSee:这看起来对我的问题是可行的。谢谢你的回答。非常感谢。我马上就开始。这是一个巨大的资源浪费过程吗?我正在寻找一种经济高效的实施方式。@Poutrathor:你说的“经济高效”到底是什么意思?(如果效率低下会带来实际成本,那么这与“高效”是一样的。)基本上,如果你想能够执行随机插入/删除,你可能不想将其存储为纯文本文件…@JonSkeet English不是我的强项,sry。我在一个硬件设备上工作(这个设备没有那么强大)。因此,我应该尝试实现对CPU和RAM负载要求较少的解决方案。文件操作可能很繁重,尤其是当我必须复制时。上下文:我希望以相反的时间显示日志:首先显示最后一个日志。我只看到两种方法:在文件顶部写入最后一个日志,从下到上读取文件。我不知道哪一个最好。因为这是一个开放的问题,我也不知道在哪里提问,所以我浏览了一下答案,以便自己找到:)@Poutrathor:在这种情况下,我肯定会实现向后读取文件。。。可能将文件分割成块(例如每小时新的日志文件)以使它更简单。随机访问通常允许你在任意点重写数据——而不是在文件中插入数据。乔恩,是的,我在评论的时候正在编辑我的回答: