java学习笔记14-字节流字符流

数据的流动以内存为基准,可以分为输入input和输出output,即流向内存是输入流,流出内存是输出流

java的io操作主要是指用java.io包下的内容进行输入和输出的操作.输入也叫读取数据,输出也叫写出数据.

io分类,根据数据的流向可以分为输入流和输出流
输入流:把数据从其他设备上读取到内存的流 输出流:把数据从内存中写出到其他设备的流

根据数据的类型可以分为字节流和字符流
字节流:以字节为单位,读写数据的流 字符流:以字符为单位读写数据的流

字节流和字符流的顶级父类为: OutPutStream(字节输出流) InPutStream(字节输入流) Reader(字符输入流) Writer(字符输出流)

一切皆字节,字节流可以传输任意类型文件,无论使用什么样的流,底层传输的都是二进制的数据

java.io.OutPutStream 字节输出流抽象类,是所有字节输出流的超类,将指定的字节信息写入到目的地
字节输出流的共性方法
public void close()关闭此输出流并释放所有与此流相关联的系统资源 当完成流操作后必须调用此方法,释放系统资源
public void flush()刷新此输出流并强制将任何缓冲的输出字节写出
public void write(byte[]b) 将b.length字节从指定的字节数组中写入此输出流
public void write(byte[]b,int off,int len) 从指定的字节数组中写入len长度的字节,从偏移量off开始写入到此输出流
public abstract void write(int b) 将指定的字节写入到此输出流
虽然int类型有4个字节,但只会保留一个字节的信息输出

java.io.FileOutPutStream是文件输出流,作用是将数据写出到文件 构造方法需传入一个文件路径对象或文件路径字符串,作为数据输出的目的地
当创建一个文件输出流时必须传入一个文件路径(字符串或对象),该路径下如果没有文件,会创建一个文件,如果有会清空这个文件(但是不能创建目录)

调用流的写操作过程如下:程序->JVM->操作系统->操作系统写的功能->写出 ,每个流都会占用系统资源及内存,所以用完了要close释放资源

流在写入一个字节的时候会把10进制的97转换成2进制的1100001,因为硬盘中存储的数据都是字节 1个字节=8个二进制的比特位

任意的文本编辑器在打开文件的时候,都会查询编码表,把字节转换为字符表示 0-127查询ASCII码表,其他查询系统默认码表 所以输入的97显示是a

如果输出流写入的文件中显示100,那么需要写入3个字节 49 48 48

数据追加续写:每次创建一个输出流,默认情况下都会清空已有的文件.通过构造方法可以实现追加续写. public FileOutPutStream(File file/String pathname,boolean append) 默认情况下append是FALSE

回车符\r(回到一行的开头,return) 换行符是\n(下一行,newLine) Windows里面每行结尾是回车+换行 即\r\n linux系统里面每行结尾只有换行 \n Mac系统里每行结尾是回车 即\r 从Mac OS X开始和linux统一

java.io.InPutStream抽象类是所有字节输入流的超类,可以读取字节信息到内存中

public void close() 关闭流并释放相关联的资源
public abstract int read() 从输入流中读取下一个字节
public int read(byte[]b) 从输入流中读取字节数据并存储到字节数组b中

FileInPutStream 文件输入流,从文件中读取字节数据到输入流,构造方法为传递一个文件路径对象或字符串
当创建一个文件输入流对象时必须传入一个文件路径字符串或对象,如果该文件路径不存在,会抛出FileNotFindException

read方法,读取字节,每次读取一个字节的数据,读到文件的末尾返回-1 虽然读取了一个字节但是会自动提升为int类型

使用字节数组读取,每次读取b.length长度的字节,返回读取到的有效字节长度,将读取的内容存放到字节数组中,读到文件的末尾返回-1
使用数组读取,每次读取多个字节,减少了系统io操作的次数,从而提高了读写效率.

流的关闭原则是:先开后关,后开先关

字符流专门用于处理文本文件

java.io.Reader 抽象类是所有字符输入流的超类,可以读取字符数据到内存中

public int read() 从输入流读取一个字符
public int read(char[]arr) 从输入流中读取一些字符并存入到字符数组中

java.io.FileReader类是 读取字符文件的便利类 构造时使用系统默认的字符编码集和默认字节缓冲区

字符编码:就是字符与字节的对应规则 Windows系统中中文编码默认的是GBK编码表 idea中默认的UTF-8
字节缓冲区,一个字节数组,用来临时存储字节数据

构造方法FileReader(文件路径字符串或对象)

java.io.Writer抽象类是所有字符输出流的超类,用于将指定字符信息写出到目的地
public void write(int c) 写入单个字符
public void write(char[]chars)写入字符数组
public abstract void write(char[]chars,off,len) 写入字符数组的一部分,off开始索引,len指写入的字符个数
public void write(String s) 写入字符串
public void write(String s,off,len) 写入字符串的一部分,off字符串开始索引,len指写入字符的个数
public void flush() 刷新该流的缓冲
public void close() 关闭此流并释放相关联的系统资源,但在关闭之前需要先刷新该流的缓冲

java.io.FileWriter是写出字符信息到文件的便利类 构造时使用系统默认的字符编码和字节流缓冲区 如果未调用close方法数据只写到了缓冲区,不会写入到文件

因为内置缓冲区的原因,如果不关闭流就不能写出数据到文件,如果关闭了流就无法继续写出.如果想要写出到文件又不关闭流,那就可以调用flush方法

io异常在实际开发中要用try catch finally代码块来处理(jdk7以前是这样的)

jdk7的新特性 不用finally了 try(定义对象的语句){可能发生异常的语句} catch(异常类型 变量名){ 异常处理逻辑} try后面多了个括号,把定义变量的语句放进去就可以 因为变量的作用域就是try的大括号,而且try执行完毕后会自动释放资源,不用finally了,也不用手动关闭资源了

jdk9的新特性和jdk7 的新特性差不多 无非就是try的小括号内直接传流的对象名 在try上面写创建流对象的语句(还得throws抛异常) 感觉比jdk7的还麻烦些 不用手动关闭流无finally

java.util.Properties 继承于Hashtable 表示一个持久的属性集 它采用键值结构存储数据 每个键及其值都是字符串 System.getProperties()方法就是返回一个Properties对象
public Object setProperty(String key,String value) 保存一对属性值并返回旧的value值,没有旧值返回null
public String getProperty(String key) 根据键从该属性列表中获取值
public Set stringPropertyNames() 获取所有键的名称的集合

与流相关的方法 public void load(InPutStream input) 从字节输入流中读取键值对. 参数中使用了字节输入流,通过流就可以关联文件,从而从文件读取数据 文本数据的格式是: 必须是键值对形式,可以用等号\冒号\空格等分开(每一对属性必须换行)

猜你喜欢

转载自blog.csdn.net/wwzzh1989/article/details/89208971