学习了IO之后,对IO也有了一定的理解。用所学的知识我写了一个简单的文件搜索器,还写了简单的文件复制和粘贴的功能。接下来我将简单讲一下IO的基本概念和它的基本类还有这些类的常用方法。
首先先了解一下IO流,IO流即输入输出流,它属于Java.io包,其中包含一系列对文件和目录的属性进行操作,对文件进行读写的类。下面来了解几个概念。
1、文件:可以将其认为是相关记录或存放在一起的数据的集合,文件一般存放在磁盘上,如硬盘,光盘等。文件可以用File类声明表示。
File类的对象不但可以表示文件,还可以表示目录,当创建一个文件对象后,可以直接利用它来对文件或目录的属性进行操作。
其构造方法是:File(String pathName)。但要注意:File对象只能查看文件的属性,并不能直接对文件进行读/写操作。
2、stream(流):是指一连串流动的数据信号,是以先进先出的方式发送和接收数据的通道。流根据流动方向的不同分为输入流和输出流,由于传输格式的不同,又将输入流和输出流分为字节流和字符流。
字节流:是指8位的通用字节流,以字节为基本单位,在Java.io包中,对于字节流进行操作的类大部分继承于InputStream类和OutputStream类。
字符流:是指16位的字符流。以字符为基本单位,对其进行操作的类大部分继承于Reader类和Writer类。
下面介绍对文件进行读写操作的两个类FileInputStream(将文件中的数据写入到内存中)和FileOutputStream(将内存中的文件输出到文件中)
FileInputStream类的构造函数为:1.FileInputStream(File file)
2.FileInputStream(String name)
常用方法如下(有可能抛出异常,必须捕捉):
int read():读取文件中的数据,一次读取一个字节,读取的数据作为返回值返回,如果读到文件末尾则返回-1 。
int read(byte [ ] b):将读到的数据存放到byte型数组中,并返回读取的字节的数量,未读到数据返回-1
void close():关闭流对象
FileOutputStream类与FileInputStream类似,只是将Read()方法改为Write()方法。FileInputStream类与FileOutputStream类是成对出现的,一个进行输入(读文件)操作,一个进行输出(写文件)操作,可以使用这两个类完成复制文件的操作。具体操作如下:
packagecom.huaxin.Stream;
/*
* 文件的复制粘贴操作
*/
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
public classFileOperation {
public static void main(String[] args){
FileOperation fo=new FileOperation();
//获取系统当前的时间
longstart=System.currentTimeMillis();
//文件的复制粘贴
fo.copyPaste("IO流.ppt", "C:\\Users\\陆超月\\Desktop\\IO流.ppt");
//获取系统当前的时间
long end=System.currentTimeMillis();
//输出计算系统复制该文件所需的时间
System.out.println("所花时间:"+(end-start));
}
//文件的复制粘贴方法
public void copyPaste(StringsrcFileName,String desFileName){
try{
//创建文件对象
File file=new File(srcFileName);
//创建文件输入流对象
FileInputStream fis=newFileInputStream(file);
//创建输出流对象
FileOutputStream fos=newFileOutputStream(desFileName);
//创建字节数组,用来保存每次读取的字节
byte[] datas=new byte[8192];
//读取文件内容
//方法一
// int i=fis.read();
// while(i!=-1){
// //将读取到的内容写出到目标文件夹里
// fos.write(i);
// //继续读写内容
// i=fis.read();
// }
//方法二
// int i=fis.read(datas);//读取到的有效字节数量
// while(i!=-1){
// fos.write(datas);//这样写出来的文件比原文件大(问题出在最后一次读取)
// i=fis.read(datas);
// }
//方法三
int i=fis.read(datas);
while(i!=-1){
fos.write(datas, 0, i);//写出来的文件大小和原文件相同
i=fis.read(datas);
}
//关闭流
fis.close();
fos.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
在上面的文件复制粘贴的代码中,我使用了三种方法来读取文件,第一种方法就是刚开始介绍的单个字节读取的方法,这种方法需要将数据一个一个的从磁盘中读取出来然后放入内存中,这种方法很浪费时间,对于小文件来说没什么影响,但是对于大文件来说效率就非常低,所以我们采用了第二种方法,以数组为单位进行读取,这样就大大加快了读取文件的速度,节省了很多时间,但是以这种方法复制出的文件很多时候文件的大小比原始文件大,因为最后一次读取的时候有可能读不满,在进行写操作的时候未读满的长度的空间就由前一次读取的内容来填满,所以导致写的时候多写了内容,故造成文件增大,于是我就用第三种方法(fos.write(datas, 0, i))来解决,其中datas代表的是我申明用来装读取内容的数组,0表示从数组的第一个元素开始写,i代表的是读取到的有效数据的数量,通过这种方法可以保证不多写入数据,保证了文件的大小与原始文件相同。
由于文件搜索器的代码比较多,所以我讲一下主要的思路就可以了。首先先写一个文件搜索器的界面,在文件搜索器中主要就是用到了File里面的常用方法:
创建文件对象File file=new File();
判断文件是否存在File.exists()
判断是否为文件:file.isFile()
判断是否为目录:file.isDirectory()
获取文件的绝对路径:file.getAbsolutePath()
然后再定义一个方法遍历文件即可。
使用上述的几个方法就可以实现文件的搜索功能。下图是最终的效果:
输入关键字后: