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是“\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 嵌套流、文本的输入输出和存储的更多相关文章
- Java IO 过滤流 BufferedInput/OutputStream
Java IO 过滤流 BufferedInput/OutputStream @author ixenos 概念 BufferedInput/OutputStream是实现缓存的过滤流,他们分别是Fi ...
- Java IO 节点流 ByteArrayInput/OutputStream
Java IO 节点流 ByteArrayInput/OutputStream @author ixenos ByteArrayInputStream 包含一个内部缓冲区(字节数组byte[]),该缓 ...
- Java IO: 字符流的Piped和CharArray
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...
- Java Io 字符流
Java Io 字符流包含: 1. InputStreamReader 它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite 它是char流到byt ...
- Java IO 转换流 字节转字符流
Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...
- Java IO 节点流 FileInput/OutputStream
Java IO 节点流 FileInput/OutputStream @author ixenos 节点流之 文件流 文件读写是最常见的I/O操作,通过文件流来连接磁盘文件,读写文件内容 1.文件的读 ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- Java IO: 字符流的Buffered和Filter
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...
- Java IO包装流如何关闭?
问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: ...
随机推荐
- C# WinForm 类似QQ靠近屏幕边缘隐藏显示
当窗体离屏幕四周一定距离时,改变窗体位置,引导窗体靠边:靠边后,当鼠标离开窗体时,改变窗体位置,窗体隐藏,凸出一点在屏幕内:隐藏后,当鼠标移到窗体时,窗体显示. using System; using ...
- CentOS7安装和配置Nginx(https)
安装Nginx下载安装包# wget http://nginx.org/download/nginx-1.11.7.tar.gz# tar -zxvf nginx-1.11.7.tar.gz# cd ...
- C++引用(&)详解
C++引用详解 引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引 ...
- 9.XML文件解析
一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...
- javaScript设计模式之常用工厂模式
工厂函数 定义 由一个工厂对象决定创建某一种产品对象类的实例,主要用来创建同一类对象. 使用场景 比如说你是到一个买宠物的店,里面有很多不同的宠物,你只需要说出宠物的名字给店员就行了. // 狗的类 ...
- find中的-print0和xargs中-0的区别
默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: [bash-4.1.5] ; ls -l total 0 -r ...
- nodejs 中es5 模块的几种写法
1. module.exports.func = function(){} module.exports.field = ''; 第一种是逐个对api 和字段导出. 2. module.export ...
- Linux下服务器环境的搭建和配置之一——Apache篇
最近一个多月(2016-06-20开始至今),一直在忙海外广告平台FAQ系统的开发,既要负责服务器环境的搭建,又要写前端,还要写后台和数据库,甚至还要考虑产品需求和设计.所以是一个很大的挑战,对自身也 ...
- Conversion to Dalvik format failed with error 1(android)
1.如果不修改android sdk版本,则使用project clean 命令作用于某工程即可. (该处理方式只是在高版本中兼容了低版本工程,未真正意义上的升级) 2.如果修改android sdk ...
- jQuery的9中构造函数
// 接受一个字符串,其中包含了用于匹配元素集合的 CSS 选择器 jQuery([selector,[context]]) // 传入单个 DOM jQuery(element) // 传入 DOM ...