2016-11-11 58 views
1

我需要用另一个词替换另一个词,而不使用文本中的replacereplaceAll函数。用另一个词替换一个词而不使用替换功能

如果我想替换的单词与原单词的长度相同,则没有任何问题。问题在于我想要替换的单词比原始单词更长还是更短。

例如:我想用字符串“I have one dog”中的“thirteen”替换“one”。这就是我试图做(我用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

什么是您不能使用替换的具体原因?这是一项任务吗?你有内存限制吗? –

+0

是的,这是一个任务。 – ChrisBlp

+0

你实际需要修改什么?你需要修改内存中的字符串还是文件? – Kenster

回答

1

这是我应该怎样做:

  • 每行文件
  • 更换你想要在该行
  • 写一行到临时文件
  • 写一切从临时文件回到原始文件

如果你的文件不是很大,你可以保留内存中的行而不是写入临时文件ry文件。

您可以删除原始文件并将临时文件重命名为原始文件名,而不是将所有内容写回。

0

RandomAccessFile像数组一样工作。您可以覆盖值,但不能在中间插入任何内容。你可以做的是setLength补偿和转移现有的文字,以满足您的需要。

我不确定这是比Mats391建议的方式更好的解决方案。这可能是最短的(但不是最简单的)方法。

+0

我可以在其他班上插入任何东西吗?像BufferedWriter例如? – ChrisBlp

1

您可以阅读整个文件,然后使用String的replace。有两种可选的结果:

  1. 新的字符串短 - 在这种情况下,我们垫在年底
  2. 新的字符串较长或相同长度的字符串 - 这不应该作为RandomAccessFile一个问题会扩展文件。

我们写newString从位置0 - 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(); 
+0

我明白你的方法非常感谢,但我无法使用replaceAll函数。实际上,我的任务的目的是搜索与另一个匹配的每个单词(我实现了一个给定的算法)并替换它。简而言之,我必须以我自己的方式来替换所有的工作。 – ChrisBlp