文件操作与异常机制

[img][/img] 基础知识:
文件类位于java.io包中,可以通过File对象的方法创建文件对象、删除文件、列表目录下的文件,判断文件时目录还是正式文件,文件系统的基本规则:
1.文件的全名字包含文件的路径名和扩展名,单独讲一个文件名时,是不带路径但带扩展名的文件名。
2.同一目录下不可能存在同名的目录和真实文件,系统主要有目录类型的文件和真实文件两种,真实文件可以没有扩展名,还有第三种我们不需要计算的,如虚拟内存文件。
3.相对目录指不以路径分隔符开头的文件路径,绝对目录是指以根目录开头的路径;当前目录指相对与程序运行时的目录算起的相对路径。
4.目录分隔符和路径分隔符在liunx和win平台上不同,前者为"/"和":",后者为“\”和";",因此要注意。

类的构造方法(图一)

类中的方法(图二——图五)


练习:统计你磁盘中所有文件总数或者选择只统计某一种类型的文件或者根据文件名进行统计(线程)
代码:
主函数
package 文件;

import java.awt.Dimension;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Homework extends JFrame {

/**
* @param args
*/
public static void main(String[] args) {
Homework h=new Homework();
h.initGUI();

}
private void initGUI() {
this.setTitle("文件统计");
this.setSize(new Dimension(800,600));
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(null);//设置布局为空,绝对布局
this.setResizable(false);//设置禁止改变窗体的大小



JLabel label1=new JLabel("路径");//实例化一个标签对象
label1.setBounds(50, 20, 40, 30);//设置位置
this.add(label1);
String[] q1=new String[3];
    q1[0]=new String("C:\\");
q1[1]=new String("D:\\");
q1[2]=new String("E:\\");

JComboBox jco1=new JComboBox(q1);//实例化一个下拉框的对象
jco1.setBounds(100, 20, 180, 30);
this.add(jco1);

JLabel label2=new JLabel("文件名");//实例化一个标签对象
label2.setBounds(300, 20, 40, 30);//设置位置
this.add(label2);
JTextField jte=new JTextField();////实例化一个文本输入框的对象
jte.setBounds(345, 20, 150, 30);//设置位置
this.add(jte);//将文本框(JTextField)添加到面板上

JLabel label3=new JLabel("文件格式");//实例化一个标签对象
label3.setBounds(500, 20, 60, 30);//设置位置
this.add(label3);
String[] q2=new String[3];
q2[0]=new String(".jpg");
q2[1]=new String(".txt");
q2[2]=new String(".png");
JComboBox jco2=new JComboBox(q2);//实例化一个下拉框的对象
jco2.setBounds(565, 20, 100, 30);
this.add(jco2);

JButton jb=new JButton("统计");//实例化一个统计按钮
jb.setBounds(670,20 ,80, 30);
this.add(jb);
//添加输出框
JTextArea ja=new JTextArea();
ja.setBounds(50, 100, 700, 300);
ja.setWrapStyleWord(true);

JScrollPane jp = new JScrollPane(ja);
jp.setBounds(50, 100, 650, 400);
this.add(jp);

//实例化一个背景图标对象
ImageIcon backgroundImage=new ImageIcon("pictures/4.png");
// 实例化一个标签对象用来显示背景图标
JLabel jlaBackground = new JLabel(backgroundImage);
jlaBackground.setBounds(0, 0, 800, 600);
this.add(jlaBackground);

this.setVisible(true);//设置窗体可见

//创建监听器,传入数据
FileListener fl=new FileListener(jco1,jco2,jte,ja);
jb.addActionListener(fl);
}
}

按钮上的动作监听器
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class FileListener implements ActionListener{
private JComboBox jco1,jco2;
private JTextField jte;
private JTextArea ja;
private String name, pwd,path;
    //重写一个构造方法
public FileListener(JComboBox jco1,JComboBox jco2, JTextField jte ,JTextArea ja) {
this.jco1 = jco1;
this.jco2 = jco2;
this.jte=jte;
this.ja = ja;
}
/**
* 事件处理方法 重写事件接口的抽象方法
*/
public void actionPerformed(ActionEvent arg0) {
path = jco1.getSelectedItem().toString();
//判断要统计的磁盘,再启动线程
if (path.equals("C:\\")) {
FileCount fc=new FileCount("C:\\",ja,jte,jco2);
fc.start();//启动线程
} else if(path.equals("D:\\")){
FileCount fc=new FileCount("D:\\",ja,jte,jco2);
fc.start();//启动线程
}else{
FileCount fc=new FileCount("E:\\",ja,jte,jco2);
fc.start();//启动线程
}
}
}
线程
public class FileCount extends Thread{
private JTextArea ja;
private JTextField jte;
private String rootDirName,pwd,path;//本文件所操作的根目录的名称
private JComboBox jco2;
/**
* 统计一个磁盘文件数量的线程类
*/
public FileCount(String root,JTextArea ja, JTextField jte,JComboBox jco2){
this.rootDirName=root;
this.ja=ja;
this.jte=jte;
this.jco2=jco2;
}
//线程执行入口:调用线程对象Start()方法后,线程就从他的run方法开始独立执行
public void run(){
int fileCount=countDir(this.rootDirName);
ja.append(this.rootDirName+"统计完毕:"
+";公用文件数量:"+fileCount);

}
/**
* 计算一个文件下面所有文件的长度
* @param dir:要计算的目录的名字
* @return: 文件的总长度
*/
private int countDir(String dir){
pwd = jte.getText();
path = jco2.getSelectedItem().toString();
int count=0;//文件长度变量
File dirFile=new File(dir);
if(!dirFile.exists())//如果用户输入的目录不存在
{return count;}
File[] subFile=dirFile.listFiles();
if(subFile==null)//如果列表子文件不存在
{ return  count;}
for(int i=0;i<subFile.length;i++){
String fileName=subFile[i].getAbsolutePath();
if(subFile[i].isDirectory()){
//递归计算目录下文件长度
count+=countDir(subFile[i].getAbsolutePath());
}
if(pwd.equals("")){
   if(subFile[i].isFile()){
if(fileName.endsWith(path)){
  count++;
ja.append("文件:"+fileName+"\n");
}
}
}
else if(fileName.contains(pwd)){
ja.append("文件:"+fileName+"\n");
count++;
}
}
return count;
}
}
效果图:

你可能感兴趣的:(文件操作与异常机制)