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是“\r\n”,UNIX是“\n”),也就是通过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. 写出程序:

 Public void writeData(PrintWriter out) throws IOException{

     GregorianCalendar calendar = new GregorianCalendar();
Calendar.setTime(hireDay); out.println(name+”|”+salary+”|”+calendar.YEAR+”|”+…..)
}

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

vii. public void readData(Scanner in){

 String line = in.nextLine(); //按编码读取字符

     String[] tokens = line.split(“\\|”);  //这里需要转义”|”,再转义”\”
name = tokens[0];
salary = Double.parseDouble(tokens[1]); //将字符串转为对应类型
int a = Integer.parseInt(tokens[2]); ...
}

Java IO 嵌套流、文本的输入输出和存储的更多相关文章

  1. Java IO 过滤流 BufferedInput/OutputStream

    Java IO 过滤流 BufferedInput/OutputStream @author ixenos 概念 BufferedInput/OutputStream是实现缓存的过滤流,他们分别是Fi ...

  2. Java IO 节点流 ByteArrayInput/OutputStream

    Java IO 节点流 ByteArrayInput/OutputStream @author ixenos ByteArrayInputStream 包含一个内部缓冲区(字节数组byte[]),该缓 ...

  3. Java IO: 字符流的Piped和CharArray

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...

  4. Java Io 字符流

    Java Io 字符流包含: 1. InputStreamReader  它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite  它是char流到byt ...

  5. Java IO 转换流 字节转字符流

    Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...

  6. Java IO 节点流 FileInput/OutputStream

    Java IO 节点流 FileInput/OutputStream @author ixenos 节点流之 文件流 文件读写是最常见的I/O操作,通过文件流来连接磁盘文件,读写文件内容 1.文件的读 ...

  7. Java IO 理解流的概念

    Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...

  8. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  9. Java IO包装流如何关闭?

      问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: ...

随机推荐

  1. wife信号如何传播

    方法一:像哈利波特一样穿墙而出 无论是wife信号还是广播信号本质上都属于电磁波.x光穿透力强所以可以穿透人体给体内照相,但是wife信号作为电磁波虽然也可以穿透墙而过,但是他的穿透能力实在是太弱了. ...

  2. Lintcode解题报告

    1. Num.196 寻找缺失的数 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数. 注意事项 可以改变序列中数的位置. 您在真实的面试中是否遇到过这个题 ...

  3. cos距离与欧式距离

    1. 欧氏距离(EuclideanDistance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离: ( ...

  4. StringMVC(拦截器)

    单个拦截器 使用jar包 创建FirstController.java @Controller public class FirstController { @RequestMapping(" ...

  5. ASP.NET网站怎么发布 Web项目程序怎么发布部署(暂时收藏)

    Web程序如何发布部署呢.网站项目做好了,需要发布出来,提交给客户,装上服务器.那怎么在ASP.NET开发环境中将网站程序发布出来呢 ^_^   工具/原料 Visual Studio 2010  ( ...

  6. 在MacOS下Python安装lxml报错xmlversion.h not found 报错的解决方案

    最近在看一个自动化测试框架的问题,需要用到Lxml库,下载lxml总是报错. 1,使用pip安装lxml pip install lxml 2,然后报错了,报错内容是: In file include ...

  7. 关于sbutils中的sblaunch插件的疑惑

    一.sbutils介绍 sbutils是一个开源的越狱手机基础功能的插件包,其中包含sblaunch这个启动插件,该插件可以实现命令行下面打开app并传递一个url. sbutils下载地址:http ...

  8. MediaPlayer的错误列表速查(android)

    public static final int MEDIA_ERROR_IO Added in API level 17 File or network related operation error ...

  9. centos 设置删除提示

    centos 设置删除.覆盖提示 相信好多用linux的同学都用过cp这个命令来覆盖文件,但是新建的普通用户不会有任何提示,这时候心里就咯噔一下,赶紧看看新文件的是不是传上去了.如果加上提示,是不是就 ...

  10. 9、JavaScript常用函数

    1.alert()函数 用于弹出消息对话框提示用户信息,消息对话框由系统提供,不同浏览器中字体样式可能不同,通常用于调试程序. 2.confirm()函数 弹出一个OK按钮和一个Cancel按钮的消息 ...