首页
学习
活动
专区
圈层
工具
发布

杨校老师课堂之基于File类的文件管理器

文件管理器具体功能要求如下: 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。...用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。...new Scanner(System.in); System.out.print("请输入要检索的目录位置:"); String path = sc.next();//从控制台获取路径... list = FileUtils.listFiles(file, key); for (Object obj : list) { //将路径打印到控制台...list = FileUtils.listFiles(file, suffixArray); for (Object obj : list) { //将路径打印到控制台

54230

异步编程 - 07 基于JDK中的Future实现异步编程(下)_当Stream遇见CompletableFuture

比如下面的代码,我们从person列表中过滤出年龄大于10岁的人,并且收集对应的name字段到list,然后统一打印处理。在使用非Stream的情况下,我们会使用如下代码来实现。....收集映射后元素 nameList.stream().forEach(name -> System.out.println(name)); } 在上面的代码中我们首先从personList获取到流对象...上获取流并调用forEach进行打印。...而collect操作是终端操作符,当在流上执行终端操作符时,流上施加的操作才会执行。 JDK8中对于Steam提供了很多操作符,只是简单的列出了filter、map、collect这几种方法。...小结 我们了解了CompletableFuture如何解决其缺点,以及CompletableFuture与JDK Stream是如何完美结合的,可知使用CompletableFuture实现异步编程属于声明式编程

56130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java多线程并发编程中并发容器第二篇之List的并发类讲解

    如果想系统学习,凯哥(kaigejava)建议从第一篇开始看。 从本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介绍什么是并发容器。然后讲解list相关的、map相关的以及队列相关的。...正确的应该是100*1000.从结果来看,arrayList丢数据了。 使用Vector执行后的效果: 编辑 ​ 执行vector时间为 : 98毫秒!...所以,CopyArrayList支持读多写少的并发情况 CopyOnWriteArrayList的使用场景: 由于读操作不加锁,增删改三个操作加锁的,因此适用于读多写少的场景, 局限性:因为读的时候不加锁的...,读的效率和普通的arrayList是一样的。...所以可以说copyArrayList在读的时候不会出现arrayList读取到脏数据的问题。

    89610

    JAVA中写时复制Copy-On-Write

    因此,可以对原始容器进行并发地读。其次,实现了读操作与写操作的分离,读操作发生在原始容器上,写操作发生在副本容器上。...数据一致性问题:读操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成并更新容器,因此这是最终一致性。...因此,可以参考CopyOnWriteArrayList自己实现一个CopyOnWriteHashMap 主要是在写操作时,如何保证线程安全即可。...这样,当一个线程需要put一个新元素时,它先锁住当前CopyOnWriteMap对象,并复制一个新HashMap,而其他的读线程因为不需要加锁,则可继续访问原来的HashMap。...而ConcurrentHashMap并不是从“复制”这个角度来应对多线程并发修改,而是引入了分段锁(JDK7);CAS、锁(JDK11)解决多线程并发修改的问题。

    77330

    6点半下班,已经成为公司最后走的人

    技术派首页 这个系统旨在为创作者提供一个可以发布文章和教程,并赚取佣金的社区平台,同时又兼顾一些社交属性,比如说用户可以通过阅读、点赞、收藏、评论的形式和作者互动。...二哥的 Java 进阶之路:dump 第三步,使用可视化工具分析 dump 文件,比如说 VisualVM,找到占用内存高的对象,再找到创建该对象的业务代码位置,从代码和业务场景中定位具体问题。...当两个事务 A 和 B 并发修改同一个变量时,A 事务读取到的值取决于多个因素,包括事务的隔离级别、事务的开始时间和提交时间等。 读未提交:在这个级别下,事务可以看到其他事务尚未提交的更改。...读提交:A 只能看到 B 提交后的更改。如果 B 还没提交,A 将看到更改前的值。 可重复读:在事务开始后,A 总是读取到变量的相同值,即使 B 在这期间提交了更改。这是通过 MVCC 机制实现的。...因为在这两个隔离级别下,事务在读取数据时,需要保证读取到的数据是一致的,即读取到的数据是在事务开始时的一个快照。

    26310

    leetcode-102. 二叉树的层序遍历

    queue.isEmpty()) { // 定义一个存放同一层级元素的集合 List level = new ArrayList打饭盛饭用的待会饭还是进自己的肚子里的,至于为什么是盆不是碗就不扯太远了。先把二叉树的根节点放进去队列,因为刚开始这一层级就一个根节点。...接下来义一个存放同一层级的所有元素集合,并获取此时队列的长度,为什么要获取队列长度呢,重点来了,因为你还记得当初你把同一层级的所有元素加入了队列,至于是多少个这里要算清楚,因为女朋友还不是你的老婆所以还是要...获取到本层级的所有元素数量后,从队列里取出来你之前放进去队列的元素,取多少个呢?你放进去多少就取多少,最多两个,因为这是二叉树。那怎么保证取的那几个就是我当初放进去的那几个?...取到值后,将其加入储存当前层级元素的集合中,并判断该树节点下是否还有左右子节点,存在的话还是要加入队列,等待下层级遍历。

    42030

    【文档搜索引擎】缓冲区优化和索引模块小结

    在 parserContent 里面,我们进行了一个读文件的操作 计算机读取文件,是一个开销比较大的操作, 缓存 parserContent 的核心操作,就是读取文件,从磁盘进行访问,操作系统就会对“...我们使用的读文件操作是: int ret = fileReader.read(); 这里的 read() 每次都是在读磁盘,速度就会比较慢 相比之下,我们可以在这里将 fileReader 的内容提前就读取到内存之中...,然后每次调用 read() 的时候,就可以直接从内存中进行读取了 BufferedReader BufferedReader 可以搭配 FileReader 来使用。...bufferedReader = new BufferedReader(new FileReader(f)) 通过 BufferedReader 类可以看到,它的缓冲区默认值是 8192(8k),我们可以将其设置大一点...因为第一次读的时候,这些文档都在磁盘上,内存中没有缓存,所以我们读的速度就会慢一些 读过一次之后,很多文件就会操作系统自动缓存。

    28710

    ArrayList与CopyOnWriteArrayList常见操作与问题

    ArrayList循环遍历并删除元素的常见陷阱 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。...今天就给大家说一下在ArrayList循环遍历并删除元素的问题。...针对错误写法一,在遍历第一个字符串b时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。...CopyOnWrite的设计思想 如果简单的使用读写锁的话,在写锁被获取之后,读写线程被阻塞,只有当写锁被释放后读线程才有机会获取到锁从而读到最新的数据,站在读线程的角度来看,即读线程任何时候都是获取到最新的数据...add 方法实现原理 再来看下如何进行添加数据的?

    97110

    JUC系列(四) | 集合的线程安全问题

    jdk11源码) public boolean add(E e) { modCount++; add(e, elementData, size); return true; } 我们该如何解决这个问题呢...我们从"动态数组"和“线程安全”两个方面来看待: 动态数组机制 : 它内部有个“volatile 数组”(array)来保持数据。...] array; 通过“volatile 数组”来保存数据的 一个线程读取 volatile 数组时,总能看 到其它线程对该 volatile 变量最后的写入;就这样,通过 volatile 提供了“读...取到的数据总是最新的”这个机制的保证。...HashMap、HashSet的解决方式可以用Hashtable解决,当然不局限于这一种哈,(还没看完) 三、自言自语 最近又开始了JUC的学习,感觉Java内容真的很多,但是为了能够走的更远,还是觉得应该需要打牢一下基础

    47330

    看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

    CopyOnWriteArrayList的实现 通过上面两个栗子我们可以发现CopyOnWriteArrayList是线程安全的,下面我们就来一起看看CopyOnWriteArrayList是如何实现线程安全的...如果这种读多写少的场景采用 Vector,Collections包装的这些方式是不合理的,因为尽管多个读线程从同一个数据容器中读取数据,但是读线程对数据容器的数据并不会发生发生修改,所以并不需要读也加锁...CopyOnWrite缺点 CopyOnWriteArrayList虽然是一个线程安全版的ArrayList,但其每次修改数据时都会复制一份数据出来,所以CopyOnWriteArrayList只适用读多写少或无锁读场景...读操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成并更新容器所以这是最终一致性。...感谢您的阅读,十分欢迎并感谢您的关注。

    77910

    看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

    CopyOnWriteArrayList的实现 通过上面两个栗子我们可以发现CopyOnWriteArrayList是线程安全的,下面我们就来一起看看CopyOnWriteArrayList是如何实现线程安全的...如果这种读多写少的场景采用 Vector,Collections包装的这些方式是不合理的,因为尽管多个读线程从同一个数据容器中读取数据,但是读线程对数据容器的数据并不会发生发生修改,所以并不需要读也加锁...CopyOnWrite缺点 CopyOnWriteArrayList虽然是一个线程安全版的ArrayList,但其每次修改数据时都会复制一份数据出来,所以CopyOnWriteArrayList只适用读多写少或无锁读场景...读操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成并更新容器所以这是最终一致性。...感谢您的阅读,十分欢迎并感谢您的关注。 [8888.png] 巨人肩膀摘苹果 http://ifeve.com/java-copy-on-write/

    49740

    第九天 面向对象-类,封装,对象,private,this【悟空教程】

    1.1.1.2 特点 是一种更符合我们思考习惯的思想 可以将复杂的事情简单化 将我们从执行者变成了指挥者 角色发生了转换 1.1.1.3 举例 买电脑 洗衣服 吃饭 1.1.1.4 面向对象特性...我们如何表示一个现实世界事物呢: 属性 就是该事物的描述信息 行为 就是该事物能够做什么 举例:学生事物 我们学习的Java语言最基本单位是类,所以我们就应该把事物用一个类来体现。...; 5.使用空调对象获取空调的品牌和价格并打印到控制台上; 6.使用空调对象调用开机方法; 7.使用空调对象调用定时关机方法,并传递具体数据值,在控制台上可以看到的效果为:空调将在xxx分钟后自动关闭....,并返回该等级(A,B,C) 在主方法中: 创建三个Student对象并传入method(ArrayList stu)方法中 method方法内要求: 该方法内有对等级进行判断的方法,...模拟真实购物逻辑,以上述图片为需求原型,根据不同购物物品完成购物小票内容打印到控制台。

    88660

    《面试专题-----经典高频面试题收集一》解锁 Java 面试的关键:深度解析常见高频经典面试题(第一篇)

    文件API和递归 找出某目录下的所有子目录和子文件,并打印到控制台上 public static void main(String[] args) { List paths =...System.out.println(str2 == str3); //true //比较引用的内存地址是否一样 //第一个是false:new 创建新的对象会开辟新的内存空间,所以地址不一样 //第二个是true:都是从常量池里面获取...//第⼆条语句打印的结果为true,javac编译可以对【字符串常量】直接相加的表达式进⾏优化,不⽤等到 运⾏期再去进⾏加法运算处理,⽽是直接将其编译成⼀个这些常量相连的结果 //如果需要第⼀个输出为...封装是把过程和数据包围起来,对数据的访问只能通过已定义的接⼝即⽅法; //在java中通过关键字private,protected和public实现封装; //封装把对象的所有组成部分组合在⼀起,封装定义程序如何引...,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和新增是需要加锁的,读多写少) //Collections.synchronizedList:几乎在每个方法上就加了synchronized

    27910

    面试基础整理之 ArrayList

    Q4:fail-fast 是如何实现的?有什么局限?...答案要点:fail-fast 只是检测并发结构性修改,不保证完整检测(例如某些非结构修改或恰好未触发检查),并且在无同步时读取到的元素可能是半写入状态或旧值。...八、按时间的复习计划(可选:选择 30 / 60 / 120 分钟) 30 分钟(冲刺面试) 0–5min:读“底层地图”并默写(第一节)。...九、常见追问及应对(面试官常跟进的问题,如何回答) 为什么 ArrayList 的 remove 返回被删除元素? 简短:便于链式/确认删除前值,和 Collection 接口契约一致。...读多写少且迭代要求不抛 CME 时(例如事件监听器列表)。 如何避免频繁扩容? 在构造器里传入合适的初始容量或在批量插入前调用 ensureCapacity。

    11810

    Java实现回调生成List的高性能方案

    本文将介绍如何使用回调函数生成List,并提供高性能的Java代码示例。 回调函数简介 回调函数是一段可执行的代码,它作为一个参数传递给另一个函数。...案例分析 假设我们需要从一个数据源中获取一组用户数据,并将其放入一个List中。我们可以设计一个回调函数,在数据源中每获取到一个用户数据时,立即将其添加到List中。...// 模拟获取数据源的过程 for (int i = 0; i < 1000000; i++) { UserData userData = // 从数据源获取用户数据...接下来,我们通过回调函数将获取到的每个用户数据添加到该List中。 最后,我们使用并行流将List转换成并发安全的List,以确保在多线程环境下的数据安全性。...数据预处理:如果数据源的数据量庞大且复杂,可以考虑对数据进行预处理,将其转换为更简单的形式,以减少后续处理的复杂性。 结语 通过使用回调函数和并行流,我们可以高效地生成List。

    13310

    死磕 Java集合之ArrayList源码分析

    public boolean remove(Object o) { if (o == null) { // 遍历整个数组,找到元素第一次出现的位置,并将其快速删除 for...O(1); (3)ArrayList添加元素到尾部极快,平均时间复杂度为O(1); (4)ArrayList添加元素到中间比较慢,因为要搬移元素,平均时间复杂度为O(n); (5)ArrayList从尾部删除元素极快...,时间复杂度为O(1); (6)ArrayList从中间删除元素比较慢,因为要搬移元素,平均时间复杂度为O(n); (7)ArrayList支持求并集,调用addAll(Collection c)方法即可...// 读入非transient非static属性(会读取size属性) s.defaultReadObject(); // 读入元素个数,没什么用,只是因为写出的时候写了size属性,读的时候也要按顺序来读...()和readObject()是为了自己控制序列化的方式,这两个方法必须声明为private,在java.io.ObjectStreamClass#getPrivateMethod()方法中通过反射获取到

    61820

    16.IO之其他流

    第一 打印流 一、概述: 该流提供了打印方法,可以将各种数据类型的数据都原样打印 原理将97先变成字符保持原样将数据打印到目的地 1、字节打印流:PrintStream 构造函数可以接收的参数类型:...// int by = read(); // write(by); // out.write(610);//只写最低8位, // out.print(97);//将97先变成字符保持原样将数据打印到目的地...二、如何合并多个文件: 1、创建集合,并将流对象添加进集合或者SequenceInputStream(InputStream s1,InputStream s2)加入两个输入流 2、创建Enumeration...接口,因为是两个不同的线程,覆盖run方法,注意,需要在内部处理异常,因为重写run方法 2、创建两个管道流,并用connect()方法将两个流连接 3、创建读写对象,并传入两个线程内,并start执行...bs = s.getBytes("GBK"); for (byte b : bs) { // Integer.toBinaryString将其转换为二进制

    28520

    【Java_06】Scanner 类、Random 类、ArrayList 集合

    格式:类名 对象名 = new 类名( 参数列表 ); 即:Scanner sc = new Scanner(System.in); 注:System.in系统输入指的是从键盘输入...nextInt():以空格或者换行符为终点,返回整数(实际是获取的字符串,只是将其转为了整数)。 hasNext():判断输入流中是否还有数据,有则返回 true。...ArrayList 介绍 * ArrayList 是一个集合,数组是定长的,当我们要改变数组长度是需要创建新的数组,ArrayList不同他的长度是可以改变的。 2....练习 从键盘键入10个数,将其放入集合中,并生成一个随机数,以这个随机数作为索引删除在集合中代表的元素 import java.util.ArrayList; import java.util.Random...System.out.println("请输入10个数字,空格为分割,#结尾"); //持续从键盘获取数字直至获取到非数字为止,并将获取到的以空格分割 while (sc.hasNextInt

    66410
    领券