2013-03-21 36 views
0

我有这样一段代码Java的临时文件,读取和写入

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相关的东西,所以那意味着我无法用信息填充文件,那里有我丢失的东西?

+0

,我认为那是因为你没有调用writer.flush()或关闭的作家,所以内容在缓冲区中是stil。 – 2013-03-21 03:14:41

+0

's = s.toString()'完全没有实现。 – EJP 2013-03-21 03:44:02

回答

5

每次打开一个文件,写这样的时间 - 即,每次执行该行:

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

文件被截断为长度为零。此外,由于你永远不会明确地呼吁BufferedWriterclose(),你写的行永远不会实际被刷新到文件。因此,没有任何数据可以传输到磁盘。

为了做到这一点,首先将上面的行移到循环之前,这样它只执行一次。其次,在循环后,包括像

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

最后的代码,请注意你的程序是不必要打破在Mac上,这既不是Linux的,也没有使用cmd.exe。而不是你写这个的方式,你明确地测试Windows,如果你找到它,就使用Windows命令行;否则,假设类似于UNIX,并使用Linux版本。

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

} 
+0

这只是问题的一部分。 – 2013-03-21 03:15:42

+0

@ ErnestFriedman-Hill但它确实解决了问题 – 2013-03-21 03:19:57

+0

我试着理解这两个答案,并且这是我最终得到它的方式: BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); \t \t BufferedWriter writer = new BufferedWriter(new FileWriter(iptmp)); \t \t \t \t \t \t尝试 \t \t { \t \t \t而((S = stdInput.readLine())!= NULL) \t \t \t { \t \t \t \t的System.out.println(S ); \t \t \t \t作家。写(S + “\ r \ n”); \t \t \t \t \t \t \t} \t \t} \t \t最后 \t \t { \t \t \t如果(作家!= NULL) \t \t \t { \t \t \t \t writer.close(); \t \t \t} \t \t} 顺便说一句,@Ernest你是对的,我只是测试在Windows上。 – 2013-03-21 03:51:14