Java 字符流与基本IO
字符流基类
java.io包中专门用于字符流处理的类,是以 Reader 和 Writer 为基础派生的一系列类。字符流以字符为单位,根据码表映射字符,一次可能读多个字节,只能处理字符类型的数据。Reader 是所有的输入字符流的父类,它是一个抽象类。Writer 是所有的输出字符流的父类,它也是一个抽象类。二者包含的方法与 InputStream 和 OutputStream 类似,具体可以查看:JDK 1.6 在线中文手册。
InputStreamReader 和 OutputStreamWriter 是 java.io 包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介:从字节输入流读入字节,并按编码规范转换为字符;往字节输出流写字符时先将字符按编码规范转换为字节。使用这两者进行字符处理时,在构造方法中应指定一定的平台规范,以便把以字节方式表示的流转换为特定平台上的字符表示。

缓存流
同样的,为了提高字符流处理的效率,java.io 中也提供了缓冲流 BufferedReader 和 BufferedWrite。其构造方法与 BufferedInputStream 和 BufferedOutPutStream 相类似。另外,除了 read() 和 write() 方法外,缓存流还提供了整行字符处理方法:
- public String readLine():BufferedReader 的方法,从输入流中读取一行字符,行结束标志\n、\r或者两者一起(这是由具体系统而定的)
- public void newLine():BufferedWriter 的方法,向输出流中写入一个行结束标志,它不是简单地换行符\n或\r,而是系统定义的行隔离标志(line separator)。
文件流
与 FileInputStream 、FileOutputStream 字节流相对应的是 FileReader、FileWriter 字符流,其分别是 Reader 和 Writer 的子类,构造方法分别如下:
FileReader(String filename);
FileWriter(String filename);
字节流不能直接操作 Unicode 字符,所以 Java 提供了字符流。由于汉字在文件中占用两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为,在 Unicode 字符中,一个汉字被看作一个字符。
FileReader 流顺序的读取文件,只要不关闭流,每次调用 read 方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。有的时候需要整行读取,比如一个学生名单文件,每个姓名占一行,想要读取名字的话就必须读取一行,但是 FileReader 类没有提供这种方法,可以使用上面的缓存流中介绍的两个方法。类似地,可以将 BuffeerWriter 流和 FileWriter 流连接在一起,然后使用 BufferWriter 流将数据写到目的地。
基本IO
读取输入
Java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。读取“标准输入流”System.in(即通过控制台进行输入),首先需要构造一个 Scanner 对象,并与“标准输入流”System.in关联。
Scanner in = new Scanner(System.in);
然后就可以使用Scanner类的各种方法实现输入操作了,下面是常用的一些方法:
| 方法 | 描述 |
|------|------|
| String nextLine() | 读取输入的下一行内容 |
| String next() | 读取输入的下一个单词(以空格作为分隔符) |
| int nextInt() | 读取并转换下一个表示整数的字符序列 |
| double nextDouble() | 读取并转换下一个表示浮点数的字符序列 |
| boolean hasNext() | 检测输入中是否还有其他单词 |
| boolean hasNextInt() | 检测是否还有表示整数的下一个字符序列 |
| boolean hasNextDouble() | 检测是否还有表示浮点数的下一个字符序列 |
>**注:**在读取前我们一般需要用相应的 has 方法判断是否还有输入的数据。next方法会自动去掉有效字符之前的空格。Scanner 类定义在java.util包中,在程序的最开始应添加上一行:
>```java
>import java.util.*;
>```
格式化输出
print方法将以对应数据类型所允许的最大非零数字位数打印输出,如:
double x = 10000.0/3.0;
System.out.print(x);
会打印:3333.3333333333335。
Java SE 5.0沿用了C语言库函数中的printf方法,格式说明符的语法图如下:
参数索引、美元符号及t与日期和时间的格式化输出有关,具体可以查看:Java.util 包 Data类:日期格式化。
用于printf的标志:
用于printf的转换字符:
println方法就是输出并终止行。这些方法都由类PrintStream定义,System.out是该类对象的一个引用。PrintStream继承了OutoutStream类,并且实现了方法write(),但实际上没有上面的方法方便,并不经常使用。
文件输入与输出
//构造一个从给定未见读取数据的Scanner
Scanner(File f);
//构造一个给定字符串读取数据的Scanner
Scanner(String data);
//构造一个将数据写入给定文件的PrintWriter
PrintWriter(File f);
//构造一个将数据写入文件的PrintWriter。
PrintWriter(String fileName);
//用给定文件名,构造一个描述文件的File对象。注意这个文件当前不必存在。
File(String fileName);
如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。成功创建了Scanner对象后,就可以使用上面介绍的常用方法来从文件读取,而PrintWriter也可以使用print、printf和println来写入文件。还有需要注意的是,Scanner构造方法直接写字符串的文件名的话,它会直接把这个字符串当做输入,而不是从文件读取。
参考资料
- 实验楼:JDK 核心 API
- Java核心技术 卷Ⅰ基础知识 原书第8版
- Java2实用教程 (第三版)_ 耿祥义,张跃平
Java 字符流与基本IO的更多相关文章
- Java 字符流实现文件读写操作(FileReader-FileWriter)
Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...
- java字符流操作flush()方法及其注意事项
java字符流操作flush()方法及其注意事项 flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...
- [Java] 字符流 Writer,输出字符数据PrintWriter
package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...
- [Java] 字符流Reader,读取字符数据
package test.stream; import java.io.BufferedReader; import java.io.FileNotFoundException; import jav ...
- Java字符流和字节流对文件操作
记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...
- java字符流实现文件间的内容复制
package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...
- java 字符流 字节流
java对文本文档进行操作(拷贝.显示)出现乱码一般来说,可以从两个方面入手. 1.文本文件本身的编码格式. 2.java代码中处理文本文件的编码格式. 这里要注意的一点是,我们可以看出copyFil ...
- Java 字符流读写文件
据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWrite ...
- java字符流与字节流的区别是什么
java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...
随机推荐
- Implicit super constructor xx() is undefined for default constructor. Must define an explicit constructor
错误:Implicit super constructor xx() is undefined for default constructor. Must define an explicit c ...
- Lambda表达式&匿名方法
“Lambda表达式“(lambda Expression)就是一个匿名函数(匿名方法),lambda表达式基于数学中的入演算得名. lambda运算符:所有的lambda表达式都是用新的lambda ...
- SecureCRT远程连接Linux下的sqlplus中退格键不能使用之解决方法
^H不是H键的意思,是backspace 主要是当你的终端backspace有问题的时候才需要设置 在linux环境下使用sqlplus,在回删(backspace)时往往会出现 一串的乱码.出现 ...
- CentOS6.5下连网以及输入法下载
宽带拨号连网: 1.系统--首选项--网络连接(或点击桌面右上角连网图标--VPN连接--VPN配置) 2.添加--选择DSL--勾自动连接(也可不勾)--DSL下填写用户名.密码--应用 ...
- 图解 CMS 垃圾回收机制,你值得拥有(转 强烈推荐)
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 ...
- 几个css3动画库
Hover.css 查看演示: http://ianlunn.github.io/Hover/ github地址: https://github.com/IanLunn/Hover Animate.c ...
- MYSQL建表问题(转)
今天在dos下准备新建一个数据表,但一直出错,如下 后面在网上查了好久,终于找到了原因.创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上 ...
- web杂记-禁止输入框自动填充文字
1:背景 公司基于业务需求开发了一套纯JS的时间控件,本来用得好好得.后来发现在部分浏览器下使用该时间控件会出现输入框自动填充的部分与控件的展示产生了冲突: 如图: 2:问题分析 因为部分浏览太人性化 ...
- SPOJ:LCS2 - Longest Common Substring II
题面 给定一些字符串,求出它们的最长公共子串 输入格式 输入至多 \(10\) 行,每行包含不超过 \(100000\)个的小写字母,表示一个字符串 输出格式 一个数,最长公共子串的长度 若不存在最长 ...
- Typescript中一些不理解的概念解释(泛型、断言、解构、枚举)
新的项目想使用typescript,因此又对其概念及使用过一遍,本文主要记录下对之前一些概念不太理解的地方. 1.泛型 定义: 在定义函数.接口或者类的时候,不预先指定具体的类型,而是在使用的时候再指 ...


