我需要在不使用文本中的replace
和replaceAll
函数的情况下替换另一个单词。
如果我要替换的单词与原单词的长度相同,则没有任何问题。问题是当我要替换的单词比原始单词更长或更短时。
例如:我想在“我有一只狗”字符串中将“one”替换为“13”。这就是我尝试做的事情(我使用RandomAccessFile
类):
RandomAccessFile r = new RandomAccessFile("toto.txt","rw")
r.seek(position); // imagine that position is the right cursor which take place under the o from the word "one"
r.writeBytes("thirteen");
当我尝试这个时,我会删除狗后的单词,因为“十三”比“一”长。
如果我要替换的单词比原始单词短,则同样的问题。我用空白字母替换了剩余的字母,但我有空白空间......
我该怎么办?
答案 0 :(得分:1)
我会这样做:
如果文件不大,可以将行保留在内存中,而不是写入临时文件。
您可以删除原始文件并将临时文件重命名为原始文件名,而不是将所有内容都写回来。
答案 1 :(得分:1)
您可以阅读整个文件,然后使用String的replace
。有两种不同的结果:
RandomAccessFile
会扩展文件。我们从位置0写newString
- RandomAccessFile
就像数组一样工作,因此内容被覆盖。
RandomAccessFile r = new RandomAccessFile("toto.txt","rw");
//read the content
byte[] buffer = new byte[(int)r.length()];
r.read(buffer);
String str = new String(buffer, "UTF-8");
//replace and pad right to get at least the same length
String newString = str.replaceAll("one","three");
str = String.format("%1$"+str.length()+ "s", newString);
//write back to the file
r.seek(0);
r.writeBytes(newString);
r.close();
答案 2 :(得分:0)
尝试使用String与数组一样:使用https://en.wikipedia.org/wiki/Boyer - Moore_string_search_algorithm并替换字符。当然,您需要修改数组长度。
答案 3 :(得分:0)
RandomAccessFile
就像一个数组。您可以覆盖值,但不能在中间插入任何内容。您可以做的是setLength
以根据需要补偿和转移现有文本。
我不确定它是否比Mats391建议的更好“解决方案”。它可能是最短(但不是最简单)的方式。