Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
findstr在Java中不工作,如何修复它?_Java_Processbuilder_Findstr - Fatal编程技术网

findstr在Java中不工作,如何修复它?

findstr在Java中不工作,如何修复它?,java,processbuilder,findstr,Java,Processbuilder,Findstr,我正在做一个项目,其中的一部分必须在一些原始文件的标记文本中搜索单词。为此,我尝试使用“findstr”函数,但它给我带来了很多麻烦。 该文件包含西班牙语文本,因此为了处理特殊字符,我必须使用带有一些选项的“findstr”函数。 我试图通过ProccesBuilder和Process类运行该命令,但什么都没有发生 我怀疑实际工作目录可能有问题,所以我在ProcessBuilder对象中更改了它,但没有结果 private static void findWordData(String file

我正在做一个项目,其中的一部分必须在一些原始文件的标记文本中搜索单词。为此,我尝试使用“findstr”函数,但它给我带来了很多麻烦。 该文件包含西班牙语文本,因此为了处理特殊字符,我必须使用带有一些选项的“findstr”函数。 我试图通过ProccesBuilder和Process类运行该命令,但什么都没有发生

我怀疑实际工作目录可能有问题,所以我在ProcessBuilder对象中更改了它,但没有结果

private static void findWordData(String filename){

   try{
       String procs = "findstr /g:" + filename + " spanishEtiquetado* >results.txt"; 
       ProcessBuilder proBuild = new ProcessBuilder();
       proBuild.command("cmd.exe","/c",procs);
       proBuild.directory(new File("resources/TextData/SPA/"));
       Process p= proBuild.start();
   } catch (IOException e) {
        System.out.println("exception happened - here's what I know: ");
        e.printStackTrace();
        System.exit(-1);
    }
}
预期的结果是,该命令读取文件中/g:标记后面的单词,然后在以“SpanishTiquetado”开头的所有文件中搜索该单词。最后,应将结果写入文件“results.txt”:

谢谢你抽出时间

编辑: 好吧,这很奇怪。 正如你在评论中所读到的,我创建了一个新项目,这样我可以更好地测试事情,并且发生了一些奇怪的事情。 现在,我在项目的根文件夹和src文件夹中都有aux_string.txt、results.txt和spanishEtiquetado文件。 作为代码,我一直在测试两个选项: 首先,SuperMario48发布的有点修改:

Runtime.getRuntime().exec("cmd /c findstr /g:aux_strings.txt spanishEtiquetado* >results.txt");
第二个是我以前用过的:

String procs = "findstr /g:" + filename + " spanishEtiquetado* >results.txt";
ProcessBuilder proBuild = new ProcessBuilder();
proBuild.directory(new File("src/"));
proBuild.command("cmd.exe", "/c", procs);
Process p = proBuild.start();
如果执行第一个命令,则命令将处理根文件夹中的文件,从而使用所需的结果修改根文件夹中的results.txt文件

现在,如果我使用我的旧代码,目录会发生变化,results.txt会写入src文件夹中,但它是空的,因为没有读取其他必需的文件,即使是src文件夹之外的文件。
我不知道发生了什么,非常感谢你的帮助。

也许试试这个。这只是执行外部进程的另一种方式

Runtime.getRuntime().exec("cmd /c findstr /g:" + filename + " spanishEtiquetado* >results.txt");

将您的try块替换为要测试的块。

也许可以试试这个。这只是执行外部进程的另一种方式

Runtime.getRuntime().exec("cmd /c findstr /g:" + filename + " spanishEtiquetado* >results.txt");

将try块替换为要测试的块。

我认为您需要将绝对路径添加到findstr executableI尝试过,但没有成功。如果我转到CMD中的文件夹,键入代码中的命令,一切正常。我认为您需要将绝对路径添加到findstr可执行文件中。我尝试过,但没有成功。如果我转到CMD中的文件夹,键入代码中的命令,一切正常。我结束创建新项目只是为了测试解决方案。我尝试了你的代码,没有任何更改,但是我将commad中使用的文件添加到项目的根文件夹中。我使用了你的命令,然后它工作了,所以它似乎和路径有关。问题是,我以前用这个命令尝试过相对路径,但似乎不起作用。最后我发现这似乎是原始文件的错误。看起来他们的时代不一致,有时有效,有时无效。尽管如此,还是要感谢你的帮助。我结束了创建一个新项目只是为了测试解决方案。我尝试了你的代码,没有任何更改,但是我将commad中使用的文件添加到项目的根文件夹中。我使用了你的命令,然后它工作了,所以它似乎和路径有关。问题是,我以前用这个命令尝试过相对路径,但似乎不起作用。最后我发现这似乎是原始文件的错误。看起来他们的时代不一致,有时有效,有时无效。不过,谢谢你的帮助。