java.io包也是Java内置的包,其中包含一系列对文件和目录的属性进行操作,对文件进行读写操作的类。
而其中对于文件的操作则置于file类中,file类的对象不但可以表示文件,也可以表示目录,在程序中一个file类的对象可以代表一个文件或目录。file类构造方法有四个:
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 实例。
boolean exists() | 判断文件是否存在,存在返回true,否则返回false |
booleanisFile() | 判断是否为文件,是文件返回true,否则返回false |
booleanisDirectory() | 判断是否为目录,是目录返回true,否则返回false |
String getName() | 获得文件的名称 |
String getAbsolutePath() | 获得文件的绝对路径 |
long length() | 获得文件的长度(字节数) |
booleancreateNewFile() throws IOException | 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 |
boolean delete() | 删除文件,删除成功返回true,否则返回false |
File[] listFiles() | 返回文件夹内的子文件与子文件夹的数组 |
文件中的流是指一连串流动的数据信号,是以先进先出的方式发送和接收数据的通道。
流分为输入流与输出流,对于输入与输出流,又因为其传输格式的不同,分为字节流与字符流。
输入流:FileInputStream类 继承于InputStream类
构 造 方 法 | 说 明 |
FileInputStream(File file) throws FileNotFoundException | 使用File对象创建文件输入流对象,如果文件打开失败,将抛出异常 |
FileInputStream(String name) throws FileNotFoundException | 使用文件名或路径创建文件输入流对象,如果文件打开失败,将抛出异常 |
方 法 原 型 | 说 明 |
int read() throws IOException | 读取文件中的数据,一次读取一个字节,读取的数据作为返回值返回,如果读到文件末尾则返回-1,有可能抛异常,必须捕捉 |
int read(byte[] b) throws IOException | 读取文件中的数据,将读到的数据存放到byte型数组中,并返回读取的字节的数量,未读到数据返回-1,有可能抛异常,必须捕捉 |
void close() throws IOException | 关闭流对象,有可能抛异常,必须捕捉 |
输出流:FileOutputStream类 继承于OutputStream类
构 造 方 法 | 说 明 |
FileOutputStream(File file) throws FileNotFoundException | 使用File对象创建文件输出流对象,如果文件打开失败,将抛出异常 |
FileOutputStream(File file, boolean append) throws FileNotFoundException | 使用File对象创建文件输出流对象,并由参数append指定是否追加文件内容,true为追加,false为不追加,异常情况同上 |
FileOutputStream(String name) throws FileNotFoundException | 直接使用文件名或路径创建文件输出流对象,异常情况同上 |
FileOutputStream(String name, boolean append) throws FileNotFoundException | 直接使用文件名或路径创建文件输出流对象,并由参数append指定是否追加,异常情况同上 |
方 法 原 型 | 说 明 |
void write(int b) throws IOException | 往文件中写数据,一次写一个字节,有可能抛异常,必须捕捉 |
void write(byte[] b) throws IOException | 往文件中写数据,将byte数组中的数据全部写入到文件中,有可能抛异常,必须捕捉 |
void close() throws IOException | 关闭流对象,有可能抛异常,必须捕捉 |
FileOutputStream类 和 FileInputStream类 总是要成对出现,一个进行输入(读文件)操作,一个进行输出(写文件)操作。
通过上面的介绍的类与方法,下面将展示一个windows文件搜索器的实例,至于输入输出流的效率问题还有字符流将在下篇博客中介绍。下面是我做的一个简易的文件搜索器。
最上面的一行是两个文本输入框和按钮,两个文本输入框分别传入搜索路径和关键字,当点击“开始搜索”按钮时,系统在给定的搜索路径下检索文件,并且匹配关键字,当匹配成功时在下面的文本输入框中输出。以下是分模块代码:
//这是绘制整个界面的方法
public void showUI() {
this.setTitle("文件搜索器");
this.setSize(560, 600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setBackground(Color.LIGHT_GRAY);
//不使用任何布局,自己定义位置
this.setLayout(null);
button_find = new JButton("开始搜索");
text_path = new JTextField();
text_key = new JTextField();
text_show = new JTextArea();
JScrollPane js = new JScrollPane(text_show);
text_path.setSize(150, 20);
this.add(text_path);
this.add(text_key);
this.add(button_find);
this.add(js);
text_path.setBounds(10, 10, 150, 25);
text_key.setBounds(180, 10, 150, 25);
button_find.setBounds(350, 10, 150, 25);
js.setBounds(10, 50, 500, 500);
this.setVisible(true);
// 为按钮添加动作监听
button_find.addActionListener(find_listener);
}
以下是动作监听的方法:
ActionListener find_listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String path = text_path.getText();
String key = text_key.getText();
text_show.setText("");
showDir(path, key);
}
};
下面是最重要的文件检索的方法
public void showDir(String path, String key) {
File file = new File(path);
if (file.exists()) {//文件是否存在
if (file.isFile())// 是文件
{
//匹配成功则在文本输出区域叠加输出
if (KMP_Index(file.getName(), key) == 1)
text_show.append("文件名为:" + file.getName() + "\n" + "路径是:" + file.getAbsolutePath() +"\n");
} else if (file.isDirectory())// 是文件夹
{
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File f = files[i];
showDir(f.getAbsolutePath(), key);//递归
}
}
}
}
通过判断是否是文件还是文件夹,来决定输出还是继续递归。
至于关键字匹配的方法,JAVA的类中只有方法可以直接调用的,但我自己还是写了一个KMP算法,至于KMP算法的详细说明我这里就不做过多解释了。
/**
* 获得字符串的next函数值
*
* @param t
* @return next函数值
*/
public static int[] next(char[] t) {
int[] next = new int[t.length];
next[0] = -1;
int i = 0;
int j = -1;
while (i < t.length - 1) {
if (j == -1 || t[i] == t[j]) {
i++;
j++;
if (t[i] != t[j]) {
next[i] = j;
} else {
next[i] = next[j];
}
} else {
j = next[j];
}
}
return next;
}
/**
* KMP匹配字符串
*
* @param s
* 主串
* @param t
* 模式串
* @return 若匹配成功,返回下标,否则返回-1
*/
public static int KMP_Index(String a, String b) {
char[] s = a.toCharArray();
char[] t = b.toCharArray();
int[] next = next(t);
int i = 0;
int j = 0;
while (i <= s.length - 1 && j <= t.length - 1) {
if (j == -1 || s[i] == t[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j < t.length) {
return -1;
} else
return 1;
}
}
最后是运行后结果:
以上这些就是这次的内容,在下篇博客中我还会接着介绍输入输出的有关知识~~~~~