• 使用带有缓冲的字符流读写数据


    ------------siwuxie095

       

       

       

       

       

       

    工程名:TestRWBufferedCharStream

    包名:com.siwuxie095.bufferedcharstream

    类名:RWByBufferedCharStream.java

       

       

    打开资源管理器,在工程 TestRWBufferedCharStream 文件夹下,放入

    一个文本:java.txt

       

    java.txt 的内容:

       

     

       

       

    工程结构目录如下:

       

       

       

       

       

       

    代码:

       

    package com.siwuxie095.bufferedcharstream;

       

    import java.io.BufferedReader;

    import java.io.BufferedWriter;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.InputStreamReader;

    import java.io.OutputStreamWriter;

    import java.io.PrintWriter;

    import java.io.UnsupportedEncodingException;

       

    public class RWByBufferedCharStream {

       

    /**

    * 使用带有缓冲的字符流实现文本文件的数据读写

    *

    * InputStreamReader 没有读取一行数据的方法

    * OutputStreamWriter 没有写入一行数据后自动换行的方法

    * 所以有一定的局限性

    *

    * 使用带有缓冲的字符流就可以解决

    *

    * InputStreamReader BufferedReader API区别:

    * InputStreamReader 4 read() 方法,BufferedReader 则多出一个 readLine()

    * readLine() 每读取到一个换行的时候,此函数就会结束,并将这一行数据返回

    *

    * OutputStreamWriter BufferedWriter API区别:

    * OutputStreamWriter 5 write() 方法,BufferedWriter 同样是这 5 个方法

    * BufferedWriter 的优势在于其写出的操作是带有缓冲的,在 BufferedWriter 内部

    * 有一个自带的缓冲区,当文件写出的时候,会先写入到这个缓冲区,当缓冲区被写满

    * 之后才会向硬盘执行一次真正的写出操作,这样就大大减少了硬盘的使用量,延长了

    * 硬盘的使用寿命,整体的写出时间也会变短,增加了写入效率

    *

    *

    * 在使用缓冲流写出数据时要注意一点:

    * 到文件末尾时如果写出的数据还没有填满缓冲区,缓冲区里的内容有些时候是不会被

    * 写入到文件里的。导致文件内容丢失 不完整,所以在缓冲流 close() 之前,要调

    * 用输出流的 flush()方法,将当前的缓冲区里的内容强制输出,不留遗漏,保证文件

    * 内容的完整

    *

    * @param args

    */

    public static void main(String[] args) {

       

    try {

       

    // 先创建一个文件对象

    File file = new File("java.txt");

    // 再创建一个文件输入流(字节流),传入 file

    FileInputStream fis = new FileInputStream(file);

    // 使用 InputStreamReader 将字节流转化为字符流

    // 传入 fis 并指定字符集:UTF-8

    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");

    // 继续包装成带缓冲的字符流,传入Reader对象:isr

    BufferedReader br = new BufferedReader(isr);

       

     

    // 文件的输出流会自动创建文件 java_buff.txt,不需要手动创建

    FileOutputStream fos = new FileOutputStream("java_buff.txt");

    // 在对同一个文件进行读写 对同一段数据操作时,其编码设定一定要一致

    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

    BufferedWriter bw = new BufferedWriter(osw);

     

     

    // 打印流,其方法和 BufferedWriter 相似,传入一个Writer对象:osw

    // PrintWriter 还可以设置自动执行 flush 操作,不用手动去 pw.flush()

    //PrintWriter pw=new PrintWriter(osw,true);

    PrintWriter pw=new PrintWriter(osw);

       

     

    String input;

       

    // 如果 readLine() 的返回值是 null,则读取到了文件末尾

    while ((input = br.readLine()) != null) {

    System.out.println(input);

    // Stringinput 写入到文件 java_buff.txt,但是会丢失所有的换行符

    // 这是因为使用 BufferedReader readLine()方法来读取一行数据时,

    // 虽然读取的是一行数据,返回值中却并不包含换行符,所以在写入文件

    // 时就只能写入每一行的真实内容,而没有换行符,最后就只有一行了

    // 可以手动加入一个换行符

    bw.write(input + " ");

       

    // 或者 使用另一个APIPrintWriter,来保留换行符

    // PrintWriter write() 方法和BufferedWriterOutputStreamWriter一样

    // 除此之外,PrintWriter 还提供了特殊的写出方法,即 print() println()

    // 特别是 printline 写出数据时会在当前字符串末尾添加一个换行符

    //pw.println(input);

    }

     

    //关闭缓冲流之前,执行输出流的 flush 操作

    bw.flush();

    //pw.flush();

     

     

    // 读写完毕,关闭流

    br.close();

    isr.close();

    fis.close();

    pw.close();

    bw.close();

    osw.close();

    fos.close();

       

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

       

    }

       

       

    运行一览:

       

       

       

       

    java_buff.txt 的内容:

       

       

       

       

    运行后,工程结构目录一览:

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    SDUT 2128 树结构练习——排序二叉树的中序遍历
    SDUT 2137 数据结构实验之求二叉树后序遍历和层次遍历
    SDUT 3341 数据结构实验之二叉树二:遍历二叉树
    总结:串和数组的学习
    SDUT 3347 数据结构实验之数组三:快速转置
    SDUT 3348 数据结构实验之数组二:稀疏矩阵
    SDUT 1500 Message Flood
    SDUT 2463 学密码学一定得学程序
    SDUT 2125 数据结构实验之串二:字符串匹配
    mybatis学习(七)(choose的学习)
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6624292.html
Copyright © 2020-2023  润新知