第11周 预习、实验与作业:流与文件

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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值