1.3 课前问题列表
-
程序可以处理的数据来源除了文件还有哪些?对不同的数据来源共同的操作是什么?
1)控制台、网络
2)将数据读入到程序中,在程序中将数据写入
-
将对不同数据源中数据的读写抽象为对流的读写,有什么好处?
1)不管数据来源是网络还是文件等,读写时只对流操作,无需关心具体实现细节
2)屏蔽了实际的I/O设备中处理数据的细节,使得输出输入独立于设备
-
二进制文件与文本文件有什么区别?字节流与字符流之间有什么关系?为什么有的文本文件打开会乱码?怎么解决?
1)文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等;二进制文件是基于值编码的文件
2)字节流以字节为单位,字符流以字符为单位;字符流是以字节流为基础,本质上读写的还是字节
3)FileReader按照系统默认字符集(GBK)读取UTF-8编码的文件,自然会出现乱码
-
字符与字节之间的关系是什么?尝试使用Visual Studio Code的Hex Editor插件打开一个文本文件。在文本文件中输入"123abc中文"。观察:一个英文字符占几个字节,一个中文字符占用几个字节。在Java程序中,使用字节流怎么将这个文件中的数据正确读取并组装起来。
1)一个字节8bit,一个字符16bit一个字符占用两个字节;
不同编码里,字符和字节的对应关系不同:
①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。
针对UTF-8,中国的汉字多达10多万,常用的汉字3500左右[08年统计],如果用3个字节来表示,一共只有2^24(16777216)种可能,不足以表示10多万的汉字。所以中日韩的超大字符集是采用的4个字节来表示的,多达6万多个。但是平时使用超大字符集的概率0.01%都不到。所以我们一般认为日常的中文在UTF-8中占三个字节,但实际上也有4个字节的.
2)使用FileInputStream字节流
-
有一个stus数组,里面有若干Student对象(String name, int age, boolean gender, double score)。要将这些对象高效率地存储到文件中,需要使用哪些流?使用二进制流与使用字符流将这个数组存储到文件有何不同?使用二进制流与使用字符流从文件中读取并组装成对象有何不同?
1)使用FileOutputStream文件流,BufferedOutputStream缓冲流,ObjectOutputStream字节流
2)文本流是指在流中流动的数据是以字符形式出现;二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数标识;二进制流比文本流节省空间
3)编码层次上有所不同,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等;二进制流是值编码
-
使用什么类可以对文件进行随机存取?读写的单位是什么?为什么不是字符呢?
1)RandomAccessFile支持对文件的随机读写
2)基本单位是byte字节
3)RandomAccessFile提供了读写
操作RandomAccessFile声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了Datalnput、DataOutput两个接口,可以将byte类型数组转码为字符类型
public String(byte bytes[], int offset, int length) {
checkBounds(bytes, offset, length);
this.value = StringCoding.decode(bytes, offset, length);
}