【问题标题】:Write to file at particular index写入特定索引处的文件
【发布时间】:2011-08-12 08:42:59
【问题描述】:

我需要在特定索引位置写入文件。 BufferedWriterPrintWriter 不允许写入索引。我该如何实现这一目标?

基本上我想要做的是,如果一个文件在 EOF 包含一个空行,那么我需要在那个位置写入,否则插入一个新行并写入。将文件的内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件的名称,这不是一种选择。

谢谢

【问题讨论】:

  • 如果您在文本文件中的任意位置写入,它可能位于行的中间,也可能位于多字节字符的中间。你怎么知道它会在一行的开头?顺便说一句:你不能插入到文件中,只重写从你到的点的所有内容。
  • @Peter:我们在这里说的是 EOF,而不是随机位置。如果您要去 EOF,您将不会处于多字节字符的中间。您可以检查前一个字节是 CR 还是 LF 字符,以了解您是否在新行的开头。
  • @Vivien,这不是我从“我需要写入特定索引位置的文件”所理解的。如果所有 OP 想要做的就是附加到文件,这可以做到没有“插入”
  • @Peter:问题的第二部分更详细地解释了问题。根据我从解释中的理解,它是关于附加到文件的。
  • OP 可以澄清他/她正在尝试做什么,这将很有用。

标签: java file writer


【解决方案1】:

您需要使用RandomAccessFile

使用该类,您可以使用seek(long) 方法转到特定位置,并使用不同的write 方法进行编写。

对于您的特殊问题,最好的解决方案似乎是 使用RandomAccessFile 并导航到文件末尾。检查这是否是新行,写入,关闭。

【讨论】:

  • 如果文件包含大量数据,我会遇到OutOfMemory 问题吗?
  • 没有。 RandomAccessFile 不会将整个文件加载到内存中。所有操作都直接在磁盘上完成。
【解决方案2】:

Given 是在特定位置写入内容的方法。

假设我的文件是 Test.txt,内容如下

Hello 
How are you
Today is Monday

现在你想在你好之后写“hi”。所以“hi”的偏移量将是“5”。

方法是:

filename = "test.txt";
offset = 5;
byte[] content = ("\t hi").getBytes();

private void insert(String filename, long offset, byte[] content) throws IOException {

    RandomAccessFile r = new RandomAccessFile(filename, "rw");
    RandomAccessFile rtemp = new RandomAccessFile(filename+"Temp", "rw");
    long fileSize = r.length(); 
    FileChannel sourceChannel = r.getChannel();
    FileChannel targetChannel = rtemp.getChannel();
    sourceChannel.transferTo(offset, (fileSize - offset), targetChannel);
    sourceChannel.truncate(offset);
    r.seek(offset);
    r.write(content);
    long newOffset = r.getFilePointer();
    targetChannel.position(0L);
    sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset));
    sourceChannel.close();
    targetChannel.close();
    rtemp.close();
    r.close();

}

输出将是:

Hello hi
How are you
Today is Monday

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2016-04-27
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多