java的IO流操作

一、IO的分类

1、按流向分类(以java程序为中心)

输入流 读取数据

输出流 写出数据

2、按数据类型分类

字节流:

字节输入流 读取数据 InputStream

字节输出流 写出数据 OutputStream

字符流:

字符输入流 读取数据 Reader

字符输出流 写出数据 Writer

如何区分使用的是字节流还是字符流呢?

使用windows自带的记事本打开。如果能够看懂里面的内容,就是用字符流,如果不能够读懂,就使用字节流

字节流可以读取任何数据,如果不懂用什么,就使用字节流

二、字节流的输出操作

1、往指定文件写入数据

经过上面的分析,我们最后采用的是,OutputStream ,通过观察API发现,OutputStream这个类是一个抽象类,而抽象类不能被实例化 要想实例化,我们就必须找到一个具体的实现子类

FileOutputStream

FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。

FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\邹政\\Desktop\\测试\\a.txt");
        //获取要输出到的文件,如果没有就自动创建,如果指定路径不存在则会抛出异常,默认最后一行是文件
        FileOutputStream fos = new FileOutputStream(file);

        fos.write("请继续加油".getBytes());
        //如果想要输入的数据换行,则使用\r\n
        fos.write("\r\n".getBytes());
        fos.write("请继续加油1".getBytes());
        fos.write("\r\n".getBytes());
        fos.write("请继续加油2".getBytes());
        fos.write("\r\n".getBytes());
        fos.write("请继续加油3".getBytes());
        fos.close();
    }
}

2、写入文件的几个方法

void write(byte[] b)

将 b.length个字节从指定的字节数组写入此文件输出流。

void write(byte[] b, int off, int len)

将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。

void write(int b)

将指定的字节写入此文件输出流。

3、追加内容到写入的数据

public FileOutputStream(String name, boolean append)

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        //向文件中追加写入
        File file = new File("C:\\Users\\邹政\\Desktop\\测试\\a.txt");
        FileOutputStream fos = new FileOutputStream(file,true);

        fos.write("\r\n".getBytes());
        fos.write("明天会更好".getBytes());
    }
}

追加内容的换行符:

Windows: \r\n

Mac: \r

Linux: \n

三、字节流的读取操作

public class IODemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\邹政\\Desktop\\测试\\a.txt");

        //创建字节流输入对象
        FileInputStream fis = new FileInputStream(file);

        //read()一次只能够读取一个字节,显然要想读取全部内容必须使用循环
        //当读取到底时,会返回-1
        //读取方式一
        int b = 0;
        while ((b = fis.read()) != -1){
            System.out.print((char) b);
        }

        System.out.println();
        //读取方式二 byte[] bytes = new byte[13]     fis.read(bytes)
        //从该输入流中读取最多b.length个字节的数据作为字节数组
        //读取汉字最好使用字符流,否则很容易出现乱码
        FileInputStream fis1 = new FileInputStream(file);
        System.out.println("===========分割线===========");
        byte[] bytes = new byte[1024];
        int length = 0;
        while ((length = fis1.read(bytes)) != -1){
            String s = new String(bytes,0,length);
            System.out.print(s);
        }
        fis.close();
    }
}

四、字符流字节流实战(面面俱到)

import java.io.*;

public class FileCopyDemo1 {
    public static void main(String[] args) throws IOException {
        bufferReadCopy3("C:\\Users\\邹政\\Desktop\\测试\\a.txt","C:\\Users\\邹政\\Desktop\\测试\\b.txt");
    }


    //方式一、使用字节输入输出流拷贝文件
    //path1是输入地址
    //path2是输出地址
    //使用read一个一个读
    public static void copy1(String path1,String path2) throws IOException {
       FileOutputStream fos = new FileOutputStream(path2);
       FileInputStream fis = new FileInputStream(path1);

        int a;
       while ((a = fis.read()) != -1 ){
           fos.write(a);
           fos.flush();
       }

       fos.close();
       fis.close();
    }


    //使用数组一次多读
    public static void copy2(String path1,String path2) throws IOException {
        FileOutputStream fos = new FileOutputStream(path2);
        FileInputStream fis = new FileInputStream(path1);

        //从字节流中读取文件进行拷贝
        byte[] b = new byte[1024];
        int length;
        while ((length = fis.read(b)) != -1 ){
            fos.write(b,0,length);
            fos.flush();
        }
        fos.close();
        fis.close();
    }

    //方式二、使用字节缓冲流拷贝文件
    //一个一个读
    public  static void bufferCopy1(String path1,String path2) throws IOException {
        //输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path2));
        //输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path1));

        int a = 0;
        while ((a = bis.read()) != -1){
            bos.write(a);
            bos.flush();
        }

        bos.close();
        bis.close();

    }

    //方式二、使用字节缓冲流拷贝文件
    //使用数组一次读多个
    public  static void bufferCopy2(String path1,String path2) throws IOException {
        //输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path2));
        //输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path1));

        //创建一个字节数组
        int length;
        byte[] b = new byte[1024];
        while ((length = bis.read(b)) != -1){
            bos.write(b,0,length);
            bos.flush();
        }

        bos.close();
        bis.close();
    }

    //方式三、使用字符流(转换流)拷贝文件
    //一个一个读
    public  static void charCopy1(String path1,String path2) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path2));
        InputStreamReader isr = new InputStreamReader(new FileInputStream(path1));
        int length;
        while ((length = isr.read()) != -1){
            osw.write(length);
            osw.flush();
        }

        osw.close();
        isr.close();

    }

    //使用字符流拷贝问价
    //使用数组读取多个
    public  static void charCopy2(String path1,String path2) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path2));
        InputStreamReader isr = new InputStreamReader(new FileInputStream(path1));

        char[] c = new char[1024];
        while (isr.read(c) != -1){
            osw.write(c,0,c.length);
            osw.flush();
        }

        osw.close();
        isr.close();

    }

    //字符流(转换流的简化写法)
    //一次拷贝多个
    public  static void charCopy3(String path1,String path2) throws IOException {
        FileWriter fw = new FileWriter(path2);
        FileReader fr = new FileReader(path1);

        char[] c = new char[1024];
        while (fr.read(c) != -1){
            fw.write(c,0,c.length);
            fw.flush();
        }

        fr.close();
        fw.close();

    }

    //一次拷贝一个
    public  static void charCopy4(String path1,String path2) throws IOException {
        FileWriter fw = new FileWriter(path2);
        FileReader fr = new FileReader(path1);

        int c;
        while ((c = fr.read()) != -1){
            fw.write(c);
            fw.flush();
        }

        fr.close();
        fw.close();

    }

    //使用字符缓冲流
    //一个一个读
    public static void bufferReadCopy1(String path1,String path2) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path1));
        BufferedWriter bw = new BufferedWriter(new FileWriter(path2));
        int b;
        while ((b =br.read())!=-1){
            bw.write(b);
            bw.flush();
        }

        br.close();
        bw.close();

    }

    //使用字符缓冲流
    //使用字符数组读
    public static void bufferReadCopy2(String path1,String path2) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path1));
        BufferedWriter bw = new BufferedWriter(new FileWriter(path2));
        int length;
        char[] c = new char[1024];
        while ((length =br.read(c))!=-1){
            bw.write(c,0,length);
            bw.flush();
        }

        br.close();
        bw.close();

    }


    //使用字符缓冲流特有的功能
    //一行一行读
    public static void bufferReadCopy3(String path1,String path2) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path1));
        BufferedWriter bw = new BufferedWriter(new FileWriter(path2));
        String s;
        while ( (s = br.readLine())!=null){
            bw.write(s);
            bw.newLine();
        }

        br.close();
        bw.close();

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值