问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java递归法读取文件目录

发布网友 发布时间:2022-04-30 07:38

我来回答

4个回答

懂视网 时间:2022-04-30 12:00

数据库设计

现在要设计一个目录数据库表,即一个表中存有根目录和各级子目录,这时候我们可以设计一张表,用parent_id来存储子目录对应的父目录的序号,设计表如下:

表的字段类型:

+-----------+----------------------+------+-----+---------+----------------+
| Field | Type   | Null | Key | Default | Extra  |
+-----------+----------------------+------+-----+---------+----------------+
| type_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| type_name | varchar(20)  | NO | | NULL |  |
| parent_id | smallint(5) unsigned | YES | | 0 |  |
+-----------+----------------------+------+-----+---------+----------------+
表的内容:

+---------+-----------------------+-----------+
| type_id | type_name  | parent_id |
+---------+-----------------------+-----------+
| 1 | 图书   |  0 |
| 2 | 科技   |  1 |
| 3 | 摄影技术  |  2 |
| 4 | 电子与通信  |  2 |
| 5 | 建筑   |  2 |
| 6 | 真空电子技术  |  4 |
| 7 | 无线通信  |  4 |
| 8 | 半导体技术  |  4 |
| 9 | 摄影理论  |  3 |
| 10 | 摄影机具与设备 |  3 |
| 11 | 建筑史  |  5 |
| 12 | 建筑设计  |  5 |
| 13 | 建筑材料  |  5 |
| 14 | 经济   |  1 |
| 15 | 历史   |  1 |
| 16 | 现代经济  | 14 |
| 17 | 古代经济  | 14 |
| 18 | 中国历史  | 15 |
| 19 | 西方历史  | 15 |
+---------+-----------------------+-----------+
从表中,我们可以得知,图书为根目录,科技是图书的一级子目录,然后摄影技术又是科技的子目录...等等,现在我们想通过Java的JDBC来得到这样的目录层次关系。

Java程序设计

package demo0807;
/**
 * 获取数据库的目录表
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class DB {
	//数据库名称
	private String dbName;
	//数据库登录名
	private String userName;
	//数据库登录密码
	private String password;
	
	//Statement对象
	private static Statement statement=null;
	
	//用于存储结果的散列表
	private LinkedList<Map<String, ArrayList<String>>> linkedList=new LinkedList<Map<String,ArrayList<String>>>();

	//含参构造函数
	public DB(String dbName, String userName, String password) {
		this.dbName = dbName;
		this.userName = userName;
		this.password = password;
	}

	/**
	 * 获取数据表的根目录
	 * @return 根目录线性表
	 */
	public ArrayList<String> getRootOrder() {
		String sql=null;
 ResultSet resultSet=null;
 Connection connection=null;
 ResultSetMetaData metaData=null;
 int columnCount = 0;
 ArrayList<String> parentList = new ArrayList<String>();
 
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			System.err.println("无法启动mysql.jdbc驱动!");
		}
 
 try {
			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost/"+dbName
			 ,userName,password);
		} catch (SQLException e) {
			System.err.println("驱动管理器无法连接到数据库!");
		}
 
 //sql语句
 sql=" select type_name as 根目录 from tb3 where parent_id=0;";

 //执行sql语句
 try {
			statement=connection.createStatement();
			resultSet=statement.executeQuery(sql);
		} catch (SQLException e) {
			System.err.println("无法执行查询");
		}
 
		try {
			//获取结果的信息元数据
			metaData = resultSet.getMetaData();
			//获取列的总数
			columnCount = metaData.getColumnCount();
		} catch (SQLException e) {
			System.out.println("无法获取表信息");
		}
		
 try {
			while(resultSet.next()) {
				int index=1;
				while(index<=columnCount) {
					parentList.add(resultSet.getString(index));
					index++;
				}
			}
		} catch (SQLException e) {
			System.err.println("无法正确查询结果");
		}
 return parentList;
	}
	
	/**
	 * 递归地找出所有的目录结构
	 * 找法一:找出所有目录的子目录,直到子目录为空为止
	 * @param parentOrder
	 * @return
	 */
	public LinkedList<Map<String, ArrayList<String>>> lookupSubOrder(ArrayList<String> parentOrder) {
		ResultSet resultSet=null;
		for(String dynamicParent:parentOrder) {
			
			//Map类型,用于存储key-value
			Map<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>();
			String key=dynamicParent;
			ArrayList<String> value = new ArrayList<String>();
			String sql="select child_type_name from (select p.type_id as type_id,p.type_name as type_name,s.type_name as child_type_name from tb3 as p left join tb3 as s on p.type_id=s.parent_id) as tb_tmp where type_name="+"‘"+dynamicParent+"‘";
			try {
				resultSet = statement.executeQuery(sql);
				if(resultSet.next()==false) {
					;
				} else {
					boolean flag=true;
					while(flag) {
						String tmp=null;
						if((tmp=resultSet.getString(1))!=null) {
							value.add(tmp);
						}
						flag=resultSet.next();
					}
					lookupSubOrder(value);
				}
				map.put(key, value);
			} catch (SQLException e) {
				System.err.println("数据库查询失败!");
				e.printStackTrace();
			}
			linkedList.add(map);
		}
		return linkedList;
	}
}

测试代码

package demo0807;
/**
 * 测试类
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		DB db = new DB("demo2", "root", "031422zw");
		ArrayList<String> mainOrder = db.getRootOrder();
		System.out.println("根目录为:"+mainOrder.toString());
		LinkedList<Map<String, ArrayList<String>>> linkedListSubOrder = db.lookupSubOrder(mainOrder);
		while(!linkedListSubOrder.isEmpty()) {
			Map<String, ArrayList<String>> subOrder = linkedListSubOrder.removeLast();
			Set<Entry<String, ArrayList<String>>> entrySet = subOrder.entrySet();
			Iterator<Entry<String, ArrayList<String>>> iterator = entrySet.iterator();
			while(iterator.hasNext()) {
				Entry<String, ArrayList<String>> next = iterator.next();
				String parent=next.getKey();
				ArrayList<String> children = next.getValue();
				if(!children.isEmpty()) {
					System.out.println(parent+"的子目录有"+children.toString());
				}
			}
		}
		
	}
}

运行结果


根目录为:[图书]
图书的子目录有[科技, 经济, 历史]
历史的子目录有[中国历史, 西方历史]
经济的子目录有[现代经济, 古代经济]
科技的子目录有[摄影技术, 电子与通信, 建筑]
建筑的子目录有[建筑史, 建筑设计, 建筑材料]
电子与通信的子目录有[真空电子技术, 无线通信, 半导体技术]
摄影技术的子目录有[摄影理论, 摄影机具与设备]

总结

程序还有很多小瑕疵,感觉熟悉基本的数据结构和递归算法对编程的帮助很大!



运用Java递归获取数据库的目录表结构

标签:

热心网友 时间:2022-04-30 09:08

import java.io.File;

public class $ {

    public static void main(String[] args) {

        String path = "D:/";

        test(path);
    }

    private static void test(String path) {
        File f = new File(path);

        File[] fs = f.listFiles();

        if (fs == null) {
            return;
        }

        for (File file : fs) {
            if (file.isFile()) {
                System.out.println(file.getPath());
            } else {
                test(file.getPath());
            }
        }
    }
}

热心网友 时间:2022-04-30 10:26

简单的说就是
public void ListFile(File file){
File[] fileList = file.listFiles();
for(int i = 0; i < fileList.length;i++){
if(fileList[i].isDirectory()){
ListFile(fileList[i]);
}else if(fileList[i].isFile()){
System.out.println(fileList[i].getName());
}
}
}
前边加上对参数合法性的判断,里边在加上你要的处理过程。

热心网友 时间:2022-04-30 12:00

你最终需要的是什么样的数据结构!?
JAVA遍历一个文件夹中的所有文件---(递归)

public void traverseFolder2(String path) {File file = new File(path);if (file.exists()) { File[] files = file.listFiles();if (null == files || files.length == 0) { System.out.println("文件夹是空的!");return;} else { for (File file2 : files) { if (file2.isD...

java File类,递归读取本地目录,速度特别慢。

感觉主要subs[i].listFiles()调用比较花时间,不知道你用subs[i].listFiles()!=null这个判断的目的是什么,如果替换成subs[i].exist或者isDirectory不知道符合不符合你的要求,要是符合的话最好换了吧。如果实在不能替换的话,至少可以定义一个变量保存它的结果,这样每次递归可以少调一次,能节省不少...

java用递归查询文件,运行时,把输入符合条件的东西全部显示出来,用递 ...

param file 需要遍历的目录 param reg 条件正则表达式 / public static void getFiles(List&lt;File&gt; list, File file, String reg) { if (file.isFile()) {//若file是文件 if (Pattern.matches(reg, file.getName())) { list.add(file);} return;} //file是文件夹 File[] files = file...

java读取配置文件的方法(xml)

回答:建议看哈JAXP 关于java操作xml其实很简单

java怎样获得某个目录下所有文件的文件名

import java.io.File;public class GetAllFiles { public static void main(String[] args) { //路径 这里写一个路径进去 String path="F:\\QQ文档";//调用方法 getFiles(path);} / 递归获取某路径下的所有文件,文件夹,并输出 / public static void getFiles(String path) { File file ...

java遍历文件夹

主要应用递归算法 / / package com.dianziermu.io;import java.io.File;import java.util.ArrayList;import java.util.List;/ 遍历文件夹及其下面的所有文件夹,递归 author 点子二木 date 2009-6-10 version 1.0 / SuppressWarnings("unchecked")public class FolderIO { static List&lt;File&gt; gblFold...

java怎么循环读取目录下的文件内容

System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);} 2.使用递归的方法调用 public static List&lt;File&gt; getFileList(String strPath) { File dir = new File(strPath);File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 if (files != null) {...

Java代码拷贝文件夹 注:复制文件夹

Java代码复制文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法,代码如下:import java.io.*; /** * 复制文件夹或文件夹 */ public class CopyDirectory { // 源文件夹 static String url1 = "F:/photos"; // 目标文件夹 static String url2 =...

java里,怎么读一个文件,然后数出每个字母的频率并且递归的把26个字母...

package com.sanqing.ceshi;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;//java里,怎么读一个文件,然后数出每个字母的频率并且递归的把26个字母和频率都打出来?public class ceshi { public static vo...

java中怎么读取文件内容(java中如何读取文件)

java中在怎么读取文件夹中的内容1、JAVA遍历文件夹下的所有文件(递归调用和非递归调用)不使用递归的方法调用。2、方式一:采用ServletContext读取,读取配置文件的realpath,然后通过文件流读取出来。因为是用ServletContext读取文件路径,所以配置文件可以放入在web-info的classes目录中,也可以在应用层级及web-...

文件或目录损坏且无法读取怎么办 d盘文件或目录损坏无法读取 硬盘文件或目录损坏且无法读取 文件或目录无法读取怎么办 java获取文件夹下所有文件 读取文件夹下所有文件 java读取txt文件 java读取文件 文件无法读取
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的华硕x54xi2328hr-sl是2月份刚买的,99成新,我保养的很好,又贴了膜... 万豪白金卡是什么? 我想买便宜的好面膜啊,去哪买?网上有好的吗? 北京汽车贴膜去哪比较好?什么膜比较好? 万豪金卡吃饭有什么优惠 傅雷家书是一本关于什么的书?说说你读完此书的一些看法 《傅雷家书》的主题思想是什么 菠萝泡芙是菠萝做的嘛 贝克大叔产品目录 如何制作奶香四溢的泡芙? 人体电子秤不准怎么办 人体健康秤不准可以调吗?怎么调? 电子人体称是不是越称越不准 人体电子秤为什么双脚靠前跟双脚靠后的体重不一样 人体电子秤不准能调吗 扬州柳工建设机械有限公司怎么样? 中国百强企业 邮箱 地址 请问徐工信息怎么样? 忍者必须死是什么登录的 上上电缆是全国五百强吗? 安徽国企机械系统个人收入排名 徐工集团工程机械股份有限公司和徐州工程机械集团有限公司什么关系?? 中国联通号码短信中心号码设置正确,但是短信发送失败,是什么原因? 短信发不出去 短信中心号码是什么 您好,我想咨询下柠檬酸钠中的一水,二水,无水这三种的区别 很多化工原料中写的无水,一水是什么意思 梦见已故的外婆在粪池里洗澡是怎么回事,我把她拉上来了, 一水二水是什么服务? 磷酸二氢钠无水,一水合,二水合都是什么意思? 在李白的登金陵凤凰台钟是:一水中分白鹭洲,还是二水中分白鹭洲? 逃费属于什么行为 被认定是逃费债会有相关部门通知吗 收到逃废债短信通知怎么办 J家成人式是不是07年就没有了?因为找不到视频了 谁有成人高考高数辅导的免费视频? 谁有*高考的视频,高中起点的,发我邮箱15191880955@163.com,不甚感激 谁有成人高考高起点辅导的视频啊,帮忙提供下,谢谢。 那个网有免费的成人高考考前辅导视频看? 清明节的由来400字以内 清明节的由来100——400字左右 清明节是怎么来的?(400字) 百分比怎么换算的,比如20%换算成数字 15%是6500,哪100%是多少,怎么算的,然后详细解说下 单元格格式怎样从百分比转为数字 清明节的来历4000字 关于清明节的来源400字谢谢 关于清明节的资料350到400字 Excel如何将百分比转化为数值。 清明节的来历400字!!400!!自己数 约400 怎么把百分比换算成数字呀,公式是什么 老师叫我们写清明节的传说,在400字左右,怎么写???急用 !!!