Java 日看一类(14)之IO包中的EOFException异常类和ExpiringCache内部类

何为内存缓存?java怎么去实现它? 内存缓存(Memory caching)是一种常见的缓存技术,它利用计算机的内存存储临时数据,以提高数据的读取和访问速度。内存缓存通常用于存储频繁访问的数据,以减少对慢速存储介质(如磁盘或数据库)的访问次数,从而加快系统的响应速度和性能。 阅读详情

EOFException无引入的包

继承自IOException



类头注释

/**
 * Signals that an end of file or end of stream has been reached
 * unexpectedly during input.
 * <p>
 * This exception is mainly used by data input streams to signal end of
 * stream. Note that many other input operations return a special value on
 * end of stream rather than throwing an exception.
 *
 * @author  Frank Yellin
 * @see     java.io.DataInputStream
 * @see     java.io.IOException
 * @since   JDK1.0
 */

大意如下:

在输入过程中意外到达文件末尾的信号

这个异常主要被数据输入流用来标记流的结束。

注意,其他输入操作返回一个特殊值在流的结束位置而不是抛出该异常




该类含有一个成员变量:序列号

private static final long serialVersionUID = 6433858223774886977L;



该类含有两个方法,均为构造方法:

默认构造方法

public EOFException() {
    super();
}

传入字符串(抛出时显示的字符串)

public EOFException(String s) {
    super(s);
}


异常类子类都比较简单,一目了然




ExpiringCache内部类无继承关系

引入了如下包:

import java.util.Iterator;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.Set;


作为内部类并没有注释和api可以查阅



该类看了下代码大致是做缓存条目记录“保鲜”的


该类含有五个成员变量:

缓冲到期时间

private long millisUntilExpiration;

条目查询表

private Map<String,Entry> map;

查询记数

private int queryCount;

查询溢出上限

private int queryOverflow = 300;

最大条目数

private int MAX_ENTRIES = 200;



该类含有七个方法:

默认构造函数(默认缓冲存在时间)

ExpiringCache() {
    this(30000);
}

构造函数

ExpiringCache(long millisUntilExpiration) {
    this.millisUntilExpiration = millisUntilExpiration;
    map = new LinkedHashMap<String,Entry>() {//初始化查询表
        protected boolean removeEldestEntry(Map.Entry<String,Entry> eldest) {//覆盖旧条目的判断函数
          return size() > MAX_ENTRIES;
        }
      };
}

获得键名对应的键值

synchronized String get(String key) {
    if (++queryCount >= queryOverflow) {//查询次数溢出
        cleanup();//清空查询记录
    }
    Entry entry = entryFor(key);//获得查询值
    if (entry != null) {
        return entry.val();
    }
    return null;
}

向查询表中加入新条目

synchronized void put(String key, String val) {
    if (++queryCount >= queryOverflow) {
        cleanup();
    }
    Entry entry = entryFor(key);
    if (entry != null) {//若该索引值存在就修改该索引对应值
        entry.setTimestamp(System.currentTimeMillis());//刷新时间
        entry.setVal(val);
    } else {//不存在就创建新对应关系
        map.put(key, new Entry(System.currentTimeMillis(), val));
    }
}

清空查询表

synchronized void clear() {
    map.clear();
}

查询键值

private Entry entryFor(String key) {
    Entry entry = map.get(key);
    if (entry != null) {
        long delta = System.currentTimeMillis() - entry.timestamp();//获得存在时间
        if (delta < 0 || delta >= millisUntilExpiration) {//缓存过期判定,过期就清理
            map.remove(key);
            entry = null;
        }
    }
    return entry;
}

清除查询栈(实际是查询表刷新提示,经过一定次数查询后刷新查询表)

private void cleanup() {
    Set<String> keySet = map.keySet();
    // Avoid ConcurrentModificationExceptions
    String[] keys = new String[keySet.size()];
    int i = 0;
    for (String key: keySet) {//获得所有键名
        keys[i++] = key;
    }
    for (int j = 0; j < keys.length; j++) {//清除过期或无效缓存
        entryFor(keys[j]);
    }
    queryCount = 0;
}



含有一个内部静态类(查询条目)

static class Entry {
    private long   timestamp;//条目创建时间
    private String val;//条目的值

    Entry(long timestamp, String val) {
        this.timestamp = timestamp;
        this.val = val;
    }

    long   timestamp()                  { return timestamp;           }
    void   setTimestamp(long timestamp) { this.timestamp = timestamp; }

    String val()                        { return val;                 }
    void   setVal(String val)           { this.val = val;             }
}




该类也十分简单,大体功能为记录缓存、查询缓存、刷新缓存。内部类大致了解即可,不需要使用。




MFC界面库BCGControlBar v32.0 - 对话框、仪表盘控件升级 亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFCv32.0正式发布!新版本支持Windows 11、增强功能区简化模式、改进控件外观等,以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGControlBar Pro for MFC v32.0正式版下载 对话框和表单 1. 添加了一个新的全局标志globalData.m_bAutoPrepareComboListStyles:如果您希望. 阅读详情

相关推荐

Qt Installer Framework4.6.1的最基础使用1(win10+离线安装包 )

因工作需要,win程序发布后,打包成一可执行exe文件,且兼容win7系统笔者记录了一些关键要点,供有需要的小伙伴使用。

aggs1990的专栏 905

JDK之java.io.ExpiringCache

源码 class ExpiringCache { private long millisUntilExpiration; private Map map; // Clear out old entries every few queries private int queryCount; private int queryOverflow = 300; ...

thebigdipperbdx的博客 1127

Dify+工作流,通过多模态实现发票自动识别

上个章节我们用Dify实现了基于本地知识库的聊天助手,本节我们通过工作流 ,可视化界面快速构建复杂的工作流和自动化流程。结合 OCR(光学字符识别)技术和工作流引擎,可以实现发票的自动识别、数据提取以及后续的审批流程。本文将详细介绍如何使用 Dify 和工作流来实现发票的自动识别与审批。

odin2005的博客 7426

java io学不会?军哥带你10分钟玩到飞!

大家好,这里是五彩石编程,我是军哥。打开JDk1.8的源码,我们会发现单单java.io包下面,就有87个文件,这些文件组合在一起,构成了JAVA操作IO的基础,但同时我们也会发现一个问题,大部分同学面对这么多的文件时,要么显得无从下手,要么很快就陷入了技术的细枝末节中迷失了方向,今天军哥就来带着大家,用10分钟的时间,一起把IO搞清楚。

2401_83148236的博客 674

Mac上快速部署DeepSeek模型:Ollama终端操作全指南

本文详细介绍了在Mac上使用Ollama终端快速部署DeepSeek模型的完整指南。从硬件要求、Ollama安装、模型下载运行,到高级配置、可视化界面及常见问题解决,提供了全流程操作步骤与优化技巧,帮助开发者高效搭建本地AI助手,实现稳定、私密的离线使用体验。

weixin_29251567的博客 555

统信UOS安装CH384串口卡驱动

本文讲解如何在统信UOS系统下安装CH384 PCIE多串口驱动安装过程,CPU为飞腾D2000。其他Linux内核系统安装亦可参照类似方法。

shjhuang的专栏 1887

【深入JVM】JVM工具之JMAP

一、工具介绍   如果把java\bin目录配置到环境变量,在cmd输入jmap会有如下提示: 翻译:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。 二、工具用法

夜深人静后的码农 3008

CSRT跟踪算法的使用

Fu Xianjun. All Rights Reserved. 文章目录 前言 一、CSRT跟踪算法是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CSRT跟踪算法是什么? 在具有通道和空间可靠性的判别相关滤波器(DCF-CSR)中,我们使用空间可靠性图将滤波器支持调整为从帧中选择区.

sinat_53821602的博客 7906

lombok简介及使用方法

前言:     又一次项目中用到了,发现简化了很多的代码,因此自己研究了一下 ,看了一下官网和网上的教程,总结了如下内容,部分内容来自于http://blog.csdn.net/hack8/article/details/23790579    Lomboz是一个基于LGPL的开源J2EE综合开发环境的Eclipse插件,对编码,发布,测试,以及debug等各个软件开发的生命周期提供支持,支

6994

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1828

【sealos安装指南】基于 Sealos 安装 Kubernetes 1.33.6 高可用集群

本文介绍使用Sealos工具快速搭建Kubernetes集群的详细指南。Sealos简化了K8s部署流程,自动完成系统调优,适合新手学习使用。文章提供了服务器规划、环境准备、在线/离线两种安装方式的具体步骤,包括主机名设置、swap关闭、数据目录配置等。重点讲解了Sealos的安装命令参数说明,以及添加/删除节点等常用操作。推荐使用Calico网络组件确保稳定性,并附有安装成功后的验证截图。该指南能帮助用户快速搭建一个包含master和worker节点的K8s集群,底层基于containerd运行。

欢迎你们到来,希望能帮到大家 463

java 内存分析工具实践

参考此文,在本机实践:https://my.oschina.net/feichexia/blog/196575 jmap   可以用dump 再用jhat 查看使用 jstack  查看堆内存 加-heap 使用   各代内存大小 使用情况    查看各线程状态 jstat 查看各内存的使用情况,eden survior perment 使用/未使用 jprof 查看cpu使用情况

simple008的博客 929

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 766

JVM内存以及常用工具的详细讲解-刘宇

一、JVM内存结构介绍 1.1、JVM内存结构 1.2、程序计数器 内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成 如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryErro

刘宇的博客 1039

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java基础之《JVM性能调优(3)—堆》

一、什么是堆,它和栈有什么区别? 1、变量和堆的关系 package heap; public class Test01 { public static void test() { int j = 100; } public static void main(String[] args) { int i = 10; test(); } } 以上代码的执行顺序: (1)main方法,java虚拟机栈开辟了一个栈帧,存放.

csj50的专栏 1099

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java.io.EOFException

java.io.EOFException EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。 此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。 产生原因: 1、数据流中写入数据时的顺序和读取时的顺序不一致 2、UTF是双字节编码,而writeChars方法写入的是按照字符格式写入的,在文件中的占位要小于以Unicode编码的同样字符串,所以,使用readUTF方法读取时,会出现EOF错误 ...

m0_50680595的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java实现带过期时间的缓存

直接上代码package com.dyh.utils; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import java.util.PriorityQueue; import java.util.concurrent.*; import java.util.concu...

cbmb111的博客 1万+

dubbo解析-服务结果缓存Cache实现类原理详解

Cache的实现类也有四个:ThreadLocalCache、ExpiringCache、LruCache、JCache。 LruCache LruCache按照最近最少使用原则删除多余缓存。 public LruCache(URL url) { final int max = url.getParameter("cache.size", 1000); this.s...

龚厂长的博客 1205

一个轻量的java缓存方式ExpiringMap

一、简单介绍 A high performance thread-safe map that expires entries! 应用程序中引入缓存能够降低数据库方面的压力,比如常用的Redis缓存中间件。但是在有些小场景下,使用Redis不仅增加了系统的复杂性和不确定性,还有点大材小用。而ExpiringMap适合缓存那些被频繁查询以及数据量不是很大的数据信息。它具有如下功能: 可以设置存储元素的过期时间; 可设置最大的数据元素存储量; 设置过期协议,过期协议分有两种:ExpirationPoli

IT- 研究者 879

Java基础之可设置过期时间的map

Java基础之可设置过期时间的map 一、技术背景 在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高系统的可用性和健壮性。 但是很多时候如果项目比较简单,就没有必要为了使用缓存而专门引入Redis等等中间件来加重系统的复杂性。那么Java本身有没有好用的轻量级的缓存组件呢。 答案当然是有喽,而且方法不止一种。常见的解决方法有:ExpiringMap、...

瘦子没有夏天 1万+

java程序内部缓存cache,ExpiringMap

@Bean(name="cache2") public Cache cache2() { return new GuavaCache("cache", CacheBuilder.newBuilder().maximumSize(30000).expireAfterWrite(2, TimeUnit.DAYS).build()); } @Autowired private Cache cache; // cache.invalidateAll();...

可爱猪猪 792

Java Caching(缓存)-策略和JCache API

探讨JCache和其他缓存API的构建块,以及在应用程序中实现临时数据存储的多种策略。缓存提供了几个好处,这就是为什么它在需要快速访问数据的使用情况下大量利用的原因。正确的缓存可以提高性能,减少资源使用,并提高响应速度。通常,在企业应用程序中,高速缓存充当中间的低延迟数据源,并位于应用程序和后端系统之间。

纸上得来终觉浅,绝知此事要躬行 2万+

EOFException 的问题处理

近期工作中, 遇到了有送EOFException的抛出, 以此小节总结学习相关内容, 及如何解决问题。 问题描述 doUnZip(FileOperateUtil.java:239)] java.io.EOFException com.tr..base.util.FileOperateUtil.doUnZip(FileOperateUtil.java:221)] java.io.EOFExc...

aqudgv83的博客 1万+

Java 中常用缓存Cache机制的实现

转:https://www.cnblogs.com/JAYIT/p/5647924.html 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。 ...

JHON07的博客 929

超给力!一篇文章搞清楚Springboot中过滤器、拦截器和AOP的区别

结合实例和代码快速搞定过滤器、拦截器和AOP技术

程序员甜梨 1148
上一篇: Java 日看一类(13)之IO包中的DefaultFileSystem类和DeleteOnExitHook类
下一篇: Java 日看一类(15)之IO包中的File类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值