Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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_Writer - Fatal编程技术网

Java 在特定索引处写入文件

Java 在特定索引处写入文件,java,file,writer,Java,File,Writer,我需要在特定的索引位置写入文件。BufferedWriter和PrintWriter不允许写入索引。我该如何实现这一目标 基本上我想做的是,如果一个文件在EOF处包含一个空行,那么我需要在该位置写入,否则插入一个新行并写入。将文件内容复制到临时文件,然后删除原始文件,然后再次将临时文件重命名为原始文件名,这不是一个选项 谢谢您需要使用 使用此类,您可以使用seeklong方法转到特定位置,并使用不同的写入方法进行写入 就你的特殊问题而言,最好的解决办法是 使用RandomAccessFile并导

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

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

谢谢

您需要使用

使用此类,您可以使用seeklong方法转到特定位置,并使用不同的写入方法进行写入

就你的特殊问题而言,最好的解决办法是
使用RandomAccessFile并导航到文件末尾。检查这是否是新行,写入,关闭。

给出了在特定位置写入内容的方法

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

Hello 
How are you
Today is Monday
现在你想在打招呼后写你好。因此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

如果在文本文件中随机写入位置,那么它可能位于一行中,并且可能位于多字节字符的中间。你怎么知道它会在一行的开头?顺便说一句:你不能插入到一个文件中,只能从你到达的点重新写入所有内容。@Peter:我们这里说的是EOF,不是随机位置。如果您要访问EOF,您将不会处于多字节字符的中间。您可以检查前一个字节是否是CR或LF字符,以了解您是否在新行的开头。@Vivien,这不是我所理解的,因为我需要在特定索引位置写入文件。如果OP只想将其附加到文件中,则无需insert@Peter:问题的第二部分更详细地解释了问题。根据我从解释中了解到的情况,这是关于附加到文件的。如果OP可以澄清他/她正在尝试做什么,这将是非常有用的。如果文件包含非常大量的数据,我是否会有OutOfMemory问题?否。RandomAccessFile不会将整个文件加载到内存中。所有操作都直接在磁盘上完成。