Java学习第十六天——字符流读写文件、字符缓冲流拷贝文件

49 篇文章 0 订阅
21 篇文章 0 订阅

字符流读写文件

字符流读数据—按单个字符读取

创建字符流读文件对象:

​ Reader reader = new FileReader(“readme.txt”);

调用方法读取数据:

​ int data = reader.read();

只读取一个字符,返回该字符代表的整数(ASCII码),若到达流的末尾,返回-1;

异常处理(两种异常处理方式都可用):

throws IOException

关闭资源:

reader.close();

需要自己另外创建相关的文件夹即文件

package io.demo;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ReaderDemo1 {
//    FileNotFoundException是属于IOException的子类,所以FileNotFoundException可以不写
    public static void main(String[] args) throws IOException {
//        通过字符流读取数据
//        1.创建字符输入流对象
        Reader reader = new FileReader("lib/1.txt");            //会报错,所以在main函数后面加上throws FileNotFoundException;lib文件夹下的1.txt文件
//        2.读取数据
//        int read = reader.read();           //第一次读取a,97
//        System.out.println("read:"+read);
//        int read1 = reader.read();          //第二次读取b,98
//        System.out.println("read:"+read1);
//        int read2 = reader.read();            //第三次读取C,99
//        System.out.println("read:"+read2);
//        int read3 = reader.read();          //第四次读取d,以此类推,100
//        System.out.println("read:"+read3);
//        int read4 = reader.read();
//        System.out.println("read:"+read4);      //已经到达流的末尾,所以返回-1
        /*
            优化上述的代码:用循环改进
            又因为不知道循环的次数,所以用while循环
         */
        int ch;             //定义变量,用来接收读取到的字符
/*        (ch = reader.read()) != -1:做了三件事
                    1.执行reader.read(),取文件中读取一个字符;
                    2.执行ch = reader.read(),将读取到的字符赋值给变量ch
                    3.最后执行(ch = reader.read()) != -1,用读取到的字符(内容)和-1进行比较
  */
        while ((ch = reader.read()) != -1) {
//            ch = reader.read();
            System.out.println("read:"+ch);
        }
//        3.释放资源
        reader.close();     //报错,在main函数加上IOException
    }
}
字符流读数据—按字符数组读取

创建字符流读文件对象:

​ Reader reader = new FileReader(“readme.txt”);

调用方法读取数据:

​ char[] chs = new char[4];

​ int len = reader.read(chs);

一次读一个字符数组,将读取到的内容存到数组中,并返回读取到的有效字符数,若读不到返回-1

异常处理:

throws IOException

关闭资源:

reader.close();

package io.demo;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ReaderDemo2 {
    public static void main(String[] args) throws IOException {
//        需求:通过字符流读取数据,一次读取一个字符数组
//        1.创建字符输入流对象
        Reader reader = new FileReader("lib/1.txt");        //abcdefg
//        2.读取数据
//        char[] chs = new char[3];       //读取长度为4的字符,字符数组会拼接成字符串
//        int len = reader.read(chs);
//        System.out.println(chs);        //abc
//        System.out.println(len);        //3
//
//        int len2 = reader.read(chs);
//        System.out.println(chs);        //def:覆盖了abc
//        System.out.println(len2);           //3
//
//        int len3 = reader.read(chs);
//        System.out.println(chs);        //gef:只有g覆盖了d,没有其余的有效字符覆盖另外两个字符
//        System.out.println(len3);           //1,只有g是有效的
//
//        int len4 = reader.read(chs);
//        System.out.println(chs);        //gef:没有新的有效字符可以覆盖
//        System.out.println(len4);       //-1:因为没有读取到有效的字符,就返回-1


//        简化做法:用while循环改进
//        定义字符数组
        char[] ch = new char[3];        //ch存的是具体的字符数组
//        定义一个变量,记录读取到的有效字符数
        int len;        //有效字符数
        while ((len = reader.read(ch) )!= -1) {
//            将读取到的内容,转成字符串,然后打印
            /*
                ch:表示要操作的数组
                0:表示起始的索引
                len:表示要操作的字符的个数
             */
            String s = new String(ch,0,len);        //数组:[g,e,f],起始位置为0,个数len为1,则输出g
            System.out.println(s);
        }
//        3.释放数据
        reader.close();
    }
}
字符流写数据—按单个字符写入

创建字符流写文件对象:

​ Writer writer = new FileWriter(“1.txt”);

调用方法写入数据:

​ int x = “我”;

​ writer.write(x);

写入一个数据

异常处理

throws IOException

关闭资源:

​ writer.close();

字符流写数据—按字符数组写入

创建字符流写文件对象:

​ Writer writer = new FileWriter(“1.txt”);

调用方法写入数据:

​ char[] chs = {‘我’,‘爱’,‘学’,‘习’} ;

异常处理

throws IOException

关闭资源:

​ writer.close();

字符流写数据—按字符串写入

创建字符流写文件对象:

​ Writer writer = new FileWriter(“1.txt”);

调用方法写入数据:

​ writer.write(“我爱学习”);

写一个字符串

异常处理

throws IOException

关闭资源:

​ writer.close();

package io.demo;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/*
    字符流写数据
    Writer类中的方法
            void write(int ch);     一次写一个字符
            void write(char[] ch,int index,int len);        一次写一个指定的字符数组
            void write(String);         一次写一个字符串
 */
public class WriterDemo {
    public static void main(String[] args) throws IOException {
//需求:通过字符流,写数据
//        1.创建一个字符输出流对象
        Writer writer = new FileWriter("lib/1.txt");
//        2.写数据
//        一次写入一个字符
//        writer.write('好');          //在1.txt中就会写入好
//一次写一个指定的字符数组
//        char[] ch = {'我','爱','学','习'};          //字符数组,记得用单引号
//        writer.write(ch);
//        writer.write(ch,2,2);       //从ch字符数组的索引位置为2(索引是从0开始的),长度为2的地方写入数据:学习
//
//一次写入一个字符串
        writer.write("钟云耀同学要好好学习,天天向上");
//        3.释放资源
        writer.close();
    }
}
字符流拷贝文件—按单个字符读写

拷贝文件:Reader和Writer合作完成

创建字符流读文件对象

​ Reader reader = new FileReader(“readme.txt”);

创建字符流写文件对象

​ Writer writer = new FileWriter(“1.txt”);

调用方法读取数据:

​ int data = reader.read();

调用方法写入数据:

​ writer.write(data);

异常处理:

​ throws IOException

关闭资源:

​ reader.close();

​ writer.close();

IO流拷贝文件核心6步:
    1.创建字符输入流对象,关联数据源文件
    2.创建字符输出流随心,关联目的地文件
    3.定义变量,记录读取到的内容
    4.循环读取,只要条件满足就一直读取,并将读取到的内容赋值给变量
    5.将读取到的数据写入到目的地文件中
    6.释放资源
package io.demo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyFile {
    public static void main(String[] args) throws IOException {
//        需求:通过字符流拷贝文件,一次读写一个文件
//        例如:将1.txt文件中的内容复制到2.txt文件中
        /*
        注释就是思路,思路就是注释
            IO流拷贝文件核心6步:
                1.创建字符输入流对象,关联数据源文件
                2.创建字符输出流随心,关联目的地文件
                3.定义变量,记录读取到的内容
                4.循环读取,只要条件满足就一直读取,并将读取到的内容赋值给变量
                5.将读取到的数据写入到目的地文件中
                6.释放资源
         */
//        1.创建字符输入流对象,关联数据源文件
//        2.创建字符输出流随心,关联目的地文件
//       优化
//       Reader reader = new FileReader("lib/1.txt");
//       Writer writer = new FileWriter("lib/2.txt");
        FileReader fr = new FileReader("lib/1.txt");
        FileWriter fw = new FileWriter("lib/2.txt");
//        如果目的地文件不存在,程序会自动创建
//        3.定义变量
        int len;
//        4.循环读取
        while ((len = fr.read()) != -1) {
//            5.
            fw.write(len);
        }
//        6.释放资源
        fr.close();
        fw.close();
    }
}
字符流拷贝文件—按字符数组读写

创建字符流读文件对象

​ Reader reader = new FileReader(“readme.txt”);

创建字符流写文件对象

​ Writer writer = new FileWriter(“1.txt”);

调用方法读取数据:

​ char[] ch = new char[4];

​ int len = reader.read(ch);

调用方法写入数据:

​ writer.wtite(ch,0,len);

异常处理:

​ throws IOException

关闭资源:

​ reader.close();

​ writer.close();

package io.demo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyFile2 {
    public static void main(String[] args) throws IOException {
//        需求:通过字符流拷贝文件,一次读写一个文件
//        例如:将1.txt文件中的内容复制到2.txt文件中
        /*
            IO流拷贝文件核心6步:
                1.创建字符输入流对象,关联数据源文件
                2.创建字符输出流随心,关联目的地文件
                3.定义变量,记录读取到的有效字符数内
                4.通过循环读取,只要条件满足就一直读取,并将读取到的内容赋值给变量
                5.将读取到的数据写入到目的地文件中
                6.释放资源
         */
//        1.
        FileReader reader =new FileReader("lib/1.txt");
//        2.
        FileWriter writer = new FileWriter("lib/2.txt");
//        3.
//        定义一个字符数组
        char[] ch = new char[1024];     //最好的1024的整数倍
//        用来记录读取到的有效字符数
        int len;
//        4.
        while ((len = reader.read(ch)) != -1) {
//            5.
            writer.write(ch,0,len);
        }
//        6.
        reader.close();
        writer.close();
    }
}

字符缓冲流

BufferedReader:字符缓冲输入流(高效字符输入流)

构造方法:

​ public BufferedReader(Reader reader);

成员方法:

​ public String readLine();

一次读取一行数据并返回读取的到的数据内容,读不到则返回null

BufferedWriter:字符缓冲输出流(高效字符输出流)

构造方法:

​ public BufferedWriter(Writer writer);

成员方法:

​ public void newLine();

根据当前操作系统给出对应的换行符。

windows操作系统:\r\n;
mac操作系统:\r;
unix操作系统:\n

**特点:**字符缓冲流自带有缓冲区,大小为8192个字符,就是16kb

字符缓冲流拷贝文件的标准代码

创建字符流读文件对象:

​ BufferedReader br = new BufferedReader(new FileReader(“1.txt”));

创建字符流写文件对象:

​ BufferedWriter bw = new BufferedWriter(new FileWriter(“2.txt”));

异常处理:

​ throws IOException

使用while循环读写数据:

​ int len;

​ while ((len = br.read()) != -1) {

​ bw.write(len);

​ }

关闭资源:

​ br.close();

​ bw.close();

package io.demo;

import java.io.*;

public class BufferedDemo {
    public static void main(String[] args) throws IOException {
//        需求:通过字符缓冲流,将1.txt文件中的内容拷贝到2.txt文件中
//        1.创建缓冲输入流对象,关联数据源文件
//        1.1创建普通的字符输入流对象
        FileReader fr = new FileReader("lib/1.txt");
//        1.2创建缓冲输入流对象
        BufferedReader bfr = new BufferedReader(fr);
//        简化1.1和1.2的代码
//        BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));
//        2.创建缓冲输出流对象,关联目的地文件
//        2.1创建字符输出流对象
        FileWriter fw = new FileWriter("lib/2.txt");
//        2.2
        BufferedWriter bfw = new BufferedWriter(fw);
//        BufferedWriter bw = new BufferedWriter(new FileWriter("lib/2.txt"));
//        3.定义变量,记录读取到的数据
        int len;
//        4.循环读取,只要条件满足就一直读取,并将读取到的数据赋值给变量
        while ((len = bfr.read()) != -1) {      //底层是按照字符数组读写的,而不是一个一个字符读写的
            bfw.write(len);
        }
//        5.将读取到的数据写入到目的地文件中
//        6.释放资源
        bfr.close();
        bfw.close();
    }
}
package io.demo;

import java.io.*;
//注意:字符流只能拷贝纯文本文件,
public class BufferedDemo2 {
    public static void main(String[] args) throws IOException {
//        需求:通过字符缓冲流一次读写一行的方式,将1.txt文件中的内容拷贝到2.txt文件中
//        1.创建字符缓冲流输入对象
//        分开写
//        FileReader reader = new FileReader("lib/1.txt");
//        BufferedReader br = new BufferedReader(reader);
//        合并
        BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));
//        2.创建字符缓冲输出流对象
//        FileWriter writer = new FileWriter("lib/2.txt");
//        BufferedWriter bw = new BufferedWriter(writer);
        BufferedWriter bw = new BufferedWriter(new FileWriter("lib/2.txt"));
//        3.定义变量,记录读取到的数据内容
        String s;
//        4.循环读取,并将读取到的数据内容赋值给变量
        while ((s = br.readLine()) != null) {        //读不到数据,则返回null
//        5.将读取到的数据写入目的地文件中
            bw.write(s);
//            注意一个容易忽略的小细节:不要忘记换行;
//            windows操作系统:\r\n;
//            mac操作系统:\r;
//            unix操作系统:\n
            bw.newLine();
        }

//        6.释放资源
        br.close();
        bw.close();
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值