1.文件系统基本规则的要点
(1)相对目录指不以路径分隔符开头的文件路径,绝对目录是指以根目录开头的路径;当前目录指相对于程序运行时的目录算起的相对路径
(2)目录分隔符和路径分隔符在linux和win平台上不同,前者为“/”和“:”,后者为“\”和“;”,因此不要硬编码到程序中,而应使用File类提供的相应属性值
2.构造器
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 |
3.重要方法
int |
compareTo(File pathname) 按字母顺序比较两个抽象路径名。 |
boolean |
delete() 删除此抽象路径名表示的文件或目录。 |
boolean |
String |
getPath() 将此抽象路径名转换为一个路径名字符串。 |
String |
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
4.练习:实现全盘遍历,按文件名查找,按文件类型查找
//查找的监听器类
package filetongji; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComboBox; import javax.swing.JTextArea; import javax.swing.JTextField; public class SearchListener implements ActionListener{ private JComboBox jco1,jco2; private JTextField jte; private JTextArea ja; private String name, pwd,path,path2; //重写一个构造方法 public SearchListener(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(); pwd = jte.getText(); path2 = jco2.getSelectedItem().toString(); if (path.equals("C:\\")) { CountFileThread fc=new CountFileThread("C:\\",ja,path2,pwd); fc.start();//启动线程 } else if(path.equals("E:\\")){ CountFileThread fc=new CountFileThread("E:\\",ja,path2,pwd); fc.start();//启动线程 }else if(path.equals("F:\\")){ CountFileThread fc=new CountFileThread("F:\\",ja,path2,pwd); fc.start();//启动线程 } } }
// 统计文件数量跟打印文件路径的独立线程
package filetongji; import java.io.File; import javax.swing.JTextArea; public class CountFileThread extends Thread{ private JTextArea jte; private String path2; private String pwd; /** * 统计一个磁盘文件数量的线程类 */ public CountFileThread(String root,JTextArea jte,String path2,String pwd){ this.rootDirName=root; this.jte=jte; this.path2 = path2; this.pwd = pwd; } //线程执行入口:调用线程对象Start()方法后,线程就从他的run方法开始独立执行 public void run(){ long start=System.currentTimeMillis(); int fileCount=countDir(this.rootDirName); long timeCost=System.currentTimeMillis()-start; String temp=jte.getText(); jte.setText(temp+"-------驱动器:"+this.rootDirName+"统计完毕:" +";所需要寻找的文件数量:"+fileCount+";用时(单位:秒):"+timeCost/1000+"\n"); } /** * 计算一个文件下面所有文件的长度 * @param dir:要计算的目录的名字 * @return: 文件的总长度 */ private int countDir(String dir){ 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(""))//这里千万不能在()里面写null!因为pwd的指向是地址!!这样是判断他的地址是否为空! { if(subFile[i].isFile()){ //如果选定所有类型,则在TextArea上打印所有 if(path2.equals("all")) {jte.append("文件:"+fileName+"\n"); count++; } //如果选定某一种类型,则打印后缀名相同的文件 else if(fileName.endsWith(path2)) {jte.append("文件:"+fileName+"\n"); count++; } } } //如果指定了文件名,则打印后缀名与文件名相同的文件路径 else if(fileName.endsWith(pwd)) {jte.append("文件:"+fileName+"\n"); count++; } } return count; } private String rootDirName;/**本文件所操作的根目录的名称*/ }
//主函数
package filetongji; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class Filemanage extends JFrame{ public static void main(String args[]){ Filemanage st=new Filemanage(); st.init(); } private void init() { this.setTitle("查找文件"); this.setDefaultCloseOperation(3); this.setSize(600,550); this.setLocation(200,100); add(); this.setVisible(true); } //给窗体加入组件 public void add(){ JLabel[] jl=new JLabel[3]; jl[0]=new JLabel("路程"); jl[1]=new JLabel("文件名"); jl[2]=new JLabel("扩展名"); String[] q1=new String[4]; String[] q2=new String[5]; q1[0]=new String("C:\\"); q1[1]=new String("E:\\"); q1[2]=new String("F:\\"); q1[3]=new String(" "); q2[0]=new String("all"); q2[1]=new String(".txt"); q2[2]=new String(".exe"); q2[3]=new String(".doc"); q2[4]=new String(".rar"); //这是一个很强大的东东大事没有半毛钱用。。。 JFileChooser jfc1=new JFileChooser(); // JFileChooser jfc2=new JFileChooser(); JComboBox jfc1=new JComboBox(q1); JComboBox jfc2=new JComboBox(q2); JTextField jt=new JTextField(6); JPanel jp=new JPanel(); JButton jb=new JButton("查找"); jp.add(jl[0]); jp.add(jfc1); jp.add(jl[1]); jp.add(jt); jp.add(jl[2]); jp.add(jfc2); jp.add(jb); this.add(jp,BorderLayout.NORTH); JTextArea jte=new JTextArea(23,80); JScrollPane jp1 = new JScrollPane(jte); this.add(jp1,BorderLayout.CENTER); //创建监听器,传入数据 SearchListener se=new SearchListener(jfc1,jfc2,jt,jte); jb.addActionListener(se); } }
5.写文件的一点感受
第一,又一次见到了递归的强大!!有木有!!
第二,如何去取得一个文件的路径,file.getAbsolutePath()
第三,带滚动条的面板JScrollPane!!简直是神器!!直接解决了我前期构想,想要添加一个面板,面板上放TextArea,再放两个滚动条,再放监听器各种神马的一系列麻烦的事情。。。
第四,如何在TextArea上显示所有的文件路径,jte.append("文件:"+fileName+"\n"),而不是setText(),这样每一条路径就会依次覆盖
第五,如何找到指定文件类型的文件,String类中又有一个神器级别的方法fileName.endsWith(string),又一次避免了我麻烦的想法~~
这些神器的存在,提醒我要多多翻看利用API,API是如此的强大!!要啥有啥!!
还有一点是,不要闭门造车,不知道有带滚动条的面板深深的伤害了我~~导致我研究了很久,应该要多多与大神交流的- -还有那个取后缀的,也是在百般捉摸无果的情况下,吸取前面的教训,求助了队友~~
好哒,今天完成了很多任务,姐姐我很是开心~~O(∩_∩)O哈哈~
现在是晒运行结果时间~~~
相关推荐
ASP.NET Core微服务(一)——【完整API搭建及访问过程】——sql脚本
Android中文翻译组——Android中文API合集(4).chm
IOS应用源码——twitter开放api实例大全.zip
Oracle工作总结——日志文件切换频率的调整.doc
loadrunner——API手册
体系文件(学习总结——各个层次及各单位的使用表单).pdf
Windows文件解析——CWINDOWSsystem32driversetchosts
工会工作个人总结——范本..doc
秘书处工作总结——范本..doc
煤矿工会年终总结——范文..doc
工会评议工作总结——范文..doc
医院信访工作总结——范文..doc
公司工会年终总结——范文..doc
企业工会活动总结——范本..doc
企业工会年度总结——范本..doc
年终总结——2011年XXX支行.doc
银行柜员工作总结——【范文】..doc
酒店消防检查工作总结——范本..doc
煤矿企业工会工作总结——范文..doc
教师思想政治方面总结——范本..doc