zoukankan      html  css  js  c++  java
  • Java IO 嵌套流、文本的输入输出和存储

    Java IO 嵌套流、文本的输入输出和存储

    @author ixenos

    1.   组合流过滤器(嵌套流)

      a)    跨平台文件分割符:常量字符串 java.io.File.seperator 等效于windows”/”

      b)    通过嵌套流过滤器来添加多重功能

                    i. 首先要知道,基于装饰模式设计,过滤流的各个方法通常会递归调用基类的方法,如read、write、close、flush这些,因此流的嵌套顺序对于缓冲功能无影响,(只是对于直接输出格式的功能有影响)

                   ii. DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream(“hello.dat”)));

                  iii. 这里把DataInputStream置于构造器链的最后,因为我们希望使用DataInputSteam的方法,又希望使用带缓冲机制的read方法

      c)     当有多个流链接在一起时,需要跟踪各个中介流,例如,当读入输入时,你需要经常浏览下一个字节,以了解它是否是你想要的值,这时可用 回推输入流 PushbackInputStream/PushbackReader:

                    i. PushbackInputStream pbin = new PushbackInputStream(new BufferedInputStream(new FileInputStream(“Hell.dat”)));

                   ii. 现在可以预读下一个字节:int b = pbin.read();

                  iii. 不是期望值可回推:if(b!=’<’) pbin.unread(b);

                  iv. 原理是:回推流又有一个缓冲用来预读数据,PushBackInputStream的read方法总是先从回推缓冲区读取数据,不够用时才会到原输入流中去读取

    2. 写出文本输出

      a)    对于文本输出,可以使用PrintWriter,这个类拥有以文本格式打印字符串和数字的方法,甚至还可以链接到FileWriter:

                    i. PrintWriter out = new PrintWriter(“emplo.txt”);

                   ii. 就等价于:

                  iii. PrintWriter out = new PrintWriter(new FileWriter(“emplo.txt”));

      b)    为了输出到打印写出器(PrintWriter),需要使用与System.out时相似的print、println和printf方法,可以使用这些方法来打印各种格式

                    i. String name = “ixenos”;

                   ii. Double salary = 89000;

                  iii. out.print(name);

                  iv. out.print(‘’);

                   v. out.println(salary);

                  vi. 输出到PrintWriter out后,这些字符将会被转换为字节并最终写入emplo.txt

               vii.  println方法在行中添加了跨平台的行结束符,(对windows是“ ”,UNIX是“ ”),也就是通过System.getProperty(“line.separator”)而获得的字符串

                viii. PrintWriter是带缓冲区的,如果写出器设置为自动冲刷模式,那么只要println被调用,缓冲区中的所有字符都会实时地被发送到他们的目的地。自动冲刷默认是禁用的,可以在构造时启动:PrintWriter(Writer out, Boolean autoFlush)

    3.   读入文本输入

      a)    我们知道以二进制格式写出数据,用DataOutputStream以文本格式写出数据,用PrintWriter

      b)    但是对应输入就不是DataInputStream了,在JavaSE5以前,我们用BufferedReader但是它并没有读入数字的方法,因此之后我们用Scanner来读入文本输入,而且Scanner可以直连输入流,如Scanner(System.in)

                    i. BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(“emp.txt”), “UTF-8”));

                   ii. Scanner in = new Scanner(new FileInputStream(“emp.txt”), “UTF-8”); 不加指定字符集参数则使用默认的字符集来编码流

    4.   以文本格式存储对象

      a)    当我们使用一个自定义的字符来分隔字段并写入文本的时候,在读取时我们要使用对应的正则表达式来分隔字段,而对应的正则表达式与我们自定义的字符相关

      b)    示例样本:

                    i. Harry|123123|1992|11|1

                   ii. Ixenos|311414|1993|32|2

                  iii. Kayder|456456|1994|23|62

         iv. 写出程序:

    1 Public void writeData(PrintWriter out) throws IOException{
    2 
    3     GregorianCalendar calendar = new GregorianCalendar();
    4     Calendar.setTime(hireDay);
    5 
    6     out.println(name+”|”+salary+”|”+calendar.YEAR+”|”+…..)
    7 }

                 vi. 读入程序:Scanner读一行,然后用String.split传入正则来分割这一行

                 vii. public void readData(Scanner in){

    1 String line = in.nextLine(); //按编码读取字符
    2 
    3     String[] tokens = line.split(“\|”);  //这里需要转义”|”,再转义””
    4     name = tokens[0];
    5     salary = Double.parseDouble(tokens[1]); //将字符串转为对应类型
    6     int a = Integer.parseInt(tokens[2]);
    7 
    8     ...
    9 }
  • 相关阅读:
    690. 员工的重要性
    【递推算法】
    【数据排序】快速排序
    【数据排序】车厢重组
    【基本算法--高精度计算】大整数相加
    【基本算法--高精度计算】回文数
    高精度计算 除法 高精除以低精
    PReLU
    重学C++(1)
    概率论基础知识回顾(1)
  • 原文地址:https://www.cnblogs.com/ixenos/p/5849934.html
Copyright © 2011-2022 走看看