黑马程序员——IO(Input Output)流

时间:2023-02-19 17:46:47

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

IO(Input Output)流

概述

java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。因为文件编码的不同,而有了对字符进行高效操作的 字符流对象,字符流的原理其实就是基于字节流读取字节时,去查了指定的码表。IO流是用于处理设备行的数据的,根据处理的数据类型不同分为:字节流和字符流。根据流向不同分为:输入流和输出流。对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

字节流与字符流

java的IO流分两种流:字节流与字符流,他们都是抽象类。字符流处理的单元都是2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为一个字节,操作字节和字节数组。所以字符流是由java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好,因此只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。所有文件的存储都是字节的存储,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再存储这些字节到磁盘。在读取文件时,也是一个字节一个字节地读取以形成字节序列。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流可以。
import java.io.File; import java.io.FilenameFilter; import java.io.IOException;
public class Filename FilterDemo{ public static void main (String[ ] args){ File dir = new File("e:/java"); FileFilter filter = new FileFilter(); String[ ] filename = dir.list(filter); for(int i=0;i<filename.length;i++){ System.out.println(filename[i]); } } } class FileFiter Implements FilenameFilter{ public boolean accept(File dir,String name){ return name.endsWith(",java"); } }
字符流还具备缓冲区,缓冲区的出现提高了对流的操作效率,原理其实就是将数组进行封装。对应对象是BufferedWriter:newLine():跨平台的换行符。BufferedReader:readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。在使用缓冲区对象时,要明确缓冲的存在是为了增强流的功能而存在,所以在建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,还不过加入了数组对数据进行了临时存储。为了提高操作数据的效率。其实缓冲区中的readLine();方法,用的还是与缓冲区关联的流对象的read方法,只不过每一次读到一个字符,先不进行具体操作,先进行临时存储。当读取到回车标记时,将临时容器中存储的数据一次性返回。

字符流与字节流转换

在某些时候需要进行字符流与字节流之间的转换,那么何时使用转换流呢?我认为当字节和字符之间有转换动作时,或者流操作的数据需要编码或解码时就需要使用转换流。InputStreamReader:是从字节到字符的桥梁,OutputStreamWriter:是从字符到字节的桥梁。字符流与字节流的转换流还有几个特点:1.转换流是字符流和字节流之间的桥梁;2.可对读取到的字节数据经过指定编码转换成字符;3.可对读取到的字符数据经过指定编码转换成字节。




------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------