使用递归调用寻找指定文件,并将该文件返回后仍无法中止递归的问题

Java文件遍历实战:从File类到健壮目录遍历器的实现与优化 文件系统操作是编程中的基础,涉及文件读写、目录遍历等核心概念。其原理是通过操作系统API访问存储设备上的数据组织结构。掌握稳健的文件遍历技术对构建高效、可靠的本地数据处理工具至关重要,广泛应用于日志分析、批量文件处理、资源管理等场景。本文聚焦Java中的目录遍历,深入解析File类的listFiles()方法,探讨递归与非递归策略,并针对性能瓶颈、内存溢出等常见问题提供解决方案。通过构建支持过滤、深度控制和循环检测的通用遍历器,帮助开发者规避权限异常、符号链接死循环等陷阱,实现健壮的文件系统操作。 阅读详情

一、需求描述

在指定文件夹下寻找想要的文件,当找到后将该文件返回并中止递归

二、遇到的问题

当找到目标文件后,函数并没有停止,而是向下又进入了条件判断并返回了结果,直到递归次数达到某个限定值才结束。而且奇怪的是,返回的是最后一次递归调用时返回的结果数据

1.问题代码

/**
 *	dir : 需要扫描的目标文件夹
 *	str1 : 目标文件的md5Hex值(用来判断文件内容是否一样)
 */
public File queryImg(File dir,String str1) throws IOException{
		// 扫描目标文件夹,将其中的子文件夹和图片文件放到ft数组中
        File[] ft = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File f) {
                if (f.isDirectory())
                    return true;
                String fname = f.getName();
                if (fname.endsWith(".jpg") || fname.endsWith(".png") || fname.endsWith(".jpeg"))
                    return true;
                else
                    return false;
            }
        });
        if (ft.length != 0) {
            for (File f : ft) {
            	// 判断是文件还是文件夹
                if (f.isFile()) {
                    FileInputStream fis = new FileInputStream(f);
                    // 获取已保存的文件内容
                    String str2 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
                    // 关闭流
                    IOUtils.closeQuietly(fis);
                    // 如果两个文件的md5Hex相同,则为相同文件
                    if (str1.equals(str2)){
                        return f;
                    }
                } else {
                	// 如果是文件夹就执行递归调用
                    queryImg(f,str1);
                }
            }
        }
        return null;
    }

2.问题解决

找了半天的bug,最终将递归调用处作为返回值返回就可以了。
大致原因应该是: 当找到目标文件后,函数将返回值返回到上一级调用处,而这里的上一级指的其实是上一次递归调用的地方,然而上一次递归调用并没有处理返回值,所以导致递归函数继续执行,直到将目标文件夹下的所有文件全部扫描完才结束

修改后的代码

/**
 *	dir : 需要扫描的目标文件夹
 *	str1 : 目标文件的md5Hex值(用来判断文件内容是否一样)
 */
public File queryImg(File dir,String str1) throws IOException{
		// 扫描目标文件夹,将其中的子文件夹和图片文件放到ft数组中
        File[] ft = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File f) {
                if (f.isDirectory())
                    return true;
                String fname = f.getName();
                if (fname.endsWith(".jpg") || fname.endsWith(".png") || fname.endsWith(".jpeg"))
                    return true;
                else
                    return false;
            }
        });
        if (ft.length != 0) {
            for (File f : ft) {
            	// 判断是文件还是文件夹
                if (f.isFile()) {
                    FileInputStream fis = new FileInputStream(f);
                    // 获取已保存的文件内容
                    String str2 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
                    // 关闭流
                    IOUtils.closeQuietly(fis);
                    // 如果两个文件的md5Hex相同,则为相同文件
                    if (str1.equals(str2)){
                        return f;
                    }
                } else {
                    return queryImg(f,str1); // 这里是修改的位置
                }
            }
        }
        return null;
    }
【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器02 B-WUCL(用户权重均匀对比损失)和D-WUCL(物品权重均匀对比损失)中,动态调整参数λ_new(新用户补偿因子)和α(长尾补偿强度)是优化推荐系统适应数据分布变化的核心。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01

4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。

weixin_49199313的博客 1221

递归函数的执行顺序

当我们执行递归函数时,会发现递归函数中调用递归之前的语句和递归之后的语句执行顺序是相反的。

liveshow021_jxb的博客 1243

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 304

java递归return后还执行的说明

但是,有时候我们可能会遇到一个有趣的现象,那就是在递归函数中执行return语句后,程序还会继续执行。在这个函数中,当number为0时,递归函数会返回0,结束当前的函数调用。因此,在使用递归时,应该确保递归的结束条件是正确的,并且递归深度不会太大。在Java中,递归函数在执行到return语句后会立即返回并退出当前函数调用,但程序会继续执行上一级调用中的代码。由于递归函数可能会在多个函数调用层级上执行,因此return语句只会结束当前的函数调用,并将控制权返回给上一级调用。让我们分析一下程序的执行过程。

qq_59125846的博客 2313

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 451

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1101

在递归程序中直接return;表示的含义

递归程序直接使用return ;的意义是什么

bigorange1的博客 2066

如何解决ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.

解决ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE

2742

递归中使用return,未达到预期的结束

private FolderNode updateUnitFolderNodeCache(List<obj> nodes, String rootId) { for (obj o : nodes) { if (rootId.equals(o.id)) { **return o;** 退出了递归的当前的一层而已 } else { List<obj> c...

qq_40815137的博客 1951

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4893

DDR4 IP的用户接口

DDR4 IP核用户接口

bowen_wener的博客 1925

关于递归中return的理解(最浅显易懂)

递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的。递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就调用下一层,因此,当达到递归终止条件时,首先return的是最底层调用的函数,return之后,继续执行上一层调用该函数之后的代码,此时我们看到的是上一层的情况,当上一层剩余的代码执行完之后,表示上一层的函数也结束,此时再返回上上一...

Mr Liu的博客 2万+

AI大模型助力现金流精准预测案例详解

因为它的“注意力机制”能像“人一样思考”——比如,当预测“下周现金流”时,模型会重点关注“最近7天的销售数据”“未来7天的天气”“竞品是否有促销”这些关键因素,而忽略“去年同期的无关数据”。AI大模型不是“取代”财务人员,而是“赋能”他们——把财务人员从“重复的Excel操作”中解放出来,专注于“战略决策”(比如如何优化资金结构、如何提升资金利用率)。比如,“促销力度”这个特征,不是简单的“折扣率”,而是“折扣率×促销天数×覆盖SKU数量”,这样能更准确反映促销对现金流的影响。这些问题的核心,其实是。

AIGC应用创新大全的博客 1258

深入HotSpot JVM:解析解释器与栈帧的协同工作原理

在Java虚拟机(JVM)中,解释器作为字节码的实时翻译官,负责将平台无关的字节码指令转换为本地机器码执行。其核心工作原理依赖于栈帧这一数据结构,它为每个方法调用提供了一个独立的微型运行时环境,包含局部变量表、操作数栈、动态链接和方法返回地址等关键组件。栈帧的设计不仅支撑了方法调用的隔离与递归执行,还是实现多态性和异常处理机制的基础。在实际的工程实践中,理解解释器与栈帧的协同工作流,对于诊断StackOverflowError、优化热点方法性能以及开发字节码增强工具(如APM探针)都至关重要。本文以HotS

weixin_33788244的博客 359

CAP CDS 和 ABAP Cloud 的 CDS 有什么区别?

摘要:SAP生态中的CAP CDS与ABAP CDS虽同名但存在显著差异。CAP CDS定位为全栈应用的领域模型与服务契约语言,支持声明式建模并直接编译为服务接口;而ABAP CDS更侧重数据语义层,与ABAP平台深度集成,服务于SQL优化和服务发布链路。两者在语法、持久化方式、服务暴露机制及权限模型上均有不同:CAP CDS采用CDL语法,支持模型即服务;ABAP CDS基于ABAP DDL,通过视图定义语义并与RAP框架紧密耦合。这些差异反映了二者在不同平台中的设计哲学和应用场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 204

华为od统一考试B卷【食堂供餐】Python 实现

某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求。

MISAYAONE的博客 8780

Make | 基础Makefile结构

Make 定义了一种语言用于描述源码、中间代码以及可执行文件之间的关系,它也提供了管理备用配置、实现可重用的库、使用用户定义的宏参数化进程等功能,简而言之,make由于提供了应用程序各部分组件如何被组合在一起的路线图,它可以被认为是开发过程的核心。规定make使用的文件通常被命名为makefile,这里有一个makefile用来编译传统的“Hello World”程序的样例:hello: hell...

marlos的博客 230

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux 文本编辑器:vi、vim、实用技巧、vimplus、插件管理器vundle、Nano编辑器

Vim / Vi 是一个功能强大的全屏幕文本编辑器。vim ( Vi IMproved ) 是 vi的一个加强版,主要用来 "创建、编辑、显示" 文本文件。现在主流的 linux 都会安装 vim 文本编辑器。Vim/Vi 没有菜单,只有命令。linux 下还有另外2个强大的编辑器 Emacs、Nano。

freeking101的博客 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java 递归 return后还在执行

函数,递归相关视频讲解:008_ 输出h字符_REPL_引号_括号_什么是函数数据结构与算法-栈-Go代码演示版微积分基本想法Java 递归 return后还在执行 在编程中,递归是一种非常有用的技术,它可以让我们用更简洁的方式解决一些复杂的问题。然而,有时候我们在递归函数中使用return语句时可能会遇到一些意想不...

weixin_40572890的博客 535

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

递归return的问题

递归的四条基本法则:(引自《数据结构与算法分析——C语言描述》Mark Allen Weiss 著) 1. 基准情形。 2. 不断推进。 3. 设计法则。 4. 合成效益法则。 这里说下return的作用域: return 对当前函数来说是结束了,对调用它的父函数来说你这个函数执行完成了,父函数就会接着执行下一语句。 没想到父函数马上又遇到一个return,父函数结束了,对爷爷函数来说...

Asa_Prince的博客 1388

递归函数里面的return详解

递归里面的return,因为不断的调用己身,每次调用都是运行一次函数。

qq_38120851的博客 4964

递归return会停止吗

第二次次return f(4);第一次return f(2);第三次return f(7);此时满足if条件,返回n;下面在递归里加了输出语句;

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 716
上一篇: 【IDEA】启动服务器时报错,找不到spring配置文件解决办法
下一篇: 【二】Springboot常用的maven坐标
zxwwantlearnjava
博客等级 码龄7年 16粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值