【发布时间】:2014-06-16 12:08:48
【问题描述】:
我目前将读取的文件存储在List<String> 中,将我的String 添加到列表的倒数第二位,最后将我的列表写入原始文件。
它工作正常,因为我的文件只有 20 行左右,但我觉得如果文件更大,这将是一个非常长的过程。
因此我的问题是:是否有类似Append 的方法来简单地选择要附加行的位置?
【问题讨论】:
我目前将读取的文件存储在List<String> 中,将我的String 添加到列表的倒数第二位,最后将我的列表写入原始文件。
它工作正常,因为我的文件只有 20 行左右,但我觉得如果文件更大,这将是一个非常长的过程。
因此我的问题是:是否有类似Append 的方法来简单地选择要附加行的位置?
【问题讨论】:
只需使用附加模式打开一个java.io.FileOutputStream,然后编写您的单个字符串。
使用这个类的如下构造函数是:
FileOutputStream(String name, boolean append)
这是为了追加到文件的末尾。
您可以使用java.io.RandomAccessFile 编辑文件内的任何位置。
编辑: 使用 RandomAccessFile 实现任务的示例代码。
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
public class InsertPenultimateLine {
private static String nl = System.getProperty("line.separator");
private static void usingRAF() throws Exception {
String fileName = "somefile.txt";
String myLine = "blah-blah-blah";
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
List<Byte> bytes = new ArrayList<Byte>();
long len = raf.length();
long index = len-1;
for(;index>0;index--) {
raf.seek(index);
byte b = raf.readByte();
if(b == 10) {
break;
}
bytes.add(0, b);
}
byte[] rawBytes = new byte[bytes.size()];
for(int j=0;j<bytes.size();j++) {
rawBytes[j] = bytes.get(j);
}
String str = new String(rawBytes);
str = myLine + nl + str;
raf.seek(index + 1);
raf.write(str.getBytes());
raf.close();
}
public static void main(String[] args) throws Exception {
usingRAF();
}
}
【讨论】:
RandomAccessFile.Seek(int)。不确定它会比我目前的解决方案更好......
List<String> 中,那么这对于小文件来说可能没问题。如果文件很大(比如 500MB),那么在列表中缓存它可能不是一种可扩展的方式。顺便说一句,您无需阅读整个文件即可调用 seek 方法。使用length 方法获取整个文件的长度。如果您有单行的大致长度,则可以使用它来到达前一行。
RandomAccessFile.WriteChars(String) 覆盖了写入的位。示例:如果我在“g”位置的“abcdefghijklmno”中写“test”,我得到“abcdeftestklmno”,我想要“abcdeftestghijklmno”