File类输入输出流的重要用法及文件搜索器的简易实现

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;
	}
}
最后是运行后结果:


以上这些就是这次的内容,在下篇博客中我还会接着介绍输入输出的有关知识~~~~~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值