2013-03-21 85 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