在Java當中如何優雅地處理臨時文件

背景

最近接手了同事的代碼,發現他是這樣處理excel文件的:java

1. 將文件保存到一個事先定義好的目錄;若是目錄不存在則新建
2. 使用excel處理工具根據文件路徑讀取文件內容以後處理業務邏輯
3. 編寫一個定時任務天天凌晨1點刪除該目錄內的.xlsx文件
複製代碼

這樣雖然能夠達到效果,但實在是繁瑣至極,很是不優雅。其實jdk中就提供了處理臨時文件(Temporary File)的方法,如今讓咱們來看一看。windows

建立臨時文件

在java中建立臨時文件有許多場景,可是大多數是在單元測試或者是對上傳的文件進行內容處理。當測試用例或者文件處理完成後,你並不關心文件是否還存在。何況持續累積的無效文件無疑會浪費許多磁盤空間。jvm

經過使用java.io.File.createTempFile()建立臨時文件

public class TemporaryFileExample {
   public static void main(String[] args) {
      File temp;
      try
      {
         temp = File.createTempFile("myTempFile", ".txt");
          
         System.out.println("Temp file created : " + temp.getAbsolutePath());
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼

windows系統中的輸出: C:\Users\admin\AppData\Local\Temp\myTempFile7295261447112135643.txt工具

經過使用NIO建立臨時文件

public class TemporaryFileExample {
   public static void main(String[] args) {
      try
      {
         final Path path = Files.createTempFile("myTempFile", ".txt");
         System.out.println("Temp file : " + path);

          
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼

windows系統中的輸出: C:\Users\admin\AppData\Local\Temp\myTempFile3492283537103788196.txt單元測試

寫入臨時文件

好比在文件上傳的時候,咱們就能夠將字節流寫入臨時文件當中。測試

使用java.io.BufferedWriter寫入臨時文件

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class TemporaryFileExample {
   public static void main(String[] args) {
      File temp;
      try
      {
         temp = File.createTempFile("myTempFile", ".txt");
 
         BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
         bw.write("This is the temporary data written to temp file");
         bw.close();
 
         System.out.println("Written to Temp file : " + temp.getAbsolutePath());
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼

使用NIO寫入臨時文件

若是你要使用java NIO庫,你就能夠使用Files.write()方法spa

public class TemporaryFileExample {
   public static void main(String[] args) {
      try
      {
         final Path path = Files.createTempFile("myTempFile", ".txt");
         System.out.println("Temp file : " + path);
 
 
         byte[] buf = "some data".getBytes();
         Files.write(path, buf);
 
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼

刪除臨時文件

刪除臨時文件是很是重要的一步,由於你不想讓你的磁盤空間爆炸。 爲了當在應用exit時(jvm終止)刪除文件,你能夠使用:excel

File temp = File.createTempFile("myTempFile", ".txt");
temp.deleteOnExit();
複製代碼

或者若是你想要立馬刪除文件,你能夠直接使用delete()方法code

File temp = File.createTempFile("myTempFile", ".txt");
temp.delete();
複製代碼

使用IO刪除臨時文件

import java.io.File;
import java.io.IOException;
 
public class TemporaryFileExample {
   public static void main(String[] args) {
      File temp;
      try
      {
         temp = File.createTempFile("myTempFile", ".txt");
          
         System.out.println("Temp file created : " + temp.getAbsolutePath());
          
         //temp.delete(); //當即刪除
          
         temp.deleteOnExit(); //運行結束時刪除
          
         System.out.println("Temp file exists : " + temp.exists());
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼

使用NIO刪除臨時文件

public class TemporaryFileExample {
   public static void main(String[] args) {
      try
      {
         final Path path = Files.createTempFile("myTempFile", ".txt");
         System.out.println("Temp file : " + path);
 
        // Files.delete(path); //當即刪除文件
        
        Files.deleteIfExists(path);
          
         
          
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
}
複製代碼
相關文章
相關標籤/搜索