Java文件操作

一、File对象(找到指定的文件所在的路径)

  1. File对象不涉及文件读写操作,更贴切的来说File对象的含义应该是FilePath,它指定了文件的路径。
  2. File对象通过mkdir()方法创建一个文件目录,通过createNewFile()来创建文件。
  3. File 的构造方法需要指明文件所在的路径,有绝对路径和相对路径。
    这里写图片描述
    相对路径具有很多的优良特性。

二、文件字节输入、输出流

  1. FileInputStream、FileOutputStream,其构造方法均以文件或指定的文件路径为参数,建立指向输入、输出文件的输入流、输出流。
  2. FileInputStream对象通过read方法顺序的读取文件,read()方法可以读单个字节,也可以将其读入到一个byte数组中。
  3. FileOutputStream对象通过write方法以字节为单位向绑定的文件写数据,write方法可以写单个字节,也可以以byte数组为单位向目的文件写。
  4. 文件操作要注意即使的close()。

示例:

public static void outputFile(File src){
        System.out.println("输出"+src.getName()+"文件如下:");
        System.out.println("*********************");
        int n = -1;
        byte[] container = new byte[1000];
        try {
            FileInputStream inFile = new FileInputStream(src);
            while((n=inFile.read(container))!=-1){
                String line = new String(container,0,n);
                System.out.print(line);
            }
            inFile.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.err.println("Wrong Message:"+e.getMessage());
        }
    }

    //将从文件src中的内容读入到文件des中
    public static void src2des(File src,File des){
        //中间需要一个转换,用一个"容器",从src中取出一个unit,然后放入到des中
        int n = -1;
        byte[] container = new byte[1000];
        try {
            des.createNewFile();
            FileOutputStream outFile = new FileOutputStream(des,false);
            FileInputStream inFile = new FileInputStream(src);
            while((n=inFile.read(container))!=-1){
                outFile.write(container, 0, n);
            }
            inFile.close();
            outFile.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("Error in src2des:"+e.getMessage());
        }
    }

三、文件字符输入、输出流

  1. 文件字节输入、输出流以字节为单位读写数据不能很好的操作Unicode字符,因为有的编码不止占一个字节,要是再使用文件字节输入、输出流的话就会造成“乱码”问题。由此引入文件字符输入、输出流,FileReader、FileWriter,以字符为单位读写数据。
  2. FileReader对象的read方法使用字符数组读数据;FileWriter对象的write方法使用字符数组写数据。
  3. 除了像文件字节输入、输出流一样需要及时close()文件外,对于FileWriter对象,还有一个flush()方法。因为Writer(FileWriter继承自Writer)流,write方法将数据首先写入到缓冲区,每当缓冲区溢出时,缓冲区的内容被自动写入到目的地,如果关闭流,缓冲区中的内容会被立刻写入到目的地。流调用flush方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。
public static void outputFile(File src){
        System.out.println("输出"+src.getName()+"文件如下:");
        System.out.println("*********************");
        int n = -1;
        char[] buffer = new char[1000];
        try {
            FileReader inFile = new FileReader(src);
            while((n=inFile.read(buffer))!=-1){
                String line = new String(buffer,0,n);
                System.out.print(line);
            }
            inFile.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.err.println("Wrong Message:"+e.getMessage());
        }
    }

    //将从文件src中的内容读入到文件des中
    public static void src2des(File src,File des){
        //中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中
        int n = -1;
        char[] buffer = new char[100];
        try {
            des.createNewFile();
            FileWriter outFile = new FileWriter(des,true);
            FileReader inFile = new FileReader(src);
            while((n=inFile.read(buffer))!=-1){
                outFile.write(buffer, 0, n);
            }
            outFile.flush();
            inFile.close();
            outFile.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("Error in src2des:"+e.getMessage());
        }
    }

四、缓冲流

  1. 尽管FileReader、FileWriter流以字符为单位读写数据,但是它不能读取一行。
  2. BufferReader、BufferWriter类创建的对象称为缓冲输入、输出流,二者的源和目的地必须分别是FileReader、FileWriter流(即构造参数)。
  3. BufferReader对象通过readLine()方法读取文本行;BufferWriter对象通过write(String s)方法将字符串s写到指定文件。此外,BufferWriter对象通过newLine()方法向目的地文件写入一个换行符。
  4. 将BufferReader和BufferWriter称为上层流,把它们指向的字符流称为底层流。Java采用缓存技术将上层流和底层流连接。底层字符输入流首先将数据读入缓存,BufferReader流再从缓存中读取数据;BufferWriter流将数据写入缓存,底层字符输出流会不断地将缓存中的数据写入到目的地。当BufferWriter流调用flush()方法刷新缓存或调用close()方法关闭时,即使缓存没有溢出,底层流也会立刻将缓存的内容写入到目的地。

这里写图片描述

  1. 在编写代码时,只需关闭上层流。那么底层流就会自动关闭。
  2. 缓冲流以行为单位读取,具有更强的读写能力,实际应用广。
public static void outputFile(File src){
        System.out.println("输出"+src.getName()+"文件如下:");
        System.out.println("*********************");
        int n = -1;
        char[] buffer = new char[1000];
        try {
            FileReader inFile = new FileReader(src);
            while((n=inFile.read(buffer))!=-1){
                String line = new String(buffer,0,n);
                System.out.print(line);
            }
            inFile.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.err.println("Wrong Message:"+e.getMessage());
        }
    }

    //将从文件src中的内容读入到文件des中
    public static void src2des(File src,File des){
        //中间需要一个转换,用一个容器,从src中取出一个unit,然后放入到des中
        int n = -1;
        char[] buffer = new char[100];
        try {
            des.createNewFile();
            FileWriter outFile = new FileWriter(des,true);
            FileReader inFile = new FileReader(src);
            BufferedReader in = new BufferedReader(inFile);
            BufferedWriter out = new BufferedWriter(outFile);
            String line = null;
            while((line=in.readLine())!=null){
                out.write(line);
                out.newLine();
            }
            out.flush();
            in.close();
            out.close();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("Error in src2des:"+e.getMessage());
        }
    }

note :
1.不论是用那种方式去读、写文件,当任务完成后,都应当即使关闭文件,考虑到并发多线程的资源问题。尽管Java中当程序结束后会自动关闭所有打开的流,但在程序中应该显示的关闭哪些被打开的流。
2.文件的读、写操作是可能会抛出异常的,所以对于文件的操作要放到try-catch语句块中进行。另外,一旦try中发现了异常,就会立即转向catch部分。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值