0809(027天 IO周考+IO模块大作业停车收费系统)

这篇博客涵盖了Java IO的相关知识点,包括BIO、NIO和AIO的区别,深浅克隆的概念,Java序列化的实现方式,以及文件拷贝和字符统计的编程练习。此外,还介绍了设计一个停车收费系统的作业,涉及汽车信息录入、停车时间计算和费用收取的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0809(027天 IO周考+IO模块大作业停车收费系统)

每日一狗(旺名)

27

大标题

1. IO周考

1、BIO、NIO和AIO之间的区别

BIO:数据的写入必须阻塞在一个线程内等待其完成(等水烧开)

BIO:一个线程不断的轮询每一个输入输出的状态改变,如果有状态发生了改变,则进行下一步的操作(时不时回来看一看水烧开没)

AIO:无锡一个线程轮询所有的IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。(等水烧开了,水壶会通知我来处理)

2、深浅克隆的区别

  • 深克隆:会生成一个完全独立于源对象的对象,互不向干涉
  • 浅克隆:只会克隆一层数据,对于引用数据类型只会将其引用进行拷贝,两个对象公用通过一组引用数据类型

3、什么是序列化,如何实现Java序列化

  • 通过某种方法将一个对象的存储区域转换成二进制流方便存储
  • 实现
    • 实现Serializable接口
      • 可以对无法序列化的数据进行标记让其不参与序列化ransient
    • 实现Externalizable
      • 需要实现一个序列化方法,一个反序列化方法以达到自定义序列化方法的目的

4、编码实现一个任意文件夹的拷贝

package com.yang1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class 文件拷贝 {
	private static String sourcePath = "D:\\桌面\\20220808";
	private static String targetPath = "D:\\桌面\\copy";

	public static void main(String[] args) {
		copyDir(new File(sourcePath));
	}

	public static void copyDir(File file) {
		File targetFile = new File(file.getAbsolutePath().replace(sourcePath, targetPath));
		if (file.exists()) {
			if (file.isDirectory()) {
				if (!targetFile.exists()) {
					targetFile.mkdirs();
				}
				File[] fs = file.listFiles();
				if (fs != null && fs.length > 0) {
					for (File tmpF : fs) {
						copyDir(tmpF);
					}
				}
			} else if (file.isFile()) {
				copyFile(file, targetFile);
			}
		}
	}

	private static void copyFile(File file, File targetFile) {
		System.out.println(file + "-->" + targetFile);
		try (InputStream is = new FileInputStream(file); OutputStream os = new FileOutputStream(targetFile)) {
			while (true) {
				int c = is.read();
				if (c == -1) {
					break;
				}
				os.write(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

image-20220809094123429

5、统计一个文件calcCharNum.txt中各个字符出现次数:A(8),B(16),C(10)…,a(12),b(10),c(3)…,括号内代表字符出现次数,要求按照出现次数从小到达排序输出。如果是回车符则按照空格符处理

//======== 字符数据类 ========
package com.yang1;

public class MyChar {

	private char ch;
	private int count;

	public MyChar(char ch) {
		this.ch = ch;
		count = 1;
	}

	public void pusOne() {
		count++;
	}

	public char getCh() {
		return ch;
	}

	public int getCount() {
		return count;
	}

	@Override
	public String toString() {
		return ch + "[" + count + "]";
	}

}
// ========= 变长数组 =========
package com.yang1;

public class ArrayList {
	private MyChar[] arr;
	private int count;

	public ArrayList() {
		this(10);
	}

	public ArrayList(int length) {
		if (length < 2) {
			length = 10;
		}
		this.arr = new MyChar[length];
		this.count = 0;
	}

	public void show() {
		for (int i = 0; i < count; i++) {
			System.out.println(arr[i]);
		}
	}

	public void sorted() {
		for (int i = 1; i < count; i++) {
			for (int j = 0; j < count - i; j++) {
				if (swap(arr[j], arr[j + 1])) {
					MyChar tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
			}
		}
	}

	private boolean swap(MyChar c1, MyChar c2) {
		boolean res = c1.getCount() < c2.getCount();
		if (!res && c1.getCount() == c2.getCount()) {
			res = c1.getCh() > c2.getCh();
		}
		return res;
	}

	public void add(char ch) {
		int index = indexOf(ch);
		if (index < 0) {
			if (count == arr.length) {
				swell();
			}
			arr[count++] = new MyChar(ch);
		} else {
			arr[index].pusOne();
		}
	}

	private int indexOf(char ch) {
		int res = -1;
		for (int i = 0; i < count; i++) {
			if (ch == arr[i].getCh()) {
				res = i;
				break;
			}
		}
		return res;
	}

	private void swell() {
		MyChar[] newArr = new MyChar[count * 3 / 2];
		System.arraycopy(arr, 0, newArr, 0, count);
		arr = newArr;

	}

	public MyChar[] getArr() {
		return arr;
	}

	public int getCount() {
		return count;
	}

}
// ============ 文件读取统计展示 ==========
package com.yang1;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class 统计字符出现次数 {

	public static void main(String[] args) {
		ArrayList arr = new ArrayList(20);
		File file = new File("data/data.txt");
		if (file.exists()) {
			try (Reader fr = new FileReader(file)) {
				while (true) {
					int i = fr.read();
					if (i < 0) {
						break;
					}
					if (i == '\n' || i == '\t' || i == '\r') {
						i = ' ';
					}
					arr.add((char) i);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		arr.sorted();
		arr.show();
	}

}

image-20220809101458873


2. IO流模块大作业

停车场有进场和出场的功能
进场时:采用键盘录入的方式,录入汽车的品牌、颜色、车牌号。把品牌、颜色、车牌号,以及进场时间写入car.txt文件中。
出场时:键盘录入车牌号,去文件中查找该车的进场时间,并计算停车时间。

30分钟内免费,过后每小时3元,超过1小时后再超过15分钟按一小时计算,15分钟以内不额外计费。

名词:停车场、车(品牌、颜色、车牌号。把品牌、颜色、车牌号)、停车时间

动词:进场、出场、键盘录入、文件写入

对象

  • 停车场:
    • 逻辑停车场:
    • 存储停车场:
  • 汽车
    • 汽车对象
    • 汽车停车记录

存储

  • ./data/cat.txt:存储未被取出的车辆信息
  • ./data/history.txt:存储已经被取出的(订单信息)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值