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();