A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卞建彬 中级黑马   /  2018-9-28 16:53  /  645 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


day09 字节流 字符流Properties

今日API

IO流:

java.io.OutputStream抽象类: 字节输出流 (顶层类)

       // 成员方法

       void close() :释放资源

       void flush() :刷新缓冲区(对于字节流来说没有作用)

       // 写字节的成员方法

       abstract void write(int b): 一次写一个字节 (参数是int是为了代码中写表示byte的整数方便不用强转)

       void write(byte[] b): 一次写一个字节数组

       void write(byte[] b, int off, int len): 一次写一个字节数组的一部分

      

java.io.FileOutputStream类: 文件字节输出流 (向文件写数据)

       // 构造方法

       FileOutputStream(String name): 通过文件路径创建文件字节输出流

       FileOutputStream(File file): 通过File对象创建文件字节输出流

       FileOutputStream(String name, boolean append): 通过文件路径创建文件字节输出流, true可以续写

       FileOutputStream(File file, boolean append): 通过File对象创建文件字节输出流, true可以续写

      

java.io.InputStream抽象类: 字节输入流 (顶层类)

       // 常用成员方法

       void close(): 释放资源

       // 读数据的方法

       int read(): 一次读一个字节. 读到文件末尾返回-1 (返回int也是为了代码编写方便)

       int read(byte[] b): 一次读一个字节数组. 读到的字节存放在参数中的字节数组中, 返回int值是本次读到的字节的个数.读到文件末尾返回-1


java.io.FileInputStream类: 文件字节输入流

       // 构造方法

       FileInputStream(String name): 使用文件路径创建文件字节输入流

       FileInputStream(File file): 使用File对象创建文件字节输入流

      

java.io.Reader抽象类: 字符输入流 (顶层)

       // 常用成员方法

       void close() :关闭此流并释放与此流相关联的任何系统资源

       // 读数据的方法

       int read(): 一次读一个字符char, 返回读到的字符. 读到文件末尾返回-1  (返回int为了代码编写方便)

       int read(char[] cbuf): 一次读取一个字符数组char[]. 返回读取的字符个数. 读到文件末尾返回-1


java.io.FileReader类: 文件字符输入流

       // 构造方法

       FileReader(File file): 根据File对象创建文件字符输入流

       FileReader(String fileName): 根据File对象创建文件字符输入流

      

java.io.Writer抽象类: 字符输出流 (顶层类)

       // 常用成员方法

       abstract void close(): 刷新缓冲区并释放资源

       abstract void flush() :刷新缓冲区

       // 写

       void write(int c): 写一个字符 (int类型为了代码编写方便)

       void write(char[] cbuf): 写一个字符数组

       abstract void write(char[] b, int off, int len): 写一个字符数组的一部分

       void write(String str): 写一个字符串

       void write(String str, int off, int len): 写一个字符串的一部分

      

java.io.FileWriter类: 文件字符输出流

       // 构造方法

       FileWriter(File file): 通过File对象创建文件字符输出流

       FileWriter(String fileName): 通过文件路径创建文件字符输出流

       FileWriter(File file, boolean append): 通过File对象创建文件字符输出流. 第二个参数为true可以续写

       FileWriter(String fileName, boolean append): 通过文件路径创建文件字符输出流. 第二个参数为true可以续写

      

集合:

java.util.Properties类: 属性集, 属于Map的双列集合, 继承自Hashtable

       // 构造方法

       Properties(): 创建一个Properties集合

       // 可以使用Map接口中的方法

       // 特有成员方法

       Object setProperty(String key, String value): 保存/替换键值对

       String getProperty(String key): 通过键获取值. 键不存在返回null

       Set<String> stringPropertyNames(): 返回键的集合

       void store(OutputStream out, String comments): 将集合数据用字节流写入文件(不能中文), 并写入注释

       void store(Writer writer, String comments): 将集合数据用字符流写入文件(可以中文), 并写入注释

       void load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能读中文)

       void load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以读中文)


IO流IO的概念和分类IO流: 输入(Input)输出(Output)流

流: 数据流


输入: 从硬盘(文件)读取到内存(Java程序)

输出: 从内存(Java程序)写入到硬盘(文件)

       (入和出都是相对于内存来说的)

         +---------+

   输入   |         |   输出

--------> |  内存  | -------->

         |         |

         +---------+


IO流的分类:

    字节流 (读写字节: byte, 可以读写所有类型的文件, 包括视频, 图片, 音频, 文本等)

       字节输入流: java.io.InputStream 抽象类

       字节输出流: java.io.OutputStream 抽象类

    字符流 (读写字符: char, String, 只能读写文本文件)

       字符输入流: java.io.Reader 抽象类

       字符输出流: java.io.Writer 抽象类

    
  
输入流
  
  
  
输出流
  

    
字节流
    
  
字节输入流 InputStream
  
  
  
字节输出流 OutputStream
  

    
字符流
    
  
字符输入流 Reader
  
  
  
字符输出流 Writer
  

字节流计算机中一切皆为字节

计算机中, 无论文本, 视频, 音频, 图片... 一切都是以"字节byte"形式存储的

也就是以数字形式存储的, 而数字可以用不同进制表示, 计算机能看懂的是二进制数字

字节输出流:OutputStream和FileOutputStream




java.io.OutputStream抽象类: 字节输出流 (顶层类)

       // 成员方法

       void close() :释放资源

       void flush() :刷新缓冲区(对于字节流来说没有作用)

       // 写字节的成员方法

       abstract void write(int b): 一次写一个字节 (参数int便于传递byte的整数不用强转)

       void write(byte[] b): 一次写一个字节数组

       void write(byte[] b, int offset, int len): 一次写一个字节数组的一部分

      

java.io.FileOutputStream类: 文件字节输出流 (向文件写数据)

       // 构造方法

       FileOutputStream(String name): 通过文件路径创建文件字节输出流

       FileOutputStream(File file): 通过File对象创建文件字节输出流

       构造方法的作用:

               1. 创建一个FileOutputStream对象

               2. 根据构造方法传递的路径, 在磁盘上创建一个空文件 ("如果文件存在则会清空数据")

               3. 将创建的FileOutputStream对象指向这个磁盘上的文件


字节输出流: 一次写一个字节到文件

写数据的原理:

       Java程序 -> JVM虚拟机 -> OS操作系统 -> OS调用写数据的方法 -> 将数据写入文件

      

使用字节输出流写数据到文件的步骤:

       1. 创建对象: 创建FileOutputStream对象, 构造方法中传递文件路径

       2. 写入数据: 使用FileOutputStream对象调用 write(int b) 方法, 将字节写入文件

       3. 释放资源: 使用FileOutputStream对象调用 close() 方法, 关闭流对象释放资源

      

       FileOutputStream fos = new FileOutputStream("模块名\\文件名.txt");

       fos.write(97);

       fos.close();

文件存储原理和记事本打开文件的原理

向文件中写入字节数据时, 十进制的数字会被转换为"二进制"的数字写入文件


文本编辑器打开文本文件时, 会先查询编码表, 将二进制数字转换为对应的字符进行显示

       0-127: 查询ASCII码表  -128~127

       其他: 查询系统默认码表

                       Windows简体中文系统的程序打开是按 GBK 码表

                       IDEA中使用的是UTF-8 码表   


ASCII编码表: 1个byte就是一个字符  97 a

GBK编码表:  2个byte数字组成一个汉字. "你": -60, -29

UTF-8编码表: 3个byte数字组成一个汉字. "你": -28, -67, -96

字节输出流: 一次写多个字节

java.io.FileOutputStream类: 文件字节输出流 (向文件写数据)

       void write(byte[] b): 一次写一个字节数组

       void write(byte[] b, int off, int len): 一次写一个字节数组的一部分

               

Java中, byte的范围是 -128 ~ 127 共256个数值

编码表中字符范围是      0 ~ 255 共256个数值

      

写多个字节时:

       如果第一个字节是正数中的 0~127, 则记事本会查询 ASCII码表 显示字符

       如果第一个字节是负数中的:-128~-1, 则记事本会查询 GBK码表 显示字符.(将两个连续的byte组合为一个中文)

字节输出流: 续写, 换行

java.io.FileOutputStream类: 文件字节输出流

       // 带有续写 功能的构造方法, 不会清空文件

       FileOutputStream(String name, boolean append): 通过文件路径创建流,true可以续写

       FileOutputStream(File file, boolean append): 通过File对象创建流, true可以续写

      

换行符:

       Windows系统: "\r\n"

       Linux系统: "\n"

       MacOS系统: "\r"

字节输入流:InputStream和FileInputStream


java.io.InputStream抽象类: 字节输入流 (顶层类)

       // 常用成员方法

       void close(): 释放资源

       // 读数据的方法

       int read(): 一次读一个字节

               读到文件末尾返回-1 (返回int也是为了代码编写方便)

       int read(byte[] b): 一次读一个字节数组

               读到的字节存放在参数中的字节数组中, 返回int值是本次读到的字节的个数. 读到文件末尾返回-1


java.io.FileInputStream类: 文件字节输入流

       // 构造方法

       FileInputStream(String name): 使用文件路径创建文件字节输入流

       FileInputStream(File file): 使用File对象创建文件字节输入流

       构造方法的作用:

               1. 创建FileInputStream对象

               2. 将FileInputStream对象指向磁盘上的文件

字节输入流: 一次读取一个字节

Java程序从文件读取数据的原理:

       Java程序 -> JVM虚拟机 -> OS(操作系统) -> OS调用读取的方法 -> 读取磁盘文件数据

      

java.io.InputStream抽象类: 字节输入流 (顶层类)

       int read(): 一次读一个字节

               读到文件末尾返回-1 (返回int也是为了代码编写方便)

      


FileInputStream读数据步骤:

       1. 创建FileInputStream对象

       2. 使用FileInputStream对象, 调用 int read() 方法, 一次读取一个byte

       3. 释放资源

字节流读取中文问题

GBK编码中, 一个汉字占用2个byte

UTF-8编码中, 一个汉字占用3个byte

字符流字符输入流:Reader和FileReader


注意: 字符流只能读写"文本文件"


java.io.Reader抽象类: 字符输入流 (顶层)

       // 常用成员方法

       void close() :关闭此流并释放与此流相关联的任何系统资源

       // 读

       int read(): 一次读一个字符char, 返回读到的字符.

           读到文件末尾返回-1  (返回int为了代码编写方便)

       int read(char[] cbuf): 一次读取一个字符数组char[]

               返回读取的字符个数. 读到文件末尾返回-1


java.io.FileReader类: 文件字符输入流

       // 构造方法

       FileReader(File file): 根据File对象创建文件字符输入流

       FileReader(String fileName): 根据File对象创建文件字符输入流

       构造方法的作用:

               1. 创建FileReader对象

               2. 将FileReader对象指向磁盘上的文件

字符输入流: 2种方式读取文本文件

java.io.Reader抽象类: 字符输入流 (顶层)

       int read(): 一次读一个字符char, 返回读到的字符.

           读到文件末尾返回-1  (返回int为了代码编写方便)

       int read(char[] cbuf): 一次读取一个字符数组char[]

               返回读取的字符个数. 读到文件末尾返回-1


java.lang.String类:

       String(char[] value): 将char数组转换为String

       String(char[] value, int offset, int count): 将char数组的一部分转换为String

字符输出流:Writer和FileWriter


java.io.Writer抽象类: 字符输出流 (顶层类)   'a''b'  缓冲区    97 98

       // 常用成员方法

       abstract void close(): 刷新缓冲区并释放资源

       abstract void flush() :刷新缓冲区

       // 写

       void write(int c): 写一个字符 (int类型为了代码编写方便)

       void write(char[] cbuf): 写一个字符数组

       abstract void write(char[] b, int off, int len): 写一个字符数组的一部分

       void write(String str): 写一个字符串

       void write(String str, int off, int len): 写一个字符串的一部分

       注意:write()方法只是将数据写到内存缓冲区, 最后必须调用flush()或close()才能将数据真正写入磁盘


java.io.FileWriter类: 文件字符输出流

       // 构造方法

       FileWriter(File file): 通过File对象创建文件字符输出流

       FileWriter(String fileName): 通过文件路径创建文件字符输出流

       作用:

               1. 创建FileWriter对象

               2. 根据构造方法中的路径, 在磁盘上创建文件 ("如果文件已存在, 则清空文件内容")

               3. 将FileWriter对象指向磁盘上的文件

字符输出流: 一次写一个字符

void write(int c): 写一个字符(int类型为了代码编写方便)


FileWriter使用步骤:

       1.创建FileWriter对象, 构造方法中绑定要写入数据的目的地

       2.使用FileWriter中的方法 write(), 把数据写入到"内存缓冲区"中(字符转换为字节的过程)

       3.使用FileWriter中的方法 flush(), 把内存缓冲区中的数据,"刷新到文件中"

       4.释放资源 close() (会先把内存缓冲区中的数据刷新到文件中)

字符输出流:flush与close区别

区别:

       flush(): 刷新缓冲区 (将数据从内存中写入到磁盘)

       close(): 刷新缓冲区, 并释放资源. 关闭流后不能再用同一个流对象操作


flush()可以省略, 只用close()来刷新并释放资源

字符输出流: 其他方法

写的其他方法:

       void write(char[] cbuf): 写一个字符数组

       abstract void write(char[] b, int off, int len): 写一个字符数组的一部分

       void write(String str): 写一个字符串

       void write(String str, int off, int len): 写一个字符串的一部分

Properties集合Properties存储数据和遍历

Properties双列集合:

       键和值都是String 类型


java.util.Properties类: 属性集, 属于Map的双列集合, 继承自Hashtable

       // 构造方法

       Properties(): 创建一个Properties集合

       // 可以使用Map接口中的方法

       // 特有成员方法

       Object setProperty(String key, String value): 保存/替换键值对

       String getProperty(String key): 通过键获取值. 键不存在返回null

       Set<String> stringPropertyNames(): 返回键的集合

       void store(OutputStream out, String comments): 将集合用字节流写入文件(不能中文),并写入注释

       void store(Writer writer, String comments): 将集合用字符流写入文件(可以中文),并写入注释

       void load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能读中文)

       void load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以读中文)

Properties: store()存储数据到文件

Properties将数据写入到文件的方法:

       void store(OutputStream out, String comments): 将集合用字节流写入文件(不能中文),并写入注释

       void store(Writer writer, String comments): 将集合用字符流写入文件(可以中文), 并写入注释

      

使用步骤:

       1.创建Properties集合对象,添加数据

       2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地

       3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储

       4.释放资源

补充:

属性集(配置文件), 标准的后缀是.properties

配置文件格式要求:

       一行一个键值对

       键和值中间用=分隔 (标准格式, 但空格分开也行)

       #表示单行注释

Properties: load()从文件加载数据到集合

Properties将数据从文件加载到集合中的方法:

       void load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能读中文)

       void load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以读中文)


使用步骤:

       1.创建Properties集合对象

       2.使用Properties集合对象中的方法load读取保存键值对的文件

       3.遍历Properties集合

day10 缓冲流 转换流 序列化流 打印流

今日API

java.io.BufferedOutputStream类: 缓冲字节输出流

       // 构造方法

       BufferedOutputStream(OutputStream out): 使用基本流创建一个缓冲字节输出流

       BufferedOutputStream(OutputStream out, int size): 使用基本流创建一个缓冲字节输出流, 设置缓冲区大小


java.io.BufferedInputStream类: 缓冲字节输入流

       // 构造方法

       BufferedInputStream(InputStream in): 使用基本流创建一个缓冲字节输入流

       BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小

      

java.io.BufferedWriter类:

       // 构造方法

       BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流

       BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流, 设置缓冲区大小

       // 特有方法

       void newLine(): 写入一个换行符, 换行符自动根据当前系统确定

      

java.io.BufferedReader类: 缓冲字符输入流

       // 构造方法

       BufferedReader(Reader in): 使用基本流创建一个缓冲字符输入流

       BufferedReader(Reader in, int size): 使用基本流创建一个缓冲字符输入流, 设置缓冲区大小

       // 特有方法

       String readLine(): 一次读一行字符串, "不包含换行符". 读到文件末尾返回null

      

java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁

       // 构造方法

       OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流

       OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流

      

java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁

       // 构造方法

       InputStreamReader(InputStream in): 使用默认编码表创建转换流

       InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流

      

java.io.ObjectOutputStream类: 对象字节输出流

       // 构造方法

       ObjectOutputStream(OutputStream out)

       // 特有成员方法

       void writeObject(Object obj): 将对象写出

      

java.io.ObjectInputStream类: 对象字节输入流

       // 构造方法

       ObjectInputStream(InputStream in)

       // 特有成员方法

       Object readObject(): 读取对象

      

java.io.PrintStream类: 字节打印流

       // 构造方法

       PrintStream(File file): 创建字节打印流, 输出到一个文件

       PrintStream(OutputStream out): 创建字节打印流, 输出到一个字节输出流

       PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径

      

java.lang.System类:

       // 静态方法

       static void setOut(PrintStream out): 设置System.out的输出目的地为参数的打印流


缓冲流缓冲流的原理缓冲流的原理:

       底层也是使用基本流(FileXxx)来读写

       但缓冲流内部定义了一个缓冲数组, 在读的时候类似于我们一次读一个数组的方式, 减少了磁盘操作次数, 提高了程序效率

缓冲字节输出流:BufferedOutputStream

字节缓冲流

       |_ BufferedInputStream     # 缓冲字节输入流

       |_ BufferedOutputStream    # 缓冲字节输出流


字符缓冲流

       |_ BufferedReader          # 缓冲字符输入流

       |_ BufferedWriter          # 缓冲字符输出流

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马