File对象的简单应用 File文件扫描文件大小文件路径
先看看做出来的效果:
其实实现起来并不困难,也是一个很简单的扫描器。能实现的功能:扫描给定的路径下文件数目、文件夹数目、并显示扫描到的文件名称和路径。 待实现的功能:双击扫描到的文件名能打开该文件或者打开该文件所在目录。
主要用到的就是File类。File类主要是文件和目录路径名的抽象表示形式,用来构造它的一般是用文件路径或者文件对象。我们经常用的构造函数:File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File
实例。对于这种函数很多的类就要对照API来看了。
第一步:先得把界面写好,界面就是如上图,用到的组件:JLabel JTextField JButton List 为了后续的拓展功能所以将扫描到的文件用List来装。这是我的界面的代码:
package 文件操作; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import java.awt.List; import java.awt.TextArea; import java.awt.FlowLayout; import java.awt.TextField; public class testUI extends JFrame{ public String no1;//标准文件的数量 public String no2;//文件夹的数量 public String no3;//目录下总大小 public String no4;//异常显示 public static void main(String[] args) { testUI t1=new testUI(); t1.InitUI( ); } /** * 初始化UI * */ public void InitUI() { this.setTitle("文件夹属性查看"); this.setSize(600,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocation(400, 100); //FlowLayout fly=new FlowLayout(); //this.setLayout(fly); JPanel jf=new JPanel(); this.add(jf); jf.setLayout(null); //异常显示 JLabel JLB7=new JLabel(no3); JLB7.setBounds(200, 10, 100, 20); jf.add(JLB7); // JLabel JLB1=new JLabel("文件夹的路径:"); JLB1.setBounds(30, 30,100 , 30); jf.add(JLB1); //输入框 JTextField JTF=new JTextField(30); JTF.setBounds(130, 30, 300, 30); jf.add(JTF); //按钮 JButton JBT=new JButton("确定"); JBT.setBounds(450, 30, 100, 30); jf.add(JBT); // JLabel JLB2=new JLabel("标准文件数:"); JLB2.setBounds(30, 100, 100, 30); jf.add(JLB2); //显示标准文件个数 JLabel JLB3=new JLabel(no1); JLB3.setBounds(130, 100, 100, 30); jf.add(JLB3); // JLabel JLB4=new JLabel("文件夹的数目:"); JLB4.setBounds(30, 130, 100, 30); jf.add(JLB4); //显示文件夹的个数 JLabel JLB6=new JLabel(no2); JLB6.setBounds(150,130, 100, 30); jf.add(JLB6); // JLabel JLB5=new JLabel("目录内总大小:"); JLB5.setBounds(30, 160, 100, 30); jf.add(JLB5); //显示文件总大小 JLabel JLB8=new JLabel(no3); JLB8.setBounds(150, 160, 150, 30); jf.add(JLB8); //用来显示扫描到的文件的路径 List lt=new List (); lt.setBounds(30, 200, 500, 250); jf.add(lt); DoFile d1=new DoFile(); //给按钮安装监听器 MyListener my=new MyListener(JTF,d1,JLB3,JLB6,JLB8,JLB7,lt); JBT.addActionListener(my); this.setVisible(true); } }
第二步:写监听器 在给按钮写监听器的时候想想这个监听器要操作哪些对象,那么就需要利用监听器的构造函数来把这些对象传给监听器类,当然也可以在界面类直接用匿名内部类来写监听器,这样的话就不需要构造函数来传值了。
在按下按钮的时候需要做的事情:
1----把输入框中输入的路径读出来 用到:JTextFile 类的getText() 函数
2----以该路径创建File的对象 用到:File的构造函数
3----扫描该路径下的文件、文件夹 用到:File的listFiles()函数、getAbsolutePath()函数 递归调用
4---将数据显示到指定位置 用到:JTextFile 类的setText()函数、List类的setTex()t函数
本例中我将文件的操作写成了一个类,其实写在监听器中应该会好些,传值就不会那么麻烦了。
文件操作类的代码:
package 文件操作; import java.awt.Color; import java.awt.List; import java.awt.TextArea; import java.io.File; import javax.swing.JLabel; import javax.swing.JTextArea; public class DoFile { int count1=0; int count2=0; long count3=0; List JT; JLabel JLB; /** * 统计文件数目的函数 * @param path 文件的路径 * @return 标准文件的数量 */ public int FileUity(String path,List jt,JLabel jlb) { File file1=new File(path); JT=jt; JLB=jlb; if(!file1.exists()) { jlb.setBackground(Color.red); jlb.setText("该文件目录不存在"); //System.out.println("该文件目录不存在"); return 0; } if(!file1.isDirectory()) { jlb.setText("这不是一个目录"); //System.out.println("这不是一个目录"); return 0; } File[] fs=file1.listFiles(); for(File f:fs) { if(f.isFile()) { count1++; JT.add("找到一个文件:"+f.getAbsolutePath()+"\n"); //System.out.println("找到一个文件"+f.getAbsolutePath()); } else if(f.isDirectory()) { FileUity(f.getAbsolutePath(),this.JT,this.JLB); count1=count1++; } else{ } } return count1; } /** * 统计文件夹的数量 * @param path 文件目录 * @return 文件夹的个数 */ public int folderUinty(String path,List jt,JLabel jlb) { File file2=new File(path); if(!file2.exists()) { jlb.setText("该文件目录不存在"); //System.out.println("该文件目录不存在"); return 0; } if(!file2.isDirectory()) { jlb.setText("这不是一个目录"); //System.out.println("这不是一个目录"); return 0; } File[] fl=file2.listFiles(); for(File file : fl) { if(file.isDirectory()) { JT.add("找到一个文件夹:"+file.getAbsolutePath()+"\n"); //System.out.println("找到一个文件夹"); count2++; String ff=file.getAbsolutePath(); folderUinty(ff,this.JT,this.JLB); count2=count2++; } else { } } return count2; } /** * 统计该文件目录下的总大小 * @param path 路径 * @return 总大小 */ public long getSize(String path,JLabel jlb) { File file3=new File(path); if(!file3.exists()) { jlb.setText("该文件目录不存在"); //System.out.println("该文件目录不存在"); return 0; } if(!file3.isDirectory()) { jlb.setText("这不是一个目录"); //System.out.println("这不是一个目录"); return 0; } File[] ff=file3.listFiles(); for(File f : ff) { if(f.isFile()) { long t=f.length(); count3=t+count3; } else if(f.isDirectory()) { getSize(f.getAbsolutePath(),this.JLB); } } return count3; } }
监听器类的代码:
package 文件操作; import java.awt.List; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyListener implements ActionListener{ public JTextField JTF; public DoFile DF; public JLabel JL1;//显示标准文件的数目 public JLabel JL2;//显示文件夹的数目 public JLabel JL3;//总文件的大小 public JLabel JL4;//异常显示 public Integer no1;//标准文件的数目 public Integer no2;//文件夹的数目 public Long no3;//总文件的大小 public List LT; /** * 监听器的构造函数 * @param JT 输入框的对象 */ public MyListener(JTextField JT,DoFile df,JLabel jl1,JLabel jl2,JLabel jl3,JLabel jl4,List lt) { this.JTF=JT; this.DF=df; this.JL1=jl1; this.JL2=jl2; this.JL3=jl3; this.JL4=jl4; this.LT=lt; } @Override public void actionPerformed(ActionEvent arg0) { //开始前清除原来数据 this.JL1.setText(""); this.JL2.setText(""); this.JL3.setText(""); this.JL4.setText(""); this.LT.clear(); //复位数据 DF.count1=0; DF.count2=0; DF.count3=0; //从输入框得到路径 String path=JTF.getText(); no1=DF.FileUity(path,LT,JL4); String count1=no1.toString(); JL1.setText(count1+" "+"个文件"); no2=DF.folderUinty(path,LT,JL4); String count2=no2.toString(); JL2.setText(count2+" "+"个文件夹"); no3=DF.getSize(path,JL4); String count3=no3.toString(); JL3.setText(count3+" "+"字节"); } }
本例没有实现的功能:双击扫描到的文件项可以打开该文件所在目录,后续将继续完善!
运行效果:
下一篇: 糕点水果摆盘的科普大全,还不来学学吗