萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> java實現u盤指定內容的自動復制

java實現u盤指定內容的自動復制

程序的功能是,檢查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();
	}
}
copyright © 萬盛學電腦網 all rights reserved