Java之 IO框架

 

File类

我们可以把计算机中所有的文件,文件夹封装成一个File对象

public class File implements Serializable, Comparable<File> {
    
    //有参构造方法,参数为该文件的路径
    public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        }
        this.path = fs.normalize(pathname);
        this.prefixLength = fs.prefixLength(this.path);
    }
    
    //是否存在
    public boolean exists(){}
    //是否是文件
    public boolean isFile() {}
    //是否是文件夹
    public boolean isDirectory() {}
    //创建该文件夹
    public boolean mkdir() {}
     //创建该文件
    public boolean createNewFile() throws IOException {}
    
    public File[] listFiles() {}
    
    public String getName() {}
    
    public boolean delete() {}
    
    public boolean renameTo(File dest) {}
    
}

我们可以通过流,来写入或者读取文件中信息。

分类

按照方向

无论输入,输出相对的都是程序

输入流

(1,0)流入到程序中,读取文件

输出流

流从程序中流出,相当于写入文件

按照单位

字节流

一次读取一个字节,字节流 byte

字符流

一次读取一个字符,字符流

字节输入流

InputStream 字节输入流使用来读取文件,一次读取一个字节

//一次读取一个字节
public abstract int read() throws IOException;
​
//一次读取一个字节,然后放入到数组中
public int read(byte b[]) throws IOException {
    return read(b, 0, b.length);
}
package com.qfedu;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
​
public class Demo03 {
​
    public static void main(String[] args) throws IOException {
        
        /*
         * 字节输入流   读取文件  一次读取一个字节
         */
        
        //待读取的文件
        File file = new File("D:\\java2203\\first.txt");
        
        //创建该文件的字节输入流
        InputStream is = new FileInputStream(file);
        
        /*
                //读取文件  一次读取一个字节   abcdefg
                int b1 = is.read();  // a 97
                int b2 = is.read();  // b 98
                int b3 = is.read();  // c 99
                int b4 = is.read();  // d 100
                int b5 = is.read();  // e 101
                int b6 = is.read();  // f 102
                int b7 = is.read();  // g 103
                int b8 = is.read();  //-1
                
                System.out.print((char)b1);
                System.out.print((char)b2);
                System.out.print((char)b3);
                System.out.print((char)b4);
                System.out.print((char)b5);
        */
        
        int b;
        while((b = is.read()) != -1) {
            System.out.print((char)b);
        }
        
        is.close();
    }
    
    
}


package com.qfedu;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
​
public class Demo03_2 {
​
    public static void main(String[] args) throws IOException {
        
        /*
         * 把读取到的字节放入一个数组中
         */
        File file = new File("D:\\java2203\\first.txt");
        
        InputStream is = new FileInputStream(file);
        
        byte[] bs = new byte[3];
        
        //abcdefg   a b c, d e f, g 0 0
        
        /*
            int n1 = is.read(bs);
            System.out.println(Arrays.toString(bs)+ n1);
            System.out.println(new String(bs, 0, 3));
            
            int n2 = is.read(bs);
            System.out.println(Arrays.toString(bs)+n2);
            System.out.println(new String(bs, 0, 3));
            
            int n3 = is.read(bs);
            System.out.println(Arrays.toString(bs)+n3);
            System.out.println(new String(bs, 0, 1));
            
            int n4 = is.read(bs);
            System.out.println(n4);
        */
        
        int n;      //读取的字节数
        while((n = is.read(bs)) != -1) {
            System.out.print(new String(bs, 0, n));
        }
        
    }
}

字节输出流

OutputStream 字节输出流使用来写入文件,一次写入一个字节

//一次写入一个字节
public abstract void write(int b) throws IOException;
//一次写入一个字节数组
public void write(byte b[]) throws IOException {}
//一次写入一个字节数组指定位置的字节
public void write(byte b[], int off, int len) throws IOException {}


package com.qfedu;
​
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
​
public class Demo04 {
​
    public static void main(String[] args) throws IOException {
        
        //待写入的文件
        File file = new File("D:\\java2203\\your.txt");
        
        /*
         * 创建该文件对象的输出流  
         * 如果定义添加参数true,则为追加
         * 没有参数true,则为替换
         * 
         */
        OutputStream os = new FileOutputStream(file, true);
        
        //每次写入一个字节
        os.write(97);     //a
        os.write(98);     //b
        os.write('c');
        
        byte[] bs = {100,101,102,103};
        
        os.write(bs);
        
        byte[] bs2 = new byte[10];
        bs2[0] = 104;
        bs2[1] = 105;
        
        os.write(bs2, 0, 2);
        
        os.close();
        
        
        
    }
}

复制文件

复制文件思路:

把使用字节输入流读取到的字节,写入到指定文件中,边读取边写入,达到一个复制的效果。

package com.qfedu;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
​
public class Demo05_copy {
​
    /*
     * 使用字节输入,输出,完成复制功能
     */
    public static void main(String[] args) throws IOException {
        //定义待复制的文件
        File file = new File("D:\\java2203\\apache-maven-3.3.9-bin.zip");
        
        //定义复制到的目标文件
        File targetFile = new File("D:\\java2203\\apache-maven-bin.zip");
        targetFile.createNewFile();
        
        //读取待复制文件   获取他的输入流
        InputStream is = new FileInputStream(file);
        
        //写入到目标文件   获取他的输出流
        OutputStream os = new FileOutputStream(targetFile);
        
        int b;
        byte[] bs = new byte[1024];
        while((b = is.read(bs)) != -1) {
            os.write(bs, 0, b);
        }
        
        //关闭资源
        is.close();
        os.close();
    }
    
}

缓冲字节输入流

内部做了优化,减少了和磁盘的交互,提高了字节读取的效率

方法的使用和字节输入流一模一样

package com.qfedu;
​
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
​
public class Demo06 {
​
    /*
     * 缓冲字节输入流
     */
    
    public static void main(String[] args) throws IOException {
        
        //字节输入流
        InputStream is = new FileInputStream("D:\\java2203\\first.txt");
        
        
        //字节输入流,才能创建缓冲字节输入流
        BufferedInputStream bis = new BufferedInputStream(is);
        
        int b;
        byte[] bs = new byte[4];
        while((b = bis.read(bs)) != -1) {
            System.out.print(new String(bs, 0, b));
        }
        
        is.close();
        bis.close();
    }
​
}

缓冲字节输出流

内部做了优化,减少了和磁盘的交互,提高了字节读取的效率

方法的使用和字节输出流一模一样

注意:在最后flush()一下,确保缓存中的数据都写入到磁盘中

package com.qfedu;
​
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
​
public class Demo07 {
​
    public static void main(String[] args) throws IOException {
​
        
        //待写入的文件
        File file = new File("D:\\java2203\\your.txt");
        
        //字符输出流
        OutputStream os = new FileOutputStream(file, true);
        
        //通过字符输出流  获取缓冲字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(os);
        
        String str = "hello world";
        
        byte[] bytes = str.getBytes();
        
        bos.write(bytes);
        bos.flush();     // 抖一抖,把缓冲数据全部写入磁盘中
        
        os.close();
    }
}

字符输入流

字符输入流读取数据,每次读取一个字符

package com.qfedu;
​
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
public class Demo08 {
​
    /*
     * 字符输入流 : 读取文件,一次读取一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\his.txt");
        
        //获取该文件的字符输入流
        Reader reader = new FileReader(file);
        
        //你自横刀向天笑,去留肝胆两昆仑。
        
        int c;
        while((c = reader.read()) != -1) {
            System.out.print((char)c);
        }
        
        reader.close();
        
    }
}
package com.qfedu;
​
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
public class Demo08_2 {
​
    /*
     * 字符输入流 : 读取文件,一次读取一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\his.txt");
        
        //获取该文件的字符输入流
        Reader reader = new FileReader(file);
        
        //你自横刀向天笑,去留肝胆两昆仑。
        
        int n;
        char[] cs = new char[3];
        while((n = reader.read(cs)) != -1) {
            System.out.print(new String(cs, 0, n));
        }
        
        reader.close();
        
    }
}

字符输出流

字符输出流写入数据,每次写入一个字符

package com.qfedu;
​
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
​
public class Demo09 {
​
    /*
     * 字符输出流,写入到这个文件, 每次写入一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\her.txt");
        
        //获取该文件的字符输出流,写入到这个文件中
        Writer writer = new FileWriter(file);
        
        writer.write(97);       //写入一个字符
        
        char[] arr = {98,99};
        writer.write(arr);      //写入一个字符数组
        
        writer.write("defg");   // 直接写入字符串
        
        writer.close();
    }
    
}

缓冲字符输入流

用法和缓冲字符输入流是一样的

多了一个读取一行数据的方法

package com.qfedu;
​
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
public class Demo10 {
​
    /*
     * 字符输入流 : 读取文件,一次读取一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\his.txt");
        
        //获取该文件的字符输入流
        Reader reader = new FileReader(file);
        
        //缓冲字符输入流
        BufferedReader br = new BufferedReader(reader);
        
        
        //你自横刀向天笑,去留肝胆两昆仑。
        
        int c;
        while((c = br.read()) != -1) {
            System.out.print((char)c);
        }
        
        reader.close();
        br.close();
        
    }
}
package com.qfedu;
​
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
public class Demo11 {
​
    /*
     * 字符输入流 : 读取文件,一次读取一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\his.txt");
        
        //获取该文件的字符输入流
        Reader reader = new FileReader(file);
        
        /*
         * 缓冲字符输入流
         * 
         *  可以一次读取一行
         */
        BufferedReader br = new BufferedReader(reader);
        
        
        //你自横刀向天笑,去留肝胆两昆仑。
        
        String str;
        while ((str=br.readLine()) != null) {
            System.out.println(str);
        }
        
        reader.close();
        br.close();
        
    }
}

缓冲字符输出流

缓冲字符输出流和字符输出流的用法是一样的

多了一个nextLine()方法,换行方法

package com.qfedu;
​
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
​
public class Demo12 {
​
    /*
     * 字符输出流,写入到这个文件, 每次写入一个字符
     */
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\java2203\\her.txt");
        
        //获取该文件的字符输出流,写入到这个文件中
        Writer writer = new FileWriter(file);
        
        //获取该文件的字符输出缓冲流
        BufferedWriter bw = new BufferedWriter(writer);
        
        bw.write(97);       //写入一个字符
        
        char[] arr = {98,99};
        bw.write(arr);      //写入一个字符数组
        
        bw.newLine();  //换行
        
        bw.write("呵呵哒");    // 直接写入字符串
        
        bw.flush();
        
        writer.close();
        bw.close();
    }
    
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值