程序的功能是,檢查U盤,並將U盤的內容自動拷貝到系統的某個盤符中。分享給大家,就當作是練習io流的小練習。
這個小程序的實現方法如下:
1、程序運行後隔一斷時間就檢查系統的盤符有沒有增加,通過File.listRoots()可獲取系統存在的盤符。
2、如果盤符增加了,遍歷這個新增加的盤符,用字節流拷貝文件到指定的路徑。
需要注意的是,由於U盤的內容可能很大,所以拷貝的時候最好指定要拷貝的文件類型,如ppt,doc,txt等等。
下面是這個小程序的相關代碼:
在CopyThread類中可以指定要復制的文件類型,大家在fileTypes數組中加入相應的文件後綴名即可。如果要復制所有文件,將其設為null就行了。在CopyFileToSysRoot類中可以指定存儲的路徑,當然,如果願意的話,你可以將文件上傳到網盤,郵箱等等
一、USBMain類,程序入口:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class USBMain { public static void main(String[] args) { USBMain u = new USBMain(); u.launchFrame(); //開啟盤符檢查線程 new CheckRootThread().start(); } // 界面 private void launchFrame() { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(450, 250); JButton hide = new JButton("點擊隱藏窗口"); // 點擊按鈕後隱藏窗口事件監聽 hide.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.setVisible(false); } }); frame.add(hide); frame.pack(); frame.setVisible(true); } }
二、CheckRootThread類,此類用於檢查新盤符的出現,並觸發新盤符文件的拷貝。
import java.io.File; //此類用於檢查新盤符的出現,並觸發新盤符文件的拷貝 public class CheckRootThread extends Thread { // 獲取系統盤符 private File[] sysRoot = File.listRoots(); public void run() { File[] currentRoot = null; while (true) { // 當前的系統盤符 currentRoot = File.listRoots(); if (currentRoot.length > sysRoot.length) { for (int i = currentRoot.length - 1; i >= 0; i--) { boolean isNewRoot = true; for (int j = sysRoot.length - 1; j >= 0; j--) { // 當兩者盤符不同時,觸發新盤符文件的拷貝 if (currentRoot[i].equals(sysRoot[j])) { isNewRoot = false; } } if (isNewRoot) { new CopyThread(currentRoot[i]).start(); } } } sysRoot = File.listRoots(); //每5秒時間檢查一次系統盤符 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
三、CopyThread類,用於文件遍歷並選擇指定文件格式進行復制:
import java.io.File;
//該類用於對新盤符文件的復制
public class CopyThread extends Thread {
// 設置要復制的文件類型,如果要復制所有格式的文件,將fileTypes設為null即可
private static String[] fileTypes = {"ppt","doc","txt","wps"};
// private static String[] fileTypes = null;
File file = null;
public CopyThread(File file) {
this.file = file;
}
public void run() {
listUsbFiles(file);
}
//遍歷盤符文件,並匹配文件復制
private void listUsbFiles(File ufile) {
File[] files = ufile.listFiles();
for (File f : files) {
if (f.isDirectory()) {
listUsbFiles(f);
} else {
if (fileTypeMatch(f))
new CopyFileToSysRoot(f).doCopy();
}
}
}
//匹配要復制的文件類型
public boolean fileTypeMatch(File f) {
//fileTypes為null時,則全部復制
if (fileTypes == null) {
return true;
} else {
for (String type : fileTypes) {
if (f.getName().endsWith("." + type)) {
return true;
}
}
}
return false;
}
}
四、CopyFileToSysRoot類,復制文件的IO流實現:
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; //文件復制IO public class CopyFileToSysRoot { // 復制文件保存路徑 private static final String PATH = "D:USB"; private File file = null; public CopyFileToSysRoot(File file) { this.file = file; } // 復制文件 public void doCopy() { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //創建目錄 File fPath = new File(getFileParent(file)); if (!fPath.exists()) { fPath.mkdirs(); } bis = new BufferedInputStream(new FileInputStream(file)); bos = new BufferedOutputStream(new FileOutputStream(new File(fPath, file.getName()))); byte[] buf = new byte[1024]; int len = 0; while ((len = bis.read(buf)) != -1) { bos.write(buf, 0, len); bos.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bis != null) bis.close(); } catch (IOException e) { e.printStackTrace(); } try { if (bos != null) bos.close(); } catch (IOException e) { e.printStackTrace(); } } } // 根據盤符中文件的路徑,創建復制文件的文件路徑 public String getFileParent(File f) { StringBuilder sb = new StringBuilder(f.getParent()); int i = sb.indexOf(File.separator); sb.replace(0, i, PATH); return sb.toString(); } }