使用java来修改文件内容

时间:2012-11-06 20:18:38

标签: java file-io inputstream nio

我需要修改就地文件的具体内容 我想要创建一个新文件并重写旧文件。文件也很小,每个最大只有几MB 对于那些想知道的人(虽然我不确定这是否与OP有关),我需要修改属于版本控制的文件并需要修改只读版本。在适当的位置进行修改要简单得多 Java apis可以实现这一点吗? 如果没有,是否有提供此功能的库?

3 个答案:

答案 0 :(得分:4)

Java允许随机访问和写入磁盘上的文件。但是,写入文件的中间只能覆盖字节 - 即用其他字节替换特定字节 - 并且不能数据插入文件的中间。为此,您必须在插入点之后重写所有内容。将该文件视为恰好驻留在磁盘上的字符数组(char[])。随机访问允许您执行等效的

char[] file    = ... // the file on disk
char[] newData = ... // the data to be written
int pos = ...        // the position in the file to write to
for (i=0; i<newData.; i++) 
{ 
    file[pos+i] = newData[i];
}

插入数据放入文件中需要与将数据插入数组相同的过程。插入点之后的所有数据都必须向右移动以容纳插入的数据。如果要替换为较短的字符串(即删除字节),则编辑后的数据必须向左移动。

其次,你说:

  

我需要修改属于版本控制的文件,并且需要修改只读版本

只读就是这个意思。如果文件是只读的,则无论是否使用随机访问,都无法以任何方式对其进行修改。

您还在评论中说:

  

新文件不会受源代码控制。我必须找到一种方法来添加它。我正在努力避免这种情况

如果文件受源代码管理,则您很可能正在处理本地副本。只要更新的文件与原始文件具有相同的名称并且位于同一目录中,如果您创建该文件的新实例,它就没有任何区别。您只需将更新的版本提交给源控制系统。

但是,如果您要更新源控制系统存储库中的文件,则可能会永久性地损坏系统。

答案 1 :(得分:3)

假设您希望能够将文件内容作为文本进行操作,并假设文件适合内存(您认为这是一个有效的假设),那么您可能会在Commons IO FileUtils中找到这些方法。有用:

http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html

例如:

File f = new File("my-file.txt");
List<String> lines = FileUtils.readLines(f, "UTF-8");
List<String> outLines = modify(lines); // Do some line-by-line text processing
FileUtils.writeLines(f, "UTF-8", outLines);

因此,您将文件内容读入内存,在内存中进行修改,然后使用内存中的新内容覆盖原始文件。这符合您的“就地”标准吗?

答案 2 :(得分:0)

Java支持随机文件访问,特别是使用seek()

查看:http://docs.oracle.com/javase/tutorial/essential/io/rafs.html