廖雪峰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 ... 
随机推荐
- IDA Pro安装教程
			1.下载 http://tools.pediy.com/windows/disassemblers.htm 我们这里选择6.8版本下载 2.安装 打开下载的安装包,解压出来进入IDAPro68文件夹, ... 
- Win强制删除文件windows批处理强行删除文件
			一般情况下选中文件或文件夹可以直接删除文件,但是有些情况下例如:文件非常规命名.找不到文件位置等就无法直接删除. 针对这种情况可以用 bat批处理文件 删除,一下就是该方法的步骤 新建一个文件:*** ... 
- nopi 简洁笔记
			导出excel /// <summary> /// 增加二维码 /// </summary> /// <param name="dt">< ... 
- String 类型equals方法和int == 方法效率比较
			最近写了一个递归方法,在进行比较判断的时候,因为都是integer类型,而integer类型在大于127或者小于-128时会在新建一个,这是因为integer类型的拆装箱机制, 之前没有考虑过equa ... 
- numpy-随机数
			import numpy as np nr=np.random nr.seed(0) np.set_printoptions(precision=2) # 只显示小数点后2位 print(nr.ran ... 
- 编译darknet出现libpng16.so.16:对‘inflateValidate@ZLIB_1.2.9’未定义的引用
			cd /usr/lib/x86_64-linux-gnu sudo ln -s ~/anaconda/lib/libpng16.so.16 libpng16.so.16 sudo ldconfig## ... 
- dos脚本
			关于dos命令行脚本编写 dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也 ... 
- WEBBASE篇: 第五篇, CSS知识3
			CSS知识3 框模型: 一,外边距(上文) 二, 内边距 1,什么是内边距? 内边距就是内容与元素边缘之间的距离: 注: 内边距会扩大元素边框内所占的区域的 语法: padding: 四个方向的 ... 
- 转载 单例(Singleton)模式)的误区
			在创建型模式中,单例(Singleton)模式和原型(Prototype)模式相对来说其用意更为简单明了.单例(Singleton)模式确保某类只有一个实例,且自行实例化并向整个系统提供这个实例:原型 ... 
- Python全栈之路----函数进阶----生成器
			生成器特点: 不能立即产生,取一次创建一次 只能往前走 等到走到最后,就会报错 >>> a = [i for i in range(1000)] >>> a [0, ... 
