IO流 Java文件处理,输入与输出

File类:

 java要对文件(这里文件,是指文件名与路径)进行处理,首先需要做的是如何找到该对应的文件,java通过File类来创建需要对应文件的实例。

 File类的构造方法:

  File(Stinr path):一般我们创建一个File,是根据路径字符串来创建。该路径可以指向文件或者是目录,也可以是不存在的路径。当然还有其他的构造方法,不过至今我都没有用到。

 File类有许多的方法,最常用的方法如下:

  boolean File.exists():判断文件是否存在,存在返回true,不存在访问false;

  File.createNewFile(): 创建一个与path指向文件的文件名

  File.mkdir()以及File.mkdirs():创建一个与path指向目录的目录

  Stirng File.list(): 列出File对象的所有子文件名和路径。

 文件过滤器FilenameFilter:

  在上述File类方法中有个list方法,该方法可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。

  代码如下:作用是返回当前程序目录下,子目录中有包含后缀名为".java"文件的名字

public class IO {
    //文件过滤器
    public void fileNameFilter(){
        File file = new File(".");
        System.out.println(file.getAbsolutePath());
//        FilenameFilter filenameFileter = new FilenameFilter() {
//            
//            @Override
//            public boolean accept(File dir, String name) {
//                // TODO Auto-generated method stub
//                System.out.println("accept方法中的name="+name);
//                return name.endsWith(".java") || new File(name).isDirectory();
//            }
//        };
//        String[] nameList = file.list(filenameFileter);
        //使用Lambda表达式,相当于上述的代码
        String[] nameList = file.list((dir,name) -> name.endsWith(".java") || new File(name).isDirectory());
        for(String name : nameList){
            System.out.println(name);
        }
    }

    public static void main(String[] args){
        IO io = new IO();
        io.fileNameFilter();
    }
}

运行效果如下:

D:\programme\javaEE\project\fzkjshop_project\fzkjshop_test\.
.settings
src
target

File类只能找到文件或者目录,也可以创建删除文件与目录,但是不能对文件进行读与写。为了实现文件的读与写

IO流:

IO流是输入/输出的基础,它可以方便的实现数据的输入/输出操作,不仅可以实现文件的读与写,还可以现实网络传输数据的输入与输出等等。在Java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream),通过流的方式,允许Java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收(sink)的有序数据。

 流可以根据方向分成:输入流与输出流,一个只能输入,不能输出;另一个只能输出,不能输入

  可以根据传输类型分成: 字节流与字符流,一个使用字节传输,另外一个使用字符传输

  可以根据角色分成:节点流与处理流,从/向一个特定的IO设备(如硬盘,网络)读/写数据的流,称为节点流;将节点流进行封装或者连接的称之为处理流。处理流比节点流在编写操作上更简单,同时执行的效率更高。

 根据输入/输出流以及字符/字节流,IO流提供4个抽象基类,即是字符输入流(Reader),字符输出流(Writer),字节输入流(InputStream),字节输出流(OutputStream),IO流提供的40多个类都是由4个抽象基类派生而来了,如下图:

根据上图,我们得知了用于访问文件的流,现通过该流编写一个拷贝文件的程序:

public class IO {    
    //拷贝文件
    public void copyFile(String path,String copyPath,int fileType){
        File file_1 = new File(path);     
        File file_2 = new File(copyPath);
        
        try{
            if(!file_2.exists()){
                file_2.createNewFile();
            }
            if(!file_1.exists()){
                System.out.println("要拷贝文件的路径不存在");
            }
            if(file_1.isFile() && file_2.isFile()){
                byte[] readByte = new byte[1024];
                char[] chars = new char[512];
                int hasRead,account = 0;
                if(fileType == 0){ //当文件时字符类型时
                    Reader read  = new FileReader(file_1);    
                    Writer write = new FileWriter(file_2); 
                    while((hasRead = read.read(chars))>0){
                        write.write(chars,0,hasRead);
                    }
                    read.close();
                    write.close();
                }
                if(fileType == 1){ //当文件时字符类型时
                    InputStream in = new FileInputStream(file_1);    
                    OutputStream out = new FileOutputStream(file_2);
                    while((hasRead = in.read(readByte)) >0){
                        out.write(readByte,0,hasRead);
                    }
                    in.close();
                    out.close();                    
                }
            }    
        }catch(Exception e){}
    }
    
    public static void main(String[] args){
        IO io = new IO();
//        io.fileNameFilter();
        
        String bytePath = "D:\\data\\file\\img.jpg";
        String byteCopyPath ="D:\\data\\file\\img_1.jpg";
        String charPath = "D:\\data\\file\\book.txt";
        String charCopyPath = "D:\\data\\file\\book_1.txt";
        io.copyFile(charPath,charCopyPath,0);
        io.copyFile(bytePath, byteCopyPath,1);
    }
}

在上述代码中,我们实现了拷贝文件的方法,传入的参数分别是对要拷贝文件的路径,拷贝文件后放置的路径根据以及文件类型,根据文件类型分成了字节拷贝与字符拷贝,各自的流都不一样。

猜你喜欢

转载自www.cnblogs.com/hjlin/p/11425815.html