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. 电脑自动重启(Kernel-Power 41 (63) error)的一些解决办法

    查看是否有两个声卡驱动,如果有,尝试关闭其中一个. 可能是内存的问题,用memtest测试.如果有多于一个内存条,仅使用其中的一个试试. 更改电源设置,使机器工作在低耗状态. 更新所有驱动,尤其是主板 ...

  2. [DP之多重背包优化方法]

    首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...

  3. jquery ColorPicker 颜色选择器

    $(function() { $('#colorpickerField').ColorPicker({ onSubmit: function(hsb, hex, rgb, el) { $(el).va ...

  4. HOJ———丢手绢

    hide handkerchief Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  5. BZOJ 1303 【CQOI2009】中位数图

    baidu了一下bzoj水题列表...找到这道题.   题目大意:给定一个数t,在给定的一段包含1-n的序列中找出多少个长度为奇数子序列的中位数为t. 第一眼没看数据范围,于是开心的打了一个O(n^3 ...

  6. 【IE6的疯狂之十三】IE6下使用滤镜后链接不能点击的BUG

    大家可能都知道IE6下使用DXImageTransform.Microsoft.AlphaImageLoader滤镜(用于PNG32 Alpha透明)后链接不能点击的BUG,大家也都知道只要在a标签上 ...

  7. Jmeter(四)-断言/检查点

    断言就类似LoadRunner中的检查点.对上一个请求返回的信息,做字符串.数据包大小.HTML.XML.图片等做判断,确保返回的信息的准确性. 添加响应断言:欢迎您 如果登陆页登陆成功,则后台会返回 ...

  8. http请求的概念

    我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...

  9. 【POJ2186】受牛仰慕的牛

    受牛仰慕的牛(popular cows)  每头牛都有一个梦想:成为一个群体中最受欢迎的名牛!在一个有N(1<=N<=10,000)头牛的牛群中,给你M(1<=M<=50,00 ...

  10. Leetcode 解题报告

    347. Top K Frequent Elements Given a non-empty array of integers, return the k most frequent element ...