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的更多相关文章

  1. 廖雪峰Java6 IO编程-3Reader和Writer-2Writer

    1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):v ...

  2. 廖雪峰Java6 IO编程-2input和output-4Filter模式

    1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...

  3. 廖雪峰Java6 IO编程-2input和output-7序列化

    1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...

  4. 廖雪峰Java6 IO编程-2input和output-6classpath资源

    1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linu ...

  5. 廖雪峰Java6 IO编程-2input和output-5操作zip

    1.ZipInputStream是一种FilterInputStream 可以直接读取zip的内容 InputStream->FilterInputStream->InflateInput ...

  6. 廖雪峰Java13网络编程-1Socket编程-2TCP编程

    1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...

  7. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  8. 廖雪峰Java13网络编程-1Socket编程-5UDP编程

    1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr ...

  9. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

随机推荐

  1. django中邮件、日志的配置

    邮件的发送及配置 # 配置邮件 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com EMAIL_PORT ...

  2. 洛谷P1030求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...

  3. 【转】ASP.NET Core开发之HttpContext

    ASP.NET Core中的HttpContext开发,在ASP.NET开发中我们总是会经常用到HttpContext. 那么在ASP.NET Core中要如何使用HttpContext呢,下面就来具 ...

  4. 老司机浅谈linux系统学习技巧

    Linux起源于20世纪70年代,是一种优秀的操作系统系统.初次接触到linux这个系统是在大学期间,这样才发现除了windows外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它 ...

  5. spoj mgame

    题解: f[i][j]表示先后手最大差 g[i][j]表示在最大差的时候是否有后手没得走 代码: #include<bits/stdc++.h> using namespace std; ...

  6. yii2 中excel表导出

    首先下载phpexcel 在引入类文件(在web中index.php入口文件或者控制器中引入) require_once dirname(dirname(__FILE__)).'/excel/PHPE ...

  7. 为你详解Linux安装GCC方法

    下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/查 ...

  8. 第一个java程序以及java的运行机制

    课堂要点: 编写第一个java程序以及理解java的运行机制. 1.基本命令介绍: javac命令: 编译java文件得到.class字节码文件 -encoding 参数:指定编译的编码 java命令 ...

  9. fullpage 中输入框弹起 页面上移问题处理

    fullpage页面要是有输入框的话  点击输入框 键盘弹出的时候会把输入框也顶起来 页面就会向上移 但是键盘收回的时候页面还是上移的状态 对于这个问题只在android手机上出现  为了解决这个问题 ...

  10. 重开Vue2.0

    目录: 内容: 一.Vue内部指令: 1.v-if v-else&v-show v-if与v-show都是选择性显示内容的指令,但是二者之间有区别: 1.v-if:判断是否加载,在需要的时候加 ...