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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1、缓冲流为什么会提高IO流读写的效率?
2、我们在读写过程中,什么情况下会发生写入乱码问题?是怎样产生的?我们是如何解决的?
3、请根据自己的语言表述IO流的体系

8 个回复

倒序浏览
1、缓冲流为什么会提高IO流读写的效率?
因为他在内存中通过缓冲区读写,减少系统io次数,从而提高io读写的效率.
2、我们在读写过程中,什么情况下会发生写入乱码问题?是怎样产生的?我们是如何解决的?
当编码和解码的格式不一样的时候,就会发生乱码问题,使用转换流就能很好的解决这个问题.
3、请根据自己的语言表述IO流的体系
IO流包括基本IO流和高效流、转化流、序列化、打印流
基本IO流有:字节输入输出流、字符输入输出流;
高效流也称缓冲流:也有字节、字符的输入输出流;缓冲流 BufferedOutputStream和BUfferedInputStream
转化流:有两个InputStreamReader(读取字节 解码为字符)和OutputStreamWriter(写出字符 ,编码为字节),编码解码时用
序列化:当想对对象进行IO流存储时用到的ObjectOutputStream和ObjectInputStream    序列化想要读取回来要用到反序列化
打印流:对输出流的包装
回复 使用道具 举报
1.存储到缓冲区 提高传输效率
2.用不同类型的字符表进行 解码和编码  会出现乱码
3.输入输出流   字符字节流  缓冲流  转换流 序列流  打印流
回复 使用道具 举报
1、缓冲流为什么会提高IO流读写的效率?
(1)缓冲流带有缓冲区,默认大小8KB,通过缓冲区可以提高一次读写IO字节数,降低反复操作IO读写次数,提高效率;
2、我们在读写过程中,什么情况下会发生写入乱码问题?是怎样产生的?我们是如何解决的?
(1)当文本文件的字符编码和读取使用字符编码不一致时,会发生乱码;
(2)通常中文简体windows操作系统默认使用GBK编码,而我们使用的开发环境(IDE)较多使用UTF-8编码,这样在编写程序读取windows系统的
        文本文件就会出现乱码,产生乱码的具体原理是同一个字符,不同的编码方式其对应的字节码是不同的,例如GBK是两个字节表示中文,UTF-8
        是3个字节表示中文,这样这样进行解析的时候自然出现问题。
(3)可以使用转换流通过指定字符编码进行读取(解析)或写入(编码)来解决编码问题。
3、请根据自己的语言表述IO流的体系
(1)IO主要分为字节流、字符流以及他们的增强流;
(2)字节流包括输出流InputStream,输出流OutputStream及其他们的子类,常用的是FileOutputStream和FileInputStream这两个子类;
(3)字符流包括输入流Reader和输出流Writer及其他们子类,常用的是FileReader和FileWriter两个子类
(4)增强流包括缓冲流(字符字节及其输入输出共四类),转换流(输入和输出两种)序列流(输入输出)和打印输出流(输出);
        1)缓冲流主要是用来提高读写效率的,其内部自带缓冲区,默认为8KB,可设置,对字符的读写提供了行读取和写入通用换行符;
        2)转换流主要是用来解决字符文件的编码问题,可以指定字符编码对字符文件进行读写,避免乱码问题;
        3)序列流主要是用来实现对象的序列化(将对象存储到文件中)和反序列化(从对象文件中直接读取对象信息,创建对象);
        4)打印输出流主要是用于将各种类型的数据以字符串形式输出到指定的目标例如控制台或某个文件。

点评

加1  发表于 2018-11-6 16:18
很棒  发表于 2018-11-6 16:16
回复 使用道具 举报
1、缓冲流为什么会提高IO流读写的效率?
(1)在创建流对象时,会创建一个内置的默认大小的缓冲区数组(默认8192字节),通过缓冲区读写,减少系统IO次数,从而提高读写的效率
2、我们在读写过程中,什么情况下会发生写入乱码问题?是怎样产生的?我们是如何解决的?
(1)存取数据的编码不一样时,读写会发生乱码
(2)使用转换流解决乱码问题
3、请根据自己的语言表述IO流的体系
IO流 分为字节流和字符流
(1)字节流:
输入流:
        1.InputStream 超类的直接子类:
        ① FileInputStream 类(被 BufferedInputStream类 增强缓冲流继承)
        ② ObjectInputStream 类
输出流:
        1.OutputStream 超类的直接子类:
        ① FileOutputStream 类(被 BufferedOutputStream 增强缓冲流继承)
        ② ObjectOutputStream 类
(2)字符流
输入流:
        1.Reader 超类的直接子类:
        ① FileReader 类
        ② BufferedReader (FileReader 类的 增强缓冲输入流)
        ③ InputStreamReader 转换流(字节流通向字符流的桥梁)
        2.Writer 超类的子类
        ① FileWriter
        ② BufferedWriter(FileWriter类 的 增强缓冲输出流)                                   
        ③ OutputStreamWriter 转换流(字符流到字节流的桥梁)
(3)打印流
printStream 类
回复 使用道具 举报
1、缓冲流为什么会提高IO流读写的效率?
答:缓冲流的基本原理,是在创建对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
2、我们在读写过程中,什么情况下会发生写入乱码问题?是怎样产生的?我们是如何解决的?
答:当编码的规则和解码的规则不一致时,就会导致乱码。
当系统或软件缺乏对某种字符编码的支持时,就会产生乱码。
可以使用转换流,通过用指定的字符集来读取(解析)或写入(编码)来解决乱码问题。
3、请根据自己的语言表述IO流的体系。
答:一、在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为”流”, Java中的”流”都位于java.io包中,称为IO(输入输出)流。流的本质是数据传输,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作。流是一种有顺序的,有起点和终点的字节集合。
二、IO流的三种分类方式
1.按流的方向分为:输入流和输出流
2.按流的数据单位不同分为:字节流和字符流
3.按流的功能不同分为:节点流和处理流
三、IO流的四大抽象类
1.基于字节操作的I/O接口:InputStream(输入字节流)(读) 和 OutputStream(输出字节流)(写)
2.基于字符操作的I/O接口:Writer(输出字符流) 和 Reader(输入字符流)
3.基于磁盘操作的I/O接口:File
4.基于网络操作的I/O接口:Socket
四、字符流和字节流。
字节流与字符流:
IO操作的本质都是字节流。因为数据编码的不同,而有了对字符进行高效操作的流对象,其本质就是基于字节流读取时,去查了指定的码表。所以当你用字符流从io设备读写东西的时候就需要涉及到字符集编码,即你想用什么编码来解释那些读到的或者即将写出的字节。所以java中的字符流对象都会有Charset参数。
字符流和字节流的区别:
1.(1)读写单位不同:
字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:
①字符(Reader和 Writer):字符是只有在内存中才会形成的,操作字符、字符数组或字符串,字节流能处理所有类型的数据,而字符流只能处理字符类型的数据。文本文件用字符流来读。对于不能用0-255来表示的值就得用字符流来读取,比如说汉字。
②字节(InputStream 和OutputStream):音频文件、图片、歌曲,所有的硬盘上保存文件或进行传输的时候,操作字节和字节数组或二进制对象。如果要java程序实现一个拷贝功能,应该选用字节流进行操作(比如:拷贝图片),并且采用边读边写的方式(节省内存)。
(3)操作不同:
①字节流操作的时候本身是不会用到缓冲区的,是对文件本身的直接操作。字节流在操作文件时,即使不关闭资源(close方法),文件也能输出。
②字符流在操作的时候是会用到缓冲区的。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,在缓冲区暂存数据。字符流可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
2.(1)Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
(2)inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
五、输入字节流InputStream。
InputStream是所有输入字节流的父类,它是一个抽象类。
ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)。
六、输出字节流OutputStream。
OutputStream是所有输出流的父类,它是一个抽象类。
ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。具体例子跟InputStream是对应的。
七、Reader 是所有的输入字符流的父类,它是一个抽象类。
BufferedReader就是一个装饰器,它和其子类负责装饰其它Reader 对象。
FilterReader 是所有自定义具体装饰流的父类。
八、InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。
注意:BufferedReader只能接受字符流的缓冲区,因为每一个中文需要占据两个字节,所以需要将System.in这个字节输入流变为字符输入流,采用:
BufferedReader buf = new BufferedReader(newInputStreamReader(System.in));
八、Writer 是所有的输出字符流的父类,它是一个抽象类。
BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
九、OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。功能和使用和OutputStream 极其类似
十、字符流与字节流转换
转换流的特点:
(1)其是字符流和字节流之间的桥梁
(2)可对读取到的字节数据经过指定编码转换成字符
(3)可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
当字节和字符之间有转换动作时;
流操作的数据需要编码或解码时。
具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
十一、File类
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马