在Java中有关文件的操作一直是重要的内容,总结一些这些天有关IO流的知识,首先是file类的内容,file类的对象在我看来就是把指定路径的文件用file对象关联起来,构造方法是File file = new Flie(String path),path可以是绝对路径也可以是相对路径,但只是关联起来,并不能对其进行读写操作,读写操作要建立输入输出流对象进行操作,关联起来之后我们便可以对关联文件的属性进行操作,比如获取此关联文件的长度file.length();获取此文件最后一次被修改的时间,或者判断此对象关联的是一个文件还是一个目录,这些都有固定的方法,要知道这些方法以便在用的时候能立刻想到,下面是用有关File类的内容实现的一个文件搜索器:
public void countfile(String path){
File file = new File(path);
if(!file.exists()){
//System.out.println("文件路径有误!!!");
show_area.append("文件路径有误!!!"+"\r\n");
k = 0;
}
else if(file.isFile()){
k = 1;
file_count++;
show_area.append(file.getName()+"\r\n");
}else if (file.isDirectory()){
k = 1;
files_count++;
File[] files = file.listFiles();
for(File f:files){
countfile(f.getAbsolutePath());
}
}
}
public void keyquery(String key){
File file = new File("D:\\学习资料\\概率论");
if(key!=null){
File[] files = file.listFiles();
for(int i=0;i<files.length;i++){
String filename = files[i].getName();
if(filename.contains(key))
show_area.append(filename+" "+files[i].getAbsolutePath()+"\r\n");
}
}
}
这是根据路径搜索文件和根据关键字搜索路径的主要代码,实现之后的界面如下所示: 这是主界面,能够实现最基本的搜索功能,但是效率很低。
然后就是流的内容,主要包括输入流和输出流,根据输入输出的方式不同,也可以分为字节流和字符流,对字节流进行操作的大部分类主要继承于InputStream和OutputStream,在这里主要是文件输入流和文件输出流,即FileInputStream和FileoutputStream,这些事进行文件读写最基本的类,对于FileInputStream,他的作用是将文件中的数据输入到内存中去,我们可以利用它来读文件,由于他属于字节流,因此在读取中文时候可能会出现问题,FileInputStream的构造方法带有一个参数,可以是File类的对象,也可以是文件的路径,写到这里想强调一点,就是文件的读或者写一定要伴随着关闭的操作,就想打开水龙头要记得关掉一样,还有一点就是这些文件的操作可能会出现异常,所以这些异常必须要捕获,对应的有FileOutputStream,构造方法和前者相同,他的作用是将内存中的数据输入到文件中,我们可以利用它来写文件,在这里需要注意的是文件输出流的构造方法有参数可以设置是否追加内容,在第二个参数用布尔类型的变量设置是否可以追加,默认是不可以追加,其实布尔类型的变量默认值都为False,FileOutputStream类的方法有write方法,一次可以写一个字节,也可以写一个byte型数组,这两个文件输入流和文件输出流是成对出现的,利用他们可以进行文件的复制操作,相关代码如下:
public class File {
public void filecopy(String srcpath,String mudipath){
FileInputStream in =null;
FileOutputStream out = null;
//第一种方法 每次读一个然后再写一个
try {
//创建输入输出流对象
in = new FileInputStream(srcpath);
out = new FileOutputStream(mudipath);
int i = in.read();
while(i != -1){
out.write(i);
i = in.read();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//第二种方法 一次性读完整个文件 再一次性写入整个文件
try {
in = new FileInputStream(srcpath);
out = new FileOutputStream(mudipath);
byte[] str =new byte[in.available()];
in.read(str);
out.write(str);
} catch (Exception e) {
}finally{
try {
in.close();
out.close();
} catch (Exception e2) {
}
}
//第三种方法 一次不是读一个,也不是一次性读完,而是读指定的大小
try {
in = new FileInputStream(srcpath);
out = new FileOutputStream(mudipath);
byte[] str = new byte[1024];
int i = in.read(str);
while(i!=-1){
out.write(str);
i = in.read(str);
}
} catch (Exception e) {
}finally{
try {
in.close();
out.close();
} catch (Exception e2) {
}
}
}
}
这三种方法主要不同就是写文件的方式不同,造成三种方式的效率各异,关于具体的分析会在后续博客中讲到