IO流和集合

3 篇文章 0 订阅
2 篇文章 0 订阅

IO流—>功能流

Buffered缓冲流

Buffered缓冲流 -----> 功能流(节点流)

​ 作用:提高节点流的读写效率,增强性能

分类

字节缓冲流:

  1. 字节输入缓冲流 BufferedInputStream

  2. 字节输出缓冲流 BufferedOutputStream

    注意:没有新增方法,可以使用多态构建流

字符缓冲流:

  1. 字符输入缓冲流 BufferedReader

  2. 字符输出缓冲流 BufferedWriter

    新增功能:

    1. 字符输入缓冲流:String readLine() 读一行文字
    2. 字符输出缓冲流 :void newLine() 写一个行分隔符。如果不想使用该方法换行则需要用(\n\r)

    注意:该缓冲流有新增方法,如要使用新增方法,不能使用多态构建流

Data基本数据类型流

Data基本数据类型流 ------> 字节流的功能流

​ 作用:能够读写带有数据类型的数据(要求: 基本数据类型|字符串)

基本数据类型输入流:DataInputStream

​ 新增方法:readXxx(); -----》Xxx表示数据类型

基本数据类型输出流:DataOutputStream

​ 新增方法: writeXxx(); -----》Xxx同上

注意事项:

  1. 不能发生多态

  2. 写出时的数据及类型要与输入时保持一致

  3. 异常:EOFException

    ​ 当读入的不是写出时的源文件遇到异常| 源文件存在改动遇到的异常

public static void main(String[] args) throws Exception {
    readData("D://xxxxxxx.txt");
}
//写出带出基本数据类型的数据
public static void writeData(String path) throws IOException {
    //1.创建流
    DataOutputStream os = new DataOutputStream(new FileOutputStream(path));
    //2.准备数据
    int i = 101;
    boolean flag = false;
    char ch = 'a';
    String str = "zhangsan";
    //3.写出到文件
    os.writeInt(i);
    os.writeBoolean(flag);
    os.writeChar(ch);
    os.writeUTF(str);
    //4.刷出
    os.flush();
    //5.关闭
    os.close();
}
//读入带有基本数据类型的数据
public static void readData(String path) throws Exception{
    //1.创建流
    DataInputStream is = new DataInputStream(new FileInputStream(path));
    //2.从文件读入数据
    int i = is.readInt();
    boolean flag = is.readBoolean();
    char ch = is.readChar();
    String s = is.readUTF();
    //3.处理数据,控制台打印
    System.out.println(i+"-->"+flag+"-->"+ch+"-->"+s);
    //4.关闭
    is.close();
}

Object流

Object 流 | 对象流 | 引用数据类型流------->字节流的功能流

作用:可能读写数据保留数据的数据类型(引用数据类型|基本数据类型)---------使用基本数据类型时会发生自动装箱,变为对应的引用数据类型

新概念:

序列化:将对象类型的数据转为一个可以存储|可以传输的过程

反序列化:反转状态(转为java中的对象格式)

输入输出:

反序列化输入流:ObjectInputStream

​ 新增方法:

​ Object readObject()

​ 从ObjectInputStream中读取一个对象

序列化输出流:ObjectOutputStream

​ 新增方法:

​ void writeObject(Object obj)

​ 将指定的对象写入ObjectOutputStream

序列化的类型默认存在一个serialVersionUID,根据成员的修改会更新控制每次修改内容前后序列号统一,所以要自己写一个serialVersionUID或者可以用idea工具生成,用以控制版本得统一性

idea工具生成:

  1. 实现Serializable接口
  2. 设置Setting中配置
  3. 选中类名 alt+enter按钮
private static final long serialVersionUID = 3554186854453891043L;

使用Object流注意事项:

  1. 先序列化后反序列化
  2. 读入与写出的顺序要保持一致
  3. 不是所有类型的数据都能够序列化 实现一个空接口 java.io.Serializable
  4. 不是所有的属性都需要序列化 transient修饰
  5. 静态的变量不会序列化
  6. 父类有实现序列化接口,子类可以序列所有成员
  7. 子类实现了序列化接口父类没有实现,子类只能序列化自己独有的内容

集合

集合|容器:用来存储多个数据

集合与数组之间的区别

集合与数组都能存储多个连续数据

区别:

数组的特点:

  1. 数组是一个引用数据类型
  2. 定长,长度一旦确定不可改变
  3. 存储任意类型的数据,存储数据的类型要求一致
  4. 有序,有索引|下标(从0开始)

集合:

  1. 可以随着数据的增删容量进行改变
  2. 存储任意引用类型的数据

Collection<E>

​ Interface Collection<E>

​ 集合层次结构中的根接口。 集合表示一组对象,称为其元素

子接口:

Set:无序,元素不能重复

List:有序,元素可重复----->ArrayList***

接口|规范:

添加 add
删除 remove
记数 size
包含 contains
清空 clear
是否空 isEmpty

以下是使用IO流集合相结合来解决问题的Java代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> countMap = new HashMap<>(); try (BufferedReader reader = new BufferedReader(new FileReader("work.txt"))) { String line; while ((line = reader.readLine()) != null) { String[] numbers = line.split(","); for (String number : numbers) { countMap.put(number, countMap.getOrDefault(number, 0) + 1); } } } catch (IOException e) { e.printStackTrace(); } List<Map.Entry<String, Integer>> sortedEntries = new ArrayList<>(countMap.entrySet()); sortedEntries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder())); int limit = 6; for (int i = 0; i < Math.min(limit, sortedEntries.size()); i++) { Map.Entry<String, Integer> entry = sortedEntries.get(i); System.out.println(entry.getKey() + " 出现次数:" + entry.getValue()); } } } ``` 这段代码首先创建一个`HashMap`用于统计每个数据出现的次数。然后,使用`BufferedReader`从文件中逐行读取数据,并将每行数据按逗号分隔为字符串数组。遍历数组,将每个数字作为键,出现次数作为值存入`countMap`中。 接下来,将`countMap`中的键值对转化为列表,并按照值的降序进行排序。然后,通过循环打印出现次数最多的前6个数据以及它们的出现次数。 请确保代码中的文件路径与实际文件路径一致,并注意处理可能出现的IO异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值