【问题标题】:Java Temporary Files, read and writeJava 临时文件,读写
【发布时间】:2013-03-10 10:43:06
【问题描述】:

我有这段代码

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有关,所以这意味着我无法用信息填充文件,我缺少一些东西?

【问题讨论】:

  • 我认为是因为您没有调用 writer.flush() 或关闭 writer,所以内容仍在缓冲区中。
  • s = s.toString() 什么也没做。

标签: java file temp


【解决方案1】:

你需要关闭编写器

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

}

【讨论】:

  • 这只是问题的一部分。
  • 我试图理解这两个答案,这就是我最终得到它的方式: BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedWriter writer = new BufferedWriter(new FileWriter(iptmp));尝试 { while ((s = stdInput.readLine())!=null) { System.out.println(s); writer.write(s+"\r\n"); } } 最后 { if (writer !=null) { writer.close(); } } 顺便说一句,@Ernest 你是对的,我只是在 Windows 上测试。
  • @user1216761 正如 Ernest Friedman-Hill 所说,您的代码只能在 Windows 中运行,而不能在 linux 中运行
  • 是的,在您从我的回答中复制了解决方案的另一部分之后,它确实解决了问题。
  • 不,最初是一个简短的答案,而我还在编辑它
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多