1

我有这段代码

package Classes;

import java.io.*;

public class IpAdministrator {

    public Boolean isActive(String ipAddress) {
        boolean isActive = false;
        String cmd;
        String OS = System.getProperty("os.name");
        System.out.println(OS);
        String tmpfolder = System.getProperty("java.io.tmpdir");
        System.out.println(tmpfolder);

        //iptmp.deleteOnExit();

        if (OS.equals("Linux")) {
            cmd = "ping " + ipAddress + " -c 1";
        } else {
            cmd = "cmd /c ping " + ipAddress + " -n 1";
        }
        try {
            String s = null;
            Process p = Runtime.getRuntime().exec(cmd);
            File iptmp = File.createTempFile("ipresult", ".txt", new File(tmpfolder));


            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));


            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
                s = s.toString();
                BufferedWriter writer = new BufferedWriter(new FileWriter(iptmp));
                writer.write(s);

            }


        } catch (Exception ex) {
            System.out.println(ex.getMessage().toString());
        }


        return isActive;
    }

}

我想将命令的结果写在临时文件中,我在这个站点的其他问题中发现了一些相关的东西,它似乎工作正常,但是当我运行这个时,文件是用一些随机数字创建的(即:ipresult540677216848957037 .txt) 并且它是空的,我不知道为什么,我还读到它与 java 1.7 有关,所以这意味着我无法用信息填充文件,有什么我遗漏的吗?

4

2 回答 2

6

每次您以这种方式打开文件时——即每次执行此行时:

BufferedWriter writer = new BufferedWriter(new FileWriter(iptmp));

该文件被截断为零长度。此外,由于您从未显式调用close(),BufferedWriter您编写的行将永远不会真正刷新到文件中。结果,没有数据进入磁盘。

要正确执行此操作,首先,将上面的行移动到循环之前,因此它只执行一次。其次,在循环之后,包含类似的代码

if (writer != null)
    writer.close();

最后,请注意,您的程序在 Mac 上被不必要地破坏了,它们既不是 Linux,也不使用cmd.exe. 与您编写此代码的方式不同,您针对 Windows 进行显式测试,并在找到时使用 Windows 命令行;否则,假设类似于 UNIX,并使用 Linux 版本。

于 2013-03-21T03:12:38.490 回答
-5

你需要关闭作家

BufferedReader stdInput = new BufferedReader(new InputStreamReader(
        p.getInputStream()));
BufferedWriter writer = null;
try {
    writer = new BufferedWriter(new FileWriter(iptmp));
    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
        s = s.toString();
        writer.write(s);
    }

} finally {
    if (writer != null) {
        writer.close();
    }
}

如果您使用的是 java 7

try (BufferedWriter writer = new BufferedWriter(new FileWriter(
        iptmp));) {

    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
        s = s.toString();
        writer.write(s);
    }

}
于 2013-03-21T03:15:00.970 回答