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

课前问题列表

1.程序可以处理的数据来源除了文件还有哪些?对不同的数据来源共同的操作是什么?

  1. 除了文件还包括网络,控制台等等
  2. 对所有数据都包含读与写两个基本操作。

2.将对不同数据源中数据的读写抽象为对流的读写,有什么好处?

(1) 对于开发人员来说,使用处理流进行输入/输出操作更简单;
不管数据来源是网络还是文件等,读写只对流操作(读,写),无需关心具体实现细节。并且,流帮我们屏蔽具体实现细节,提供统一的操作接口。
(2)使用处理流执行效率更高。

3.二进制文件与文本文件有什么区别?字节流与字符流之间有什么关系?为什么有的文本文件打开会乱码?怎么解决?

  1. 文本文件:这类文件以文本的ASCII码形式存储在计算机中。它是以"行"为基本结构的一种信息组织和存储方式。
    二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。
  2. 字符流是以字节流为基础,本质上读写还是字节。
  3. 可能是编码方式不匹配。例如输入一些中文使用UTF-8方式保存文本文件,就会出现乱码。这里是因为:FileReader按照系统默认字符集(GBK)读取UTF-8编码的文件,自然会出现乱码。
  4. 使用InputStreamReader,字节流与字符流的桥梁。使用方法如下所示:
    在这里插入图片描述
    在不使用InputStreamReader的情况下:
	public class Test {
		public static void main(String[] args) throws IOException {
			File f=new File("d:/test.txt");
			FileInputStream in=new FileInputStream(f);
			//InputStreamReader isr=new InputStreamReader(in,"GBK");
			byte[] b=new byte[(int)f.length()];
			in.read(b);
			System.out.println(new String(b));
			in.close();
		}

在这里插入图片描述
在使用InputStreamReader的情况下:

public class Test {
	public static void main(String[] args) throws IOException {
		File f=new File("d:/test.txt");
		FileInputStream in=new FileInputStream(f);
		InputStreamReader isr=new InputStreamReader(in,"GBK");
		char[] b=new char[(int)f.length()];
		isr.read(b);
		System.out.println(new String(b));
		in.close();
	}

在这里插入图片描述

4.字符与字节之间的关系是什么?尝试使用Visual Studio Code的Hex Editor插件打开一个文本文件。在文本文件中输入"123abc中文"。观察:一个英文字符占几个字节,一个中文字符占用几个字节。在Java程序中,使用字节流怎么将这个文件中的数据正确读取并组装起来。

1)字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、‘$’、'&'等。
一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
在这里插入图片描述
2)
• ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
• UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
• Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
• 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
• UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
• UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

5.有一个stus数组,里面有若干Student对象(String name, int age, boolean gender, double score)。要将这些对象高效率地存储到文件中,需要使用哪些流?使用二进制流与使用字符流将这个数组存储到文件有何不同?使用二进制流与使用字符流从文件中读取并组装成对象有何不同?

1)FileOutputStream写入文件,BufferedOutputStream 使用缓冲流,ObjectOutputStream可以将整个对象
写入流,
2)存储形式不同,存储空间的大小不同。
3)所谓的文本流就是指在流中流动的数据是以字符形式出现。在文本流中,‘\n’被换成回车和换行的代码0DH和0AH。而当输出时,则0DH和0AH被换成’\n‘。
二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对’\n’符号不进行变换,举个栗子:
比如2001这个数字,在文本流中的二进制ASCII码表示为‘2’‘0’‘0’‘1’即50 48 48 49共占用4个字节。而在二进制流中表示的是00000111 11010001用十六进制是07D1。只占2个字节。

6.使用什么类可以对文件进行随机存取?读写的单位是什么?为什么不是字符呢?

1) Java.io 包提供了RandomAccessFile 类用于随机文件的创建和访问。使用这个类,可以跳转到文件的任意位置读写数据。程序可以在随机文件中插入数据,而不会破坏该文件的其他数据。此外,程序也可以更新或删除先前存储的数据,而不用重写整个文件。
2) 读写的单位是字节
3) RandomAccessFile继承自DataOutput,DataInput,Closeable
DataOutput接口定义了一系列方法用于将任何Java类型的数据转换为一系列字节,并将这些字节写入二进制流
DataInput接口提供了一系列的方法从二进制流中读取字节,并将读取出来的字节转换成任意的java基本类型,包括转换成UTF-8类型的字符串。
故RandomAccessFile是对字节操作而不是对字符操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值