您的位置 首页 java

JAVA基础之IO流知识总结(够详细吗?)

一、 IO 流体系图

JAVA基础之IO流知识总结(够详细吗?)

IO常用的几个流:

JAVA基础之IO流知识总结(够详细吗?)

【I/O流原理作用】 Input/Output:输入输出机制输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。输出机制:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)。

二、流的分类:

通过不同的方法,可以对于进行分类。

1. 按照功能来划分:

输入流:只能从中读取数据,而不能向其写入数据。输出流:只能向其写入数据,而不能从中读取数据。

2. 按照处理单元来划分

字节流和字符流操作的方式基本上完全相同。操作的数据单元不同字节流:操作的是8位的字节 InputStream/OutputStream 作为字节流的基类字符流:操作的是16位的字符 Reader/Writer 作为字符流的基类

关于字节流和字符流的区别?

  1. 字节流读取的时候,读到一个字节就返回一个字节。字符流使用字节流读到一个或多个字节(中文对应的字节是两个,UTF-8码表中是三个)时,先去查指定的
    编码表,将查到的字符返回。
  2. 字节流可以处理所有类型的数据,如图片、mp3、视频等。 字符流只能处理字符数据。
  3. 字节流输入流都是以InputStream结尾,字节输出流都是以OutputStream结尾。在InputStream或者OutputStream前面代表这个流的作用。

字符流输入流都是以Reader结尾,字符输出流都是Writer结尾,相同的字符流前面的代表这个流的作用。

实际上字节流在操作的时候本身是不会用到缓存区的,是文件本身的直接操作的,但是字符流在操作的时候下会用到缓冲区,是通过缓冲区来操作文件的。

使用字节流好还是字符流好?

答案 : 字节流, 因为硬盘上所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但字符流只是在内存中才会形成的,所以在实际开发中,字节流使用更为广泛。总结: 如果是处理纯文本数据,就要优先考虑字符流,除此之外都是用字节流。

3. 按照角色进行划分

节点流:可以直接从/向外部设备读取/写入数据的流,称之为节点流,节点流也被称之为低级流。处理流:对于已经存在的流进行了连接和封装,扩展了原来的读/写的功能。处理流也被称之为高级流。 Java的io包当中包括40多个流,他们都有紧密的联系和使用的规律,这些流都源于4个抽象基类。 InputStream / Reader : 所有的输入流的基类,前者是字节输入流,后者是字符输入流。OutputStream/Writer :所有输出流的基本,前者是字节输出流,后者是字符输出流。

三、 file

  • File类的由来: File 类的出现弥补了 IO流 的不足,IO只能够操作数据,但是不能够对文件的信息做操作,操作文件必须使用File类

功能:

  • a. 可以将文件或者文件夹在程序当中分装成对象。
  • b. 方便对于文件或者文件夹当中的属性信息进行操作。
  • c. File类通常通过构造函数作为参数传递到流的对象当中。

2 . File类的常用方法介绍:1.构造方法:File(String pathname):这个构造可以将已存在的或者不存在的文件或者文件夹封装成File的对象,pathname即文件的的路径。File(File parent,String child):parent为child文件所在的路径。

1. 文件路径

File f6 = new File (“c:java”,”jre7”);//file的toString方法重写了,封装的地址是什么就打印什么 //’/’和’’都是目录分隔符,在其他系统当中目录分割符可能发生变化,这个写法不利于跨平台操作//最好使用File当中提供的字段separator进行分割。

2.创建文件相关函数:

createNewFile():创建相关文件。并返回布尔值createTemFile():在默认临时文件目录当中创建一个空文件,程序运行结束后就不存在了。mkdirs():创建目录,如果你写的目录的父目录不存在。他会帮你创建好。

3.删除文件相关函数:

delete():删除空目录或文件(ps只能是空目录)deleteOnExit():在虚拟机终止时删除文件。

4.判断:

exists() :判断文件或者文件夹是否存在。canExecute() :判断文件是否可执行,和操作系统相关。canRead() :判断文件是否可读canWrite() :判断文件是否可写equals(Object obj) :测试此抽象路径名与给定对象是否相等。isAbsolute() :测试此抽象路径名是否为绝对路径名。isDirectory() :判断file对象是否表示文件夹。isFile() :判断file对象是否表示文件isHidden() :判断file对象是否是隐藏文件

5.获取file对象属性信息的方法:

getAbsoluteFile() :返回此抽象路径名的绝对路径名形式。getAbsolutePath() :返回此抽象路径名的绝对路径名 字符串 。getCanonicalFile() : 返回此抽象路径名的规范形式。getCanonicalPath() :返回此抽象路径名的规范路径名字符串。getPath() : 将此抽象路径名转换为一个路径名字符串。getName() : 返回由此抽象路径名表示的文件或目录的名称。getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。getParentFile() :返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。getTotalSpace() :返回指定路径的全部空间的字节数getFreeSpace() :返回此抽象路径名指定的分区中未分配的字节数。getUsableSpace() : 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。renameTo(File dest) :重新命名此抽象路径名表示的文件。剪切

6.设置文件信息的方法:

setExecutable(boolean executable) :设置文件可执行的方法setLastModified(long time) :设置此抽象路径名指定的文件或目录的最后一次修改时间。setReadable(boolean readable) :设置文件是否可读setReadOnly() :设置文件是否只读setWritable(boolean writable) :设置文件是否可写

7.获取文件的常规信息的方法:

lastModified() :获取文件最后一次被修改的时间length() : 返回由此抽象路径名表示的文件的长度。

8.操作文件夹的相关方法

list(): 把文件夹当中包含的目录和文件都存放到字符串数组当中。listFiles():列举文件夹当中包含的目录和文件,存放到File数组当中。listRoots():列出可用的文件系统根。

9.文件过滤器: FileFilter

boolean accept(File pathname); 此接口的实例可用于传递给File类的listFiles(FileFilter)方法,用于返回满足该过滤器要求的子项File [] listFiles(FileFilter filter)

四、IO流按照功能分类

1. 节点流

字节数组流(内存流)ByteArrayInputStreamByteArrayOutputStream因为内存输出流当中又新增的方法,不能使用多态,不能够让父类的引用指向之类的对象。作用:可以在循环当中把所有的数据存放到统一的容器当中,然后在循环结束之后可以把容器当中所有的内容一起取出来。注意事项:内存流属于内存当中的资源,所以数据量不要过大,如果太大,会造成内存溢出的错误。

2.缓冲流

缓冲字节流BufferedInputStreamBufferedOutputStream缓冲字符流BufferedReaderBufferedWriter处理流内部包含了节点流,节点流决定了与其沟通的外部设备,而处理流则增加了其功能。缓冲流的好处:缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,最后缓冲区域当中的内容,会全部返回给程序。从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。简单说:没有缓存区,那么每read一次,就会发送一次IO操作;有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。处理流处理数据和节点流处理数据的方法基本上完全相同。

3.转换流

转换流作用:把字节流转换成字符流,可以解决出现的因为编码集和解码集造成的乱码问题。

  • InputStreamReader:
  • OutputStreamWriter:
  • 编码:字符—–编码字符集——–》二进制
  • 解码:二进制—解码字符集———》字符
  • 在处理文件时,如果文件的字符格式和编译器处理格式不一样时,会出现乱码问题。比如文件字符格式GBK,
  • 而编译器是UTF-8格式,那么就会产生该问题。

出现乱码问题的原因:

  • 1.编码和解码字符集不一致造成了乱码
  • 2.字节的缺失,长度的丢失
  • 大部分情况下,出现乱码问题是因为中国汉字,因为中国汉字在不同的字符编码当中占据的字节数不相同,但是都占据多个字节。
  • 而英文字母没有这个问题,因为英文字母在所有的字符编码当中都占据一个字节。
    InputStreamReader :转换输入流–》将字节输入流转换成字符输入流
    作用:为了防止文件使用字符输入流处理时出现乱码问题。

4.数据处理流

DataOutputStreamDataInputStream 特点: 既能够保存数据本身,又能够保存数据类型(基本数据类型+String)

5. 序列化

将对象转换成字节序列的过程,就是对象序列化过程。

  • 将字节序列恢复为对象的过程称之为对象的反序列化。
  • 作用:保留对象(引用数据类型数据的)类型+数据。
  • 序列化流 :输出流 ObjectOutputStream writeObject()
  • 反序列化流: 输入流 ObjectInputStream readObject()

注意事项:

  1. 先序列化然后在反序列化,而且反序列化的顺序必须和序列化的顺序保持一致。
  2. 并不是所有的对象都能够被序列化。只有实现了 Serializable接口 的类的对象才能够被序列化。

对象当中并不是所有的属性都能够被序列化。

对象序列化的主要用途:

  1. 把对象转换成字节序列,保存到硬盘当中,持久化存储,通常保存为文件。
  2. 在网络上传递的是对象的字节序列

对象序列化的步骤:

  1. 创建对象输出流,在构造方法当中可以包含其他输出节点流,如文件输出流。
  2. 把对象通过writeObject的方式写入。

对象反序列化的步骤:

  1. 创建对象输入流,在构造方法当中可以包含其他的输入节点流,如文件输入流
  2. 通过readObject()方法读取对象。
    serialVersionUID :序列化版本id

作用:从字面角度看,就是序列化版本号。凡是实现了Serializable接口的类,都会有一个默认的静态的序列化标识。

  1. 类在不同的版本之间,可以解决序列化兼容问题,如果之前版本当中在文件中保存对象,那么版本升级后,如果序列化id一致,我们可以认为文件中的对象依然是此类的对象。
  2. 如果类在不同的版本之间不希望兼容,但是还希望类的对象能够序列,那么就在不同版本中使用不同的序列化id。

transient :当类中有属性不想被序列化,那么就使用这个修饰符修饰。

五、IO流结构流程图

文章来源:智云一二三科技

文章标题:JAVA基础之IO流知识总结(够详细吗?)

文章地址:https://www.zhihuclub.com/181937.shtml

关于作者: 智云科技

热门文章

网站地图