前面写了个JS版,这里记录个java版本的,思路跟先前那个差不多,这里就不多说了。所不同的是:那个是客户端的,这里是在服务器端,而且了除了用ajax循环扫描之后,还添加了java中的循环扫描。

 

1、前台展示

<body>
   <table width="100%" border="0" cellspacing="0" cellpadding="0" class="ztb_l" id="upanTable">
	<tr>
		<td>盘符路径(Path)</td>
		<td>驱动器类型(DriveType)</td>
		<td>卷标名(VolumeName)</td>
		<td>可用容量大小(AvailableSpace)</td>
		<td>总空间容量大小(TotalSize)</td>
	</tr>
</table>
</body>

2、工具类

a、USB实体类:

public class Usb implements Serializable {
	private static final long serialVersionUID = -3413919743044797833L;
	private String pathName;//路径名称,如D:\
	private String diskName;//盘符名称,如软件 (D:)
	private String diskType;//盘符类型,如本地磁盘
	private int flag;//标识 0-本地磁盘 1-可移动磁盘
	private double usableSize;//可用空间
	private double totalSize;//总空间
	//get/set方法
}

b、获取磁盘信息工具类:

public class DiskUtil {
	private final static String localDiskName = "本地磁盘";
	private final static String removableDiskName = "可移动磁盘";
	private final static String enLocalDiskName = "Local Disk";
	private final static String enRemovableDiskName = "Removable Disk";
	
	/**
	 * 该方法用来获取磁盘信息
	 * @param flag:获取的磁盘类型信息:1-获取所有磁盘信息及数量 2-获取本地磁盘信息和数量 3-获取可移动磁盘信息和数量
	 * @param flag2:磁盘容量显示方式:1-GB 2-MB 3-KB 4-B 默认为GB
	 * @return list<Usb>:返回磁盘基本信息集合
	 * */
	public List<Usb> getUdiskInfo(int flag,int flag2) {
		List<Usb> diskList = new ArrayList<Usb>();
		FileSystemView fileSystemView = FileSystemView.getFileSystemView();// 获取FileSystemView对象
		double unit = getDiskUnit(flag2);//将磁盘格式化为GB
		Usb usb = null;
		File[] roots = File.listRoots();
		String diskType="";
		long usableSpace=0;
		long totalSpace=0;
		try{
			for (File file : roots) {
				diskType="";
				usableSpace=0;
				totalSpace=0;
				diskType= fileSystemView.getSystemTypeDescription(file);// 获取磁盘的类型描述信息
				//System.out.println("磁盘类型:"+diskType);
				// 当磁盘为本地磁盘时
				if(diskType.startsWith(localDiskName)|| diskType.startsWith(enLocalDiskName)){
					if(flag==3){//说明是要获取移动磁盘信息,而当前是本地磁盘信息,因此直接退出当前循环
						continue;
					}else{//获取全部或本地磁盘,直接创建对象并设置值
						usb = new Usb();//实例化对象
						usb.setFlag(0);//标记为本地磁盘
					}
				}
				// 当磁盘为可移动磁盘时
				else if(diskType.startsWith(removableDiskName)|| diskType.startsWith(enRemovableDiskName)){
					if(flag==2){//说明是要获取本地磁盘信息,而当前不是本地磁盘信息,因此直接退出当前循环
						continue;
					}else{//获取全部或可移动磁盘,直接创建对象并设置值
						usb = new Usb();//实例化对象
						usb.setFlag(1);//标记为可移动磁盘
					}
				}else{//未知的磁盘类型,直接退出当前循环
					continue;
				}
				
				usb.setDiskType(diskType);//磁盘类型
				usb.setPathName(file.getCanonicalPath());//获取规范路径名称,如C:\
				usb.setDiskName(fileSystemView.getSystemDisplayName(file));//获取磁盘名称,如:软件 (D:)
				
				usableSpace = file.getUsableSpace();// 获取磁盘的可用空间
				usb.setUsableSize(usableSpace/unit);
	
				totalSpace = file.getTotalSpace();// 获取磁盘的总空间
				usb.setTotalSize(totalSpace/unit);
				
				diskList.add(usb);
			}
		}catch(Exception e){
			e.printStackTrace();
			diskList=null;
		}
		return diskList;
	}
	
	/**
	 * 该方法用来获取磁盘容量显示方式:1-GB 2-MB 3-KB 4-B 默认为GB
	 * @return double:磁盘单位,如GB:1024*1024*1024 MB:1024*1024 KB为:1024 B为:1
	 * **/
	private double getDiskUnit(int flag){
		double unit = 1024 * 1024 * 1024;//将磁盘格式化为GB,默认值
		switch(flag){
		case 2:{
			unit = 1024 * 1024;//MB
			break;
		}
		case 3:{
			unit = 1024;//KB
			break;
		}
		case 4:{
			unit = 1;//B
			break;
		}
		default:
			unit = 1024 * 1024 * 1024;//GB
			break;
		}
		return unit;
	}

	
	/**
	 * 该方法用来读取指定目录下的所有文件
	 * @param File:文件对象
	 * **/
	private void printFileInfo(File file){
		if(file!=null){//保证指定的对象不为空
			if(file.isDirectory()){//是否目录,那么需要循环该目录下的文件夹
				File f[] = file.listFiles();//获取全部文件
				if(f!=null){
					for(int i=0;i<f.length;i++){//循环所有文件
						printFileInfo(f[i]);
					}
				}
			}else{
				System.out.println(file);
			}
		}
	}
	
	/*测试方法
	public static void main(String[] args){
		//1、获取磁盘基本信息
		List usbInfo = getUdiskInfo(3,1);//获取全部磁盘信息并且以GB形式计算空间大小
		Usb  usb = null;
		DecimalFormat df = new DecimalFormat("###0.00");
		if(usbInfo!=null && usbInfo.size()>0){//说明有数据
			for(int i=0;i<usbInfo.size();i++){//只取前usbInfo.size()个对象
				usb = (Usb)usbInfo.get(i);
				System.out.println("盘符编号:"+usb.getPathName()+"\n盘符类型:"+usb.getDiskType()+"\n盘符名称:"+usb.getDiskName()+"\n总空间大小:"+df.format(usb.getTotalSize())+"GB\n剩余空间大小:"+df.format(usb.getUsableSize())+"GB\n");
			}
		}
		//2、读取磁盘中的内容(只读取一个)
		File file = new File("G:\\");
		printFileInfo(file);
	}
	*/
}

3、获取所有磁盘的信息并显示到页面:

a、servlet:


//获取所有磁盘信息
DiskUtil diskInfo = new DiskUtil();
//获取全部磁盘信息并且以GB形式计算空间大小
List<Usb> usbList = diskInfo.getUdiskInfo(1,1);
if(usbList!=null && usbList.size()>0){
	request.setAttribute("usbList",usbList);
}
request.getRequestDispatcher("test/diskForJava.jsp").forward(request, response);

b、页面展示:

<table width="100%" border="0" cellspacing="0" cellpadding="0" class="ztb_l" id="upanTable">
	<tr>
		<td>盘符路径(Path)</td>
		<td>驱动器类型(DriveType)</td>
		<td>卷标名(VolumeName)</td>
		<td>可用容量大小(AvailableSpace)</td>
		<td>总空间容量大小(TotalSize)</td>
	</tr>
	<c:forEach items="${usbList }" var="usb">
		<tr>
			<td>${usb.pathName }</td>
			<td>${usb.diskType }</td>
			<td>${usb.diskName }</td>
			<td><fmt:formatNumber value="${usb.usableSize }" pattern="###0.##" />GB</td>
			<td><fmt:formatNumber value="${usb.totalSize }" pattern="###0.0#"/>GB</td>
		</tr>
	</c:forEach>
</table>

 c、注意:记得导入jstl包:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

4、使用AJAX获取磁盘信息并显示json格式获取多个,若没有连接磁盘则扫描磁盘)

a、ajax请求:



function getUInfo(){
	$.ajax({
		type:"post",
		async:false,
		data:{"time":new Date().getTime()},
		dataType:"json",
		url:"MainServlet",
		timeout:20000,
		error:function(XMLHttpRequest,textStatus,errorThrown){
			// alert(XMLHttpRequest.status);
			// alert(XMLHttpRequest.readyState);
			// alert(textStatus);
			// alert("加载错误,错误原因:\n"+errorThrown);
			getUInfo();//没有识别到那么继续查询
		},
		success:function(data){
	        if(data.length>0){//说明有识别到U盘
	        	var tableHtml="";
	        	for(var i=0;i<data.length;i++){
	        		tableHtml +="<tr>"
	        			   +"<td>"+data[i].pathName+"</td>"
	        			   +"<td>"+data[i].diskType+"</td>"
	        			   +"<td>"+data[i].diskName+"</td>"
	        			   +"<td>"+data[i].usableSize.toFixed(2)+"GB</td>"
	        			   +"<td>"+data[i].totalSize.toFixed(2)+"GB</td>"
	        			   +"</tr>";
	        	}
	        	$("#upanTable").append(tableHtml);
	        }else{// 没有识别到那么继续查询
	        	getUInfo();
	        }
		}
	});
}



b、servlet处理:

String retuStr = "";
DiskUtil diskInfo = new DiskUtil();
boolean notFindIt = true;//访问到有移动磁盘信息
List<Usb> usbList = null;
Usb  usb = null;
try {
	while(notFindIt){//若是没有找到一次信息则一直循环
		usbList= diskInfo.getUdiskInfo(3,1);//获取全部磁盘信息并且以GB形式计算空间大小
		if(usbList!=null && usbList.size()>0){//说明找到了
			notFindIt=false;//此时循环会自动结束
		}else{
			Thread.sleep(5*1000);//休眠5秒
		}
	}
} catch (InterruptedException e) {
	e.printStackTrace();
	usbList=null;
}
if(usbList!=null && usbList.size()>0){//说明有插入U盘
	retuStr = JSONArray.fromObject(usbList).toString();
}else{
	retuStr="";
}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
response.getWriter().write(retuStr);

c、注意:使用json时记得导入json需要的7个jar包。

 

5、使用AJAX获取磁盘信息并显示xml格式获取一个,若没有连接磁盘则扫描磁盘)

a、ajax请求:



function getUInfo2(){
	$.ajax({
		type:"post",
		async:false,
		data:{"flag":"2","time":new Date().getTime()},
		dataType:"text",
		url:"MainServlet",
		error:function(XMLHttpRequest,textStatus,errorThrown){
			// alert(XMLHttpRequest.status);
			// alert(XMLHttpRequest.readyState);
			// alert(textStatus);
			// alert("加载错误,错误原因:\n"+errorThrown);
			getUInfo2();// 加载错误,那么继续查询
		},
		success:function(data){
			data = $.parseXML(data);//先使用jQuery的parseXML方法转换成Jquery的XML对象
			var count = $(data).find("count").text();// U盘数量
	        count = parseInt(count,10);
	        if(count>0){// 说明有识别到U盘
	        	var pathName = $(data).find("pathname").text();// 路径名称,如D:\
	        	var diskType = $(data).find("disktype").text();// 磁盘类型,如本地磁盘、可移动磁盘									// (D:)
	        	var diskName = $(data).find("diskname").text();// 盘符名称,如软件
	        	var usableSize = $(data).find("usablesize").text();// 可用空间,GB显示
	        	var totalSize = $(data).find("totalsize").text();// //总空间,GB显示
	        	//alert("路径名称:"+pathName+"\n盘符名称:"+diskName+"\n总空间:"+totalSize+"GB\n可用空间:"+usableSize);
	        	var tableHtml="";
	        	tableHtml +="<tr>"
     			   +"<td>"+pathName+"</td>"
     			   +"<td>"+diskType+"</td>"
     			   +"<td>"+diskName+"</td>"
     			   +"<td>"+usableSize+"</td>"
     			   +"<td>"+totalSize+"</td>"
     			   +"</tr>";
     			$("#upanTable").append(tableHtml);
	        }else{// 没有识别到那么继续查询
	        	getUInfo2();
	        }
		}
	});
}



b、servlet处理:

StringBuffer retuStr = new StringBuffer();
DiskUtil diskInfo = new DiskUtil();
boolean notFindIt = true;//访问到有移动磁盘信息
List usbInfo = null;
Usb  usb = null;
try {
	while(notFindIt){//若是没有找到一次信息则一直循环
		usbInfo= diskInfo.getUdiskInfo(3,1);//获取全部磁盘信息并且以GB形式计算空间大小
		if(usbInfo!=null && usbInfo.size()>0){//说明找到了
			notFindIt=false;//此时循环会自动结束
		}else{
			Thread.sleep(5*1000);//休眠5秒
		}
	}
} catch (InterruptedException e) {
	e.printStackTrace();
	usbInfo=null;
}
DecimalFormat df = new DecimalFormat("###0.##");
DecimalFormat df2 = new DecimalFormat("###0.0#");
if(usbInfo!=null && usbInfo.size()>0){//说明有插入U盘
	usb = (Usb)usbInfo.get(0);//只取第一个U盘信息
	retuStr.append("<usb><count>1</count>")
		   .append("<pathname>"+usb.getPathName()+"</pathname>")
		   .append("<disktype>"+usb.getDiskType()+"</disktype>")
		   .append("<diskname>"+usb.getDiskName()+"</diskname>")
		   .append("<usablesize>"+df2.format(usb.getUsableSize())+"GB</usablesize>")
		   .append("<totalsize>"+df.format(usb.getTotalSize())+"GB</totalsize>")
		   .append("</usb>");
}else{
	retuStr.append("<usb><count>0</count></usb>");
}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
response.getWriter().write(retuStr.toString());