廖雪峰Java6 IO编程-3Reader和Writer-1Reader
1.java.io.Reader和java.io.InputStream的区别
| InputStream | Reader |
|---|---|
| 字节流,以byte为单位 | 字符流,以char为单位 |
| 读取字节(-1,0-255):int read() | 读取字符,(-1,0-65535):int read() |
| 读到字节数组:int read(byte[] b) | 读到字符数组:int read(char[] c) |
| int read(byte[] b, int off, int len) | int read(char[] c, int off, int len) |
2.Reader
java.io.Reader是所有字符输入流的超类:
- int read():
* 读取下一个字节,并返回字符的int值 (0-65535)
* 如果已读取到末尾,返回-1
* read()方法是阻塞(blocking)的,必须等待read()方法返回才能执行下一行代码 - int read(char[] c):读取若干字符并填充到char[]数组,返回读取的字符数
- int read(char[] c, int off, int len):指定char[]数组的偏移量和最大填充数
- void close():关闭Reader
2.1完整的读取一个Reader的所有字符:
方法1:手动关闭
方法2:使用try...finally
方法3:使用try(resource)自动关闭
public class Main {
public static void main(String[] args) throws IOException,ClassNotFoundException {
String file = "./src/main/java/com/testList/Person.txt";
readFile1(file);
System.out.println();
readFile2(file);
System.out.println();
readFile3(file);
}
static void readFile1(String file) throws IOException{
//手动关闭
Reader reader = new FileReader(file);
int n;
while((n=reader.read())!=-1){
System.out.print((char)n);
}
reader.close();
}
static void readFile2(String file) throws IOException{
//使用finally关闭
Reader reader = null;
try{
reader = new FileReader(file);
int n;
while((n=reader.read())!=-1){
System.out.print((char)n);
}
}finally {
if (reader!=null){
reader.close();
}
}
}
static void readFile3(String file) throws IOException{
//自动关闭
try(Reader reader = new FileReader(file)){
int n;
while((n=reader.read())!=-1){
System.out.print((char)n);
}
}
}
}

### 2.2利用缓冲区一次读取多个字符
read()单个返回char,利用竹筒则返回竹筒的长度
```#java
public static void main(String[] args) throws IOException,ClassNotFoundException {
String file = "./src/main/java/com/testList/Person.txt";
try(Reader reader = new FileReader(file)){
char[] buffer = new char[10];
int n;
while((n=reader.read(buffer))!= -1){
System.out.println(n);
}
}
}
```

### 2.3CharArrayReader可以在内存中模拟一个Reader
```#java
public static void main(String[] args) throws IOException,ClassNotFoundException {
char[] data = {'H','e','l','l','o'};
try(Reader reader = new CharArrayReader(data)){
int n;
while((n=reader.read())!=-1){
System.out.println((char)n);
}
}
}
```
## 3.Reader和InputSteam的关系
Reader实际上是基于InputStream构造的:
* FileReader内部持有一个FileInputStream
* Reader可以通过InputStream构造
```#java
InputStream input = new FileInputStreamReader(filename);
Reader reader = new InputStreamReader(input, "UTF-8");
...
reader.close();//当reader执行close时,会调用input的close方法关闭流。因此无需再针对input执行close方法
```
示例
```#java
public static void main(String[] args) throws IOException,ClassNotFoundException {
String file = "./src/main/java/com/testList/Person.txt";
try(Reader reader = new InputStreamReader(
new FileInputStream(file),"UTF-8")){
int n;
while((n=reader.read())!=-1){
System.out.print((char)n);
}
}
}
```

4.总结:
- Reader定义了所有字符输入流的超类
- FileReader实现了文件字符流输入
- CharArrayReader在内容中模拟一个字符流输入
- Reader是基于InputStream构造的:
* FileReader使用系统默认编码,无法指定编码
* 可以通过InputStreamReader指定编码 - 使用try(resource)保证Reader正确关闭
廖雪峰Java6 IO编程-3Reader和Writer-1Reader的更多相关文章
- 廖雪峰Java6 IO编程-3Reader和Writer-2Writer
1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):v ...
- 廖雪峰Java6 IO编程-2input和output-4Filter模式
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...
- 廖雪峰Java6 IO编程-2input和output-7序列化
1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...
- 廖雪峰Java6 IO编程-2input和output-6classpath资源
1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linu ...
- 廖雪峰Java6 IO编程-2input和output-5操作zip
1.ZipInputStream是一种FilterInputStream 可以直接读取zip的内容 InputStream->FilterInputStream->InflateInput ...
- 廖雪峰Java13网络编程-1Socket编程-2TCP编程
1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...
- 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
- 廖雪峰Java13网络编程-1Socket编程-5UDP编程
1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...
随机推荐
- 注册一个gitHub
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代 ...
- Windows IIS服务挂载NAS共享文件存储
本文介绍如何结合阿里云NAS的SMB协议支持和ECS Windows虚拟机,使用Windows内置的互联网信息服务(IIS)来提供Web和FTP服务. 阿里云文件存储服务NAS主要面向阿里云ECS 实 ...
- python全栈开发笔记---------数据类型-----字典dict
字典 #dict #1.基本结构 info= { "k1" : "v1", #键值对 "k2" : "v2" } ### ...
- day060 ajax文件上传 json补充
请求头ContentType 文件上传时需要指定请求头,常见的类型有3种: 1.application/x-www-form-urlencoded(可以类比成在url后面拼接的形式发送,即a=1&am ...
- 基于FPGA的1553B通信模块的设计(转)
reference:http://www.21ic.com/app/eda/201808/798483.htm https://www.milstd1553.com/ [导读] 摘 要: 提出一种将F ...
- R语言安装xlsx包,读入excel表格
开学的时候,男神给了数据(.xlsx格式)让用R语言分析分析,作为编程小白,读了一天都没读近R,更别提如何分析了. 现在小伙伴们都喜欢读txt 和csv格式的,好多xlsx的表格读不进R,将xlsx格 ...
- effective java——31用实例域代替序数
1,永远不要根据枚举的序数导出与它关联的值,而是要将他保存在一个实例域中.(ordinal()) public enum Ensemble { SOLO, DUET, TRIO, QUARTET, Q ...
- 自动化测试-14.selenium加载FireFox配置
前言 有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile ...
- leetcode 421.Maximum XOR of Two Numbers in an Array
题目中给定若干个数,然后任意选定两个数使得其异或值最大. 先利用样例中的: 3 10 5 25 2 8 这些数转换为二进制来看的话那么是先找到最高位的1然后与数组中其他的数相与后的数值保存到set中去 ...
- 20155219 mybash的实现
第五周加分题--mybash的实现 题目要求 1.使用fork,exec,wait实现mybash 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) ...