前面写了个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());