Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换文件中的某些行_Java_Eclipse_File_Java.util.scanner_Writer - Fatal编程技术网

Java 替换文件中的某些行

Java 替换文件中的某些行,java,eclipse,file,java.util.scanner,writer,Java,Eclipse,File,Java.util.scanner,Writer,我有一个扫描仪读取的文件,然后在一个新文件中,我的书写器复制其中的一部分,并替换我要编辑的行 我在某些特定行中遇到问题,我想从stringarray[Ddd,Eee,…]中添加一些元素 我的问题是,我无法让扫描仪和filewriter确定要传输元素的确切位置。它们需要位于“下游”下方,介于/和/之间,并且还需要替换旧文本 示例/目标: 旧文件行: .... downstream_rm(j,l) ... / Aaa.(bbb)

我有一个扫描仪读取的文件,然后在一个新文件中,我的书写器复制其中的一部分,并替换我要编辑的行

我在某些特定行中遇到问题,我想从
stringarray[Ddd,Eee,…]
中添加一些元素

我的问题是,我无法让扫描仪和filewriter确定要传输元素的确切位置。它们需要位于“下游”下方,介于/和/之间,并且还需要替换旧文本

示例/目标:

旧文件行:

 ....
    downstream_rm(j,l) ...
                / Aaa.(bbb)
                    Bbb.(ccc)  /
    ....
 ...
    downstream_rm(j,l( ....
         / str1 
             str2
               ... /
新文件行:

 ....
    downstream_rm(j,l) ...
                / Aaa.(bbb)
                    Bbb.(ccc)  /
    ....
 ...
    downstream_rm(j,l( ....
         / str1 
             str2
               ... /
我尝试了这段代码,但没有得到预期的结果,因为它还保留了旧文本:

public static void main(String[] args) {

File file = new File();
File filenew = new File();

        try {


                    PrintWriter out = new PrintWriter(new FileWriter(filenew, true));
                    Scanner scanner = new Scanner(file);




                           while (scanner.hasNextLine()) {
                               String line = scanner.nextLine();


        if(line.contains("downstream_rm(j,l)")) {

                                           scanner.nextLine();   // so that the line with "downstream" wont be deleted

                                           String raw = "" ;


                                           for (int index = 0; index < strarray.size(); index++) {

                                                  String s = strarray.get(index);
                                                   raw = raw + "\n" + s;
                                               }

                                        line = "/"+raw+"/" ; } 
             out.write(line);
        out.write("\n");

                         }
                       out.flush();
                       out.close();
                       scanner.close();


            } catch (IOException e)  {
                e.printStackTrace();


            }
          }
    }
publicstaticvoidmain(字符串[]args){
File File=新文件();
File filenew=新文件();
试一试{
PrintWriter out=新的PrintWriter(新的FileWriter(filenew,true));
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
如果(行包含(“下游(j,l)”){
scanner.nextLine();//这样就不会删除带有“下游”的行
字符串raw=“”;
对于(int index=0;index
也尝试过这个,但它没有打印任何新内容:

        if(line.contains("downstream_rm(j,l)")){

                               scanner.nextLine();

                               String raw = "" ;


                               for (int index = 0; index < strarray.size(); index++) {

                                      String s = strarray.get(index);
                                       raw = raw + "\n" + s;
                                   }

                        String raw2 = raw.replaceAll(",", "");

                               line = line.replaceAll("/.*?/", "/"+raw2+"/");
                               }  
    out.write(line);
out.write("\n");
if(行包含(“下游(j,l)”){
scanner.nextLine();
字符串raw=“”;
对于(int index=0;index
您的代码没有做它应该做的事情,因为在行中

 line = line.replaceAll("/.*?/", "/"+raw2+"/");
引用“line”中的字符串与正则表达式不匹配,因此它不会替换

这是你需要的

if (line.contains("downstream_rm(j,l)")) {
            String replacement = line;
            while (!replacement.matches(".*?/.*?/.*?")) {
                replacement += scanner.nextLine();
            }
            String raw = "";
            for (int index = 0; index < strarray.size(); index++) {

                String s = strarray.get(index);
                raw = raw + "\n" + s;
            }
            String raw2 = raw.replaceAll(",", "");
            line = replacement.replaceAll("/.*?/", "/" + raw2 + "/");
        }
if(行包含(“下游(j,l)”){
字符串替换=行;
而(!replacement.matches('%1!'/'%2!'/.*)){
替换+=scanner.nextLine();
}
字符串raw=“”;
对于(int index=0;index

只需确保“raw2”变量指向右字符串对象,结果变量行将包含替换的字符串

请格式化您的代码。您不会显示写入新文件的位置。这是什么意思@Dodd1x要更快地获得更好的帮助,请发布一个。提示:添加@Dodd10x(或任何人,
@
很重要)以通知他们新的注释。线程“main”java.util.NoSuchElementException中的异常:在java.util.Scanner.nextLine(未知源代码)中找不到行:replacement+=Scanner.nextLine()@Eugen HalcaUpdate,这意味着您的文件与给定的示例不完全对应…现在可以了。只有一个小细节。第一个/与contains打印在同一行中。我需要把它放在下面字符串旁边的一行,如示例所示。是否需要更改正则表达式@Eugen Halcaalry已经这样做了“\n”+“/”+raw2+“/”现在它转到包含下面的下一行,但字符串也转到下一行。现在我有一行带/only,下一行是字符串。我怎样才能把他们放在同一条线上@Eugen Halcachange this->raw=raw+“\n”+s;此原始+=s+“\n”;