基于字符流和字符缓冲流的文件操作

字符流 FileReader 和 FileWriter

FileReader 和 FileWriter 是使用字符直接对文件的读与写操作

FileReader

构造方法 说明
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader
FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader

FileWriter

构造方法 说明
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象
FileWriter(String fileName, boolean append) 据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象

示例

使用FileReader和FileWriter类完成文本文件复制,步骤:

  1. 创建读(FileReader)对象
  2. 创建写(FileWriter)对象
  3. 循环读取的数据,写入到目标文件中
  4. 关闭写(FileWriter)对象
  5. 关闭读(FileReader)对象

关于读写对象的关闭顺序不可变

一次读一个字符

/**
     * 文本文件复制,一次读一个字符
     * 
     * @param fr
     * @param fw
     * @throws IOException
     */
public static void copy1(FileReader fr, FileWriter fw) throws IOException {
    int ch;
    while ((ch = fr.read()) != -1) {// 读数据
        fw.write(ch);// 写数据
    }
    fw.flush();
}

一次读一个字符数组

/**
     * 文本文件复制,一次读一个字符数组
     * 
     * @param fr
     * @param fw
     * @throws IOException
     */
public static void copy2(FileReader fr, FileWriter fw) throws IOException {
    char chs[] = new char[1024];
    int len = 0;
    while ((len = fr.read(chs)) != -1) {// 读数据
        fw.write(chs, 0, len);// 写数据
    }
    fw.flush();
}

测试

public static void main(String[] args) throws IOException {

    // 创建输入流对象
    // 文件不存在会抛出java.io.FileNotFoundException
    FileReader fr = new FileReader("d:\\Test\\copyfrom.txt");

    // 创建输出流对象
    FileWriter fw = new FileWriter("d:\\Test\\copyto.txt");

    // 创建输出流做的工作: 1、调用系统资源创建了一个文件 2、创建输出流对象 3、把输出流对象指向文件
    copy1(fr, fw);
    copy2(fr, fw);

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

字符缓冲流BufferedReader和BufferedWriter

缓冲流可以读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从而提高了工作效率

优点:减少对硬盘的读取次数,降低对硬盘的损耗

BufferedReader

字符缓冲流具备文本特有的表现形式,行操作

public class BufferedReader extends Reader
  • 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
  • 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
  • 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)

BufferedReader 有一个新方法:readLine 。可以一次读取一行数据。

BufferedWriter

BufferedReader in = new BufferedReader(new FileReader("foo.in"));
  • 将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
public class BufferedWriter extends Writer
  • 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

  • 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

  • 该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

  • 通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
    
  • 缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

示例

使用BufferedReader和BufferedWriter完成文件复制

使用 char 做数据读取

/**
     *  和字符流一样,使用 char 做数据读取
     * @param source
     * @param target
     * @throws IOException
     */
public static void byteCopy(String source, String target) throws IOException {
    // 创建输入流对象
    BufferedReader br = new BufferedReader(new FileReader(source));// 文件不存在会抛出java.io.FileNotFoundException
    // 创建输出流对象
    BufferedWriter bw = new BufferedWriter(new FileWriter(target));
    // 文本文件复制
    char[] chs = new char[1024];
    int len = 0;
    while ((len = br.read(chs)) != -1) {
        bw.write(chs, 0, len);
    }
    // 释放资源
    br.close();
    bw.close();
}

BufferedReader对象使用 readLine 方法读取数据

/**
     * BufferedReader对象使用 readLine 方法读取数据
     * @param source
     * @param target
     * @throws IOException
     */
public static void stringCopy(String source, String target) throws IOException {
    // 创建输入流对象
    // 文件不存在会抛出java.io.FileNotFoundException
    BufferedReader br = new BufferedReader(new FileReader(source));
    // 创建输出流对象
    BufferedWriter bw = new BufferedWriter(new FileWriter(target));

    String str = br.readLine();
    while (null != str ) {

        //一定是先写入数据,然后再读取下一行。
        //注意默认没有换行,所以需要自己添加换行符
        bw.write(str +"\n");
        str = br.readLine();
    }
    // 释放资源
    br.close();
    bw.close();
}

测试

public static void main(String[] args) throws IOException {

    byteCopy("d:/source.txt" , "d:/target.txt");
    
    stringCopy("d:/source.txt" , "d:/target.txt");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容