最近学习了java中关于文件的一些处理方法,比如新建文件 ,查找文件
,自定义文件格式等等......
一般我们把文件分为两大类:文本文件和流文件。文本文件是指文件后
缀名为.txt和.java的文件,其存储字节为16位;流文件是指图片、音乐、视频
等文件,其存储字节用8位。
关于文件搜索器,首先根据要搜索的文件名和盘符在当前盘符查找
,如果没有找到与输入的文件名一样的文件就进入下一级目录,递归调用查找文
件的方法。在查找文件的时候会用到的方法有:
exists():测试此抽象路径名表示的文件或目录是否存在。
listFiles(): 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的
目录中的文件。
isDirectory(): 测试此抽象路径名表示的文件是否是一个目录。
isFile():测试此抽象路径名表示的文件是否是一个标准文件。
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
下面是文件搜索器的代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.io.File;
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;
public class MyFileFrame extends JFrame{
//程序入口
public static void main(String[] args){
MyFileFrame ff=new MyFileFrame();
ff.shoWUI();
}
//显示界面的方法
private void shoWUI() {
// 设置界面属性
this.setSize(new Dimension(580,500));
this.setBackground(java.awt.Color.GRAY);
this.setTitle("文件搜索器");
this.setLayout(new FlowLayout());
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
//创建一个文本标签
JLabel label=new JLabel("请输入需要查找的文件或文件夹名:");
//创建一个文本区域
JTextField filed=new JTextField(15);
//创建一个文本标签
JLabel label2=new JLabel("查找的范围为:");
//得到一个数组
String[] array=getroot();
//新建一个CombBox
JComboBox com=new JComboBox(array);
//添加按钮
JButton start=new JButton("开始搜索");
JButton stop=new JButton("停止搜索");
//创建一个textarea并初始化行和列
JTextArea ta=new JTextArea(21,50);
//创建一个面板
JScrollPane pan=new JScrollPane(ta);
pan.setSize(300, 300);
this.add(label);
this.add(filed);
this.add(label2);
this.add(com);
this.add(start);
this.add(stop);
this.add(pan);
this.setVisible(true);
//创建时间处理类的对象
FileListener fl=new FileListener(filed,ta,com);
start.addActionListener(fl);
stop.addActionListener(fl);
}
/**
* 获取所有的根目录
*/
public String [] getroot(){
//使用文件对象,得到当前系统下所有的根目录
File [] list = File.listRoots();
//创建一个String数组,长度是从File数组中获取的
String [] array = new String [list.length];
//循环输出
for(int i=0;i<list.length;i++){
//得到目录路径
String path = list[i].getAbsolutePath();
//将路径存入到数组中
array[i] = path;
System.out.println("目录:"+list[i]);
}
return array;
}
}
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.io.File;
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;
public class MyFileFrame extends JFrame{
//程序入口
public static void main(String[] args){
MyFileFrame ff=new MyFileFrame();
ff.shoWUI();
}
//显示界面的方法
private void shoWUI() {
// 设置界面属性
this.setSize(new Dimension(580,500));
this.setBackground(java.awt.Color.GRAY);
this.setTitle("文件搜索器");
this.setLayout(new FlowLayout());
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
//创建一个文本标签
JLabel label=new JLabel("请输入需要查找的文件或文件夹名:");
//创建一个文本区域
JTextField filed=new JTextField(15);
//创建一个文本标签
JLabel label2=new JLabel("查找的范围为:");
//得到一个数组
String[] array=getroot();
//新建一个CombBox
JComboBox com=new JComboBox(array);
//添加按钮
JButton start=new JButton("开始搜索");
JButton stop=new JButton("停止搜索");
//创建一个textarea并初始化行和列
JTextArea ta=new JTextArea(21,50);
//创建一个面板
JScrollPane pan=new JScrollPane(ta);
pan.setSize(300, 300);
this.add(label);
this.add(filed);
this.add(label2);
this.add(com);
this.add(start);
this.add(stop);
this.add(pan);
this.setVisible(true);
//创建时间处理类的对象
FileListener fl=new FileListener(filed,ta,com);
start.addActionListener(fl);
stop.addActionListener(fl);
}
/**
* 获取所有的根目录
*/
public String [] getroot(){
//使用文件对象,得到当前系统下所有的根目录
File [] list = File.listRoots();
//创建一个String数组,长度是从File数组中获取的
String [] array = new String [list.length];
//循环输出
for(int i=0;i<list.length;i++){
//得到目录路径
String path = list[i].getAbsolutePath();
//将路径存入到数组中
array[i] = path;
System.out.println("目录:"+list[i]);
}
return array;
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.swing.JComboBox;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class FileListener implements ActionListener {
//定义一个命令属性
private String command;
//定义一个计数器
private int filecount=0;
private JTextField filed;
private JComboBox com;
private JTextArea ta;
//在构造器里面初始化属性
public FileListener(JTextField filed,JTextArea ta,JComboBox com){
this.filed=filed;
this.ta=ta;
this.com=com;
}
//鼠标点击的事件处理
public void actionPerformed(ActionEvent e) {
// 得到点击的命令
command=e.getActionCommand();
//判断命令
if(command.equals("开始搜索")){
System.out.println("*********************************");
//得到搜索的盘符
String pathName=(String) com.getSelectedItem();
//调用文件搜索的方法
int count = 0;
try {
count = FileCheck(pathName);
} catch (Exception e1) {
e1.printStackTrace();
}
//查找结果
ta.append("总共查找文件数:"+count+"\t查找到的文件数:"+this.filecount);
}
}
/**
* 文件搜索的方法
* @return 搜索次数
* @throws Exception
*/
private int FileCheck(String pathName) throws Exception {
// 定义一个计数器
int count = 0;
//得到需要查找的文件或目录名
String fileName=filed.getText();
//创建一个File对象
File file=new File(pathName);
//判断文件是否存在
if(file.exists()){
//返回file下一级的所有目录和文件
File[] listFile = file.listFiles();
// 判断是否还有文件或者文件目录
if (null == listFile || listFile.length == 0) {
return 0;
}
for(int i=0;i<listFile.length;i++){
//如果是目录
if(listFile[i].isDirectory()){
//得到每一个目录的路径和目录名
String pathname=listFile[i].getAbsolutePath();
String temname=listFile[i].getName();
//判断是否相等
if(temname.equals(fileName)){
ta.append("找到文件夹:"+temname+"\n"+"文件路径:"+pathname+"\n");
this.filecount++;
}
// 进行递归调用
count += FileCheck(pathname);
}
//如果是文件
if(listFile[i].isFile()){
//得到文件名
String filename=listFile[i].getName();
//判断是否相等
count++;
if(filename.equals(fileName)){
ta.append("找到文件:"+filename+"\n"+"文件路径:"+listFile[i].getAbsolutePath()+"\n");
String pathname=listFile[i].getAbsolutePath();
//调用显示文件的方法
String result = inputFileOne(pathname);
//输出文件的内容
ta.append(result);
this.filecount++;
}
}
}
}else{
javax.swing.JOptionPane.showMessageDialog(null,"文件不存在");
}
return count;
}
private String inputFileOne(String pathname) throws Exception {
//创建一个InputStream的对象
InputStream is = new FileInputStream(pathname);
//新建一个缓冲流输入对象
BufferedInputStream bis=new BufferedInputStream(is);
//得到文件的长度
int length = is.available();
//创建一个byte数组
byte [] content = new byte[length];
//定义一个变量,用来保存读取出来的字节数据
int i = 0;
//读取文件
bis.read(content);
//把文件输入流对象给关闭
is.close();
bis.close();
//将byte数组转换为字符串
String str = new String(content);
return str;
}
}