输入输出流
在java中如果我们想要实现文件的查找,需要用到File类,实现文件的复制操作就需要用到输入输出流了,其中:所有的输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有的输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类,下面我们先来认识一下File类。
File类:
File类的对象通常用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件的读写权限等,但是,不涉及文件的读写操作。
首先,file的构造方法有4个
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 实例。 |
我们可以根据不同的需求来用它的构造方法。下面是一个小小的文件搜索器的根据路径和关键字查找文件夹和文件的方法实现:
//按路径搜索文件的方法 public int printDir(String name){ //int count1=0; //将文件名封装成文件对象 File dir=new File(name); //列表目录 File[] files=dir.listFiles(); if(files!=null&&files.length!=0){//当不是空目录或文件 for(int i=0;i<files.length;i++){ if(files[i].isDirectory()){//如果是目录 //得到绝对路径 String path=files[i].getAbsolutePath(); printDir(path); } else if(files[i].isFile()){ String path1=files[i].getAbsolutePath(); area.append(path1+"\n"); count1++; } } } return count1; } //按路径搜索文件夹的方法 public int printDirs(String name){ // /int count2=0; //将文件名封装成一个文件对象 File dirs=new File(name); //列表目录 File[] files=dirs.listFiles(); if(files.length!=0&&files!=null){ for(int i=0;i<files.length;i++){ if(files[i].isDirectory()){ count2++; //得到目录的绝对路径 String path=files[i].getAbsolutePath(); area.append(path+"\n"); } } } return count2; } //按关键字搜文件的方法 public int key(String name,String keys){ //此处的name会默认设为E盘 String knum=keys; //将文件名封装成一个文件对象 File dir=new File(name); File[] files=dir.listFiles(); if(files!=null&&files.length!=0){ for(int i=0;i<files.length;i++){ if(files[i].isDirectory()){ //得到文件夹的绝对路径 String path=files[i].getAbsolutePath(); //递归调用文件的方法 key(path,knum); } else if(files[i].isFile()){//如果是文件,则判断文件名中是否包含关键字 //得到文件的名字 String names=files[i].getName(); if(names.contains(keys)){//如果文件名中包含关键字 //得到文件的绝对路径 String paths=files[i].getAbsolutePath(); area.append(paths+"\n"); count3++; } } } } return count3; }
FileInputStream类和FileOutputStream类:
如果我们对文件的读取要求很简单的话,可以用 FileInputStream类,该类的实例方法是从inputstream类中继承来的。我们就从复制一个小文件来分析这两个类。
要复制一个文件,我们要做的就是获得文件路径----->将文件内容取出------->将取出的文件写入指定的路径中
这里有两个动作:读出文件和写入文件
读文件我们可以用到FileInputStream类中的read方法,它又分几种读入形式,例如read();是不带参数的,read(byte[]);是带有一个字节数组参数的方法,另外的我们可以在jdk中找到.
写文件就可以用到FileOutputStream类中的write(byte[]);方法,和read一样,它也有几种带参数的形式。
write(byte[] b) | 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 | ||
write(byte[] b, int off, int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 | ||
write(int b) | 将指定字节写入此文件输出流 |
下面是一个复制文件的例子:
package fileCopy; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; /** * 复制文件的类 * @author xiu * */ public class CopyFile { /** * 程序入口 * @param args */ public static void main(String[] args){ CopyFile copyf=new CopyFile(); //文件开始复制时记下当前的时间 long time=System.currentTimeMillis(); //给定一个要复制的文件路径 String path="C:\\Users\\xiu\\Desktop\\aa.txt"; // String path="E:\\workspace\\java\\PlantsFight\\showRole.class"; //给定一个复制目的地的文件路径 String path1="C:\\Users\\xiu\\Desktop\\bb.txt"; //调用复制文件的方法 copyf.copyFile(path,path1); //记下当前时间 long time1=System.currentTimeMillis(); //输出文件复制所花的总时间 System.out.println("复制一共耗时"+(time1-time)+"毫秒"); } /** * 写一个复制文件的方法 */ public void copyFile(String path,String path1){ try { //System.out.println(path); InputStream file=new FileInputStream(path); OutputStream file1=new FileOutputStream(path1); //定义一个数组,用来存放读出的数据 byte arr[]=new byte[file.available()]; //读出arr数组中的数据 while(file.read(arr)!=-1){ //将读出的数据写入到文件中 file1.write(arr); } } catch (Exception e) { e.printStackTrace(); } } }