Java 不使用替换功能将一个单词替换为另一个单词
我需要将一个单词替换为另一个单词,而不使用文本中的Java 不使用替换功能将一个单词替换为另一个单词,java,string,replace,words,randomaccessfile,Java,String,Replace,Words,Randomaccessfile,我需要将一个单词替换为另一个单词,而不使用文本中的replace和replaceAll函数 如果我要替换的单词与原来的单词长度相同,则没有任何问题。问题是我要替换的单词何时比原来的长或短 例如:我想用字符串“我有一只狗”中的“十三”替换“一”。这就是我试图做的(我使用RandomAccessFileclass): 当我试着这样做的时候,我会删除狗后面的单词,因为“十三”比“一”长 如果我要替换的单词比原来的短,则会出现同样的问题。我用空白字母替换了剩下的字母,但我有难看的空白 如何继续?我将这样
replace
和replaceAll
函数
如果我要替换的单词与原来的单词长度相同,则没有任何问题。问题是我要替换的单词何时比原来的长或短
例如:我想用字符串“我有一只狗”中的“十三”替换“一”。这就是我试图做的(我使用RandomAccessFile
class):
当我试着这样做的时候,我会删除狗后面的单词,因为“十三”比“一”长
如果我要替换的单词比原来的短,则会出现同样的问题。我用空白字母替换了剩下的字母,但我有难看的空白
如何继续?我将这样做:
- 对于文件中的每一行
- 在生产线上更换您想要的产品
- 将行写入临时文件
- 将所有内容从临时文件写回原始文件
您可以删除原始文件并将临时文件重命名为原始文件名,而不是将所有内容都写回去。尝试使用类似字符串的数组:使用–Moore\u String\u search\u算法并替换字符。当然,您需要修改数组长度
RandomAccessFile
的工作原理与数组类似。可以重写值,但不能在中间插入任何内容。您可以做的是setLength
根据需要对现有文本进行补偿和前移
我不确定这是一个比Mats391建议的“更好”的解决方案。这可能是最短(但不是最简单)的方法。您可以读取整个文件,然后使用String的
替换。有两种可供选择的结果:
新字符串较短-在这种情况下,我们将字符串填充在末尾
新字符串较长或长度相同-这应该不是问题,因为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();
您不能使用替换的具体原因是什么?这是作业吗?你有内存限制吗?是的,这是一个作业。你实际需要修改什么?您需要修改内存中的字符串还是文件?我只需要在给定的文本(文件)中修改一个单词(字符串,如果您需要的话)。我理解您的方法,非常感谢,但我不能使用replaceAll函数。事实上,我作业的目的是搜索与另一个词匹配的每个词(我实现了给定的算法)并替换它。总而言之,我必须用自己的方式来代替所有的工作。我可以把中间的东西插入另一个班吗?比如BufferedWriter?
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();