Java Process Builder

Java Process Builder,java,Java,我有一个项目,程序必须打开记事本文件,在输入文本并保存该记事本文件后,程序应显示该文件中的字数,并应删除文件中输入的内容。 运行程序后,我收到此错误错误而不是derjava.lang.NullPointerException。 虽然在Mytext.txt中输入一些文本并保存之后? 我的问题是为什么BufferedReader正在读取空文件,即使我正在用一些内容保存文件。 谢谢你的帮助 public class Notepad_Example { public static void ma

我有一个项目,程序必须打开记事本文件,在输入文本并保存该记事本文件后,程序应显示该文件中的字数,并应删除文件中输入的内容。 运行程序后,我收到此错误错误而不是derjava.lang.NullPointerException。 虽然在Mytext.txt中输入一些文本并保存之后? 我的问题是为什么BufferedReader正在读取空文件,即使我正在用一些内容保存文件。 谢谢你的帮助

public class Notepad_Example {
    public static void main(String[] jfb) {
        try {
            ProcessBuilder proc = new ProcessBuilder("notepad.exe", "C:\\Java Projects\\Reverse String\\src\\Mytext.txt");
            proc.start();
            BufferedReader br;
            String s;

            br = new BufferedReader(new FileReader("C:\\Java Projects\\Reverse String\\src\\Mytext.txt"));
            s = br.readLine();

            char c[] = new char[s.length()];
            int j = 0;
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) != ' ') {
                    c[i] = s.charAt(i);

                } else {
                    j++;
                }
            }
            System.out.println("number of words are " + (j + 1));
            br.close();

        } catch (Exception hj) {
            System.out.println("Error not der" + hj);
        }

        try {
            FileWriter fw = new FileWriter("C:\\Java Projects\\Reverse String\\src\\Mytext.txt");
            fw.close();
        } catch (Exception hj) {
            System.out.println("Error not der" + hj);
        }
    }
}
公共类记事本\u示例{
公共静态void main(字符串[]jfb){
试一试{
ProcessBuilder proc=newProcessBuilder(“notepad.exe”、“C:\\Java Projects\\Reverse String\\src\\Mytext.txt”);
proc.start();
缓冲剂;
字符串s;
br=新的BufferedReader(新的文件阅读器(“C:\\Java项目\\反向字符串\\src\\Mytext.txt”);
s=br.readLine();
字符c[]=新字符[s.length()];
int j=0;
对于(int i=0;i
您遇到的问题是:

 ProcessBuilder proc=new ProcessBuilder("notepad.exe","C:\\Java Projects\\Reverse String\\src\\Mytext.txt"); 
 proc.start(); 
proc.start()
正在返回新启动的进程。您必须给用户机会编辑和保存文件并关闭编辑器,然后才能读取该文件。也就是说,您必须等待该过程完成,然后才能开始使用该过程的结果(保存的文件)

因此,请改为这样做:

Process process = proc.start();
int result = process.waitFor();
if (result == 0) {
  // Do your rest here
} else {
 // give error message as the process did not finish without error.
}
String[] cmd = new String[]{"notepad.exe", "C:\\Java Projects\\Reverse String\\src\\Mytext.txt"};
new ProcessBuilder(cmd);
还有一些评论:

代码的其余部分似乎也有一些问题

  • 您只读取该文件的一行。如果用户正在使用新行怎么办
  • 异常处理不是很好,至少打印异常的堆栈跟踪,这将进一步提示发生异常的位置
  • 如果您使用的是Java7,请继续阅读;如果您使用的是Java6,请添加finally块以确保您的资源(流)已关闭

当您运行
proc.start()时它不会阻塞并等待进程结束,它将继续运行

您需要调用
proc.waitFor()
方法来阻止,直到完成为止。

注意

我们在使用process builder时出现了一些奇怪的行为。。。 我们曾经用一个

new ProcessBuilder("notepad.exe", "C:\\Java Projects\\Reverse String\\src\\Mytext.txt");
但是我们升级到Win7和Java7时失败了-我们不确定这个问题真正起源于何处,但我们修改了如下代码:

Process process = proc.start();
int result = process.waitFor();
if (result == 0) {
  // Do your rest here
} else {
 // give error message as the process did not finish without error.
}
String[] cmd = new String[]{"notepad.exe", "C:\\Java Projects\\Reverse String\\src\\Mytext.txt"};
new ProcessBuilder(cmd);

从那时起,它的工作是正确的

你在什么地方误解了这个要求吗?这个要求中没有误解。非常感谢Matthias。终于成功了。。上面粘贴的代码是草稿。谢谢。很高兴听到这个消息。请记住,我们只能使用您提供的服务。剩下的我们必须猜测:)