days19--IO流之字节流

Posted 安小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了days19--IO流之字节流相关的知识,希望对你有一定的参考价值。

IO流:

IO:输入/输出(input/output)
流:抽象的概念,数据传输的总称
IO流:用来处理设备之间数据传输问题

input:读数据(硬盘->内存)
output:写数据(内存->硬盘)

IO流分类:

按数据流的方向:输入流、输出流
输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流

按处理数据单位:字节流、字符流
字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。

按功能:节点流、处理流

节点流:直接操作数据读写的流类,比如FileInputStream

处理流:对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能,例如BufferedInputStream(缓冲字节流)

使用:记事本打开内存看得懂就字符,看不懂就字节,不知道使用什么流直接字节(字节流是万能流)

常见字节输入流

1.InputStream:InputStream是所有字节输入流的抽象基类,前面说过抽象类不能被实例化,实际上是作为模板而存在的,为所有实现类定义了处理输入流的方法。
2.FileInputSream:文件输入流,一个非常重要的字节输入流,用于对文件进行读取操作。
3.PipedInputStream:管道字节输入流,能实现多线程间的管道通信。
4.ByteArrayInputStream:字节数组输入流,从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去。
5.FilterInputStream:装饰者类,具体的装饰者继承该类,这些类都是处理类,作用是对节点类进行封装,实现一些特殊功能。
6.DataInputStream:数据输入流,它是用来装饰其它输入流,作用是“允许应用程序以与机器无关方式从底层输入流中读取基本 Java数据类型”。
7.BufferedInputStream:缓冲流,对节点流进行装饰,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送,效率更高。
8.ObjectInputStream:对象输入流,用来提供对基本数据或对象的持久存储。通俗点说,也就是能直接传输对象,通常应用在反序列化中。它也是一种处理流,构造器的入参是一个InputStream的实例对象。

IO使用步骤:

1.创建对象(1.调用底层系统操作文件,2.创建流(管道:数据传输),3.流指向文件(管道和文件之间建立连接))
2.关闭资源(多个流可能同时打开一个文件,可能会出现问题)
3.调用方法

文件字节输出流FileOutputStream
OutputStream:是所有字节输出流的抽象父类

构造:

覆盖:

FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。
FileOutputStream(new File)创建文件输出流以写入由指定的 File对象表示的文件。

追加:

FileOutputStream(String name,boolean append) 创建文件输出流以指定的名称写入文件。
FileOutputStream(new File,boolean append)创建文件输出流以写入由指定的
File对象表示的文件。

写入的方法:

write(int b) 将指定的字节写入文件,一次写一个字节
write(byte[] b) 将指定的字节数组写入文件,一次写一个字节数组
write(byte[] b,int off,int len) 将指定的字节数组,从偏移量off开始写入文件,一次写len个字节,一次写数组的一部分

换行符:不同的操作系统中有不同的换行符

windows:\\r\\n
linux:\\n
mac:\\r
常用\\n

文件字节输入:FileInputStream
InputStream:所有字节输入流的抽象父类

构造:

FileInputStream(String name) 创建文件输入流以指定的名称读取文件数据。 注意:不能创建文件只能做查找

读数据方法:

read():一次读取一个字节,返回值为十进制
read(byte[] b):一次读取一个字节数组,返回值为读取数据的个数
read(byte[] b,int off,int len):使用当前数组的一部分读取数据,返回值为读取数据的个数
注意:read(byte[] b,int off,int len)不循环读取数据

循环读取数据的写法:

int i;
while((i=读取数据方法)!=-1){ sout(输出数据)
}
注意:一次read获取一次数据,所以每次循环只能获取一次数据(除非有特殊的需求)

编码集:

计算机中存储的信息都是使用的二进制的方式,而我们所看的英文\\汉字都是二进制转换之后的结果 例如:a 97 01100001

按照某种规则,将字符存储到计算机中,称之为编码,反之将存储在计算机中的二进制按照某种规则进行解析,称之为解码

注意:编码和解码所使用的规则要保持一直,不然会出现乱码问题 这里的规则就是编码表

常用编码表:ASCII,GBK,Unicode
Unicode统一编码表,标准万国码,使用最多4个字节的数字表达字母,有三种编码格式,UTF-8 UTF-16和UTF32,常用UTF-8

编码:
byte[] getBytes():使用平台的默认字符编码集将String存储字节数组
byte[] getBytes(String chareName):使用指定的编码集String存储字节数组

解码:
String(byte[] bytes):通过默认字符集解码指定的数组来构造新的String
String(byte[] bytes,String chareName):通过指定字符集解码指定的数组来构造新的String

注意:编码和解码所随用的编码集要保持一直,不然会出现乱码问题

以上是关于days19--IO流之字节流的主要内容,如果未能解决你的问题,请参考以下文章

Java文件流之字节流

I/O流之字节流

Java基础:IO流之字节流和字符流

Java基础:IO流之字节流和字符流

javaio流之字节流转为字符流:java.io.OutputStreamWriter和java.io.InputStreamReader

days20--IO流之字符流