用户从属性文件中读取文件夹,指定关键字,统计出指定文件夹下面指定的关键字中,出现次数最多的关键字

本文介绍了一种通过Java实现的程序,该程序能够从指定文件夹内的文件中统计多个预设关键字的出现频率,并找出出现次数最多的关键字。

用户从属性文件中读取文件夹,指定关键字,统计出指定文件夹下面指定的关键字中,出现次数最多的关键字

/这里只考虑了一个文件夹/

大体思路

1.从配置文件中读取路径和关键字字符串
2.分割关键字字符串
3.读取每一个文件,遍历每一个文件(查找关键字)
4.比较关键字出现的次数

读配置文件的类

package keyworldsfind.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

public class propertiesUtil {
	
	public static String propertiesread(String pathname,String Keyname) {
		Properties pps=new Properties();
		try (BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream (new File(pathname))));){
			
			pps.load(br);
			System.out.println(pps.getProperty(Keyname));
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return pps.getProperty(Keyname);
	}
}

读文件的类,并对每一个文件的每一行进行统计

package keyworldsfind.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class fileReadUtil {
	
	public static void fileRead(File filePath,String[] keywordsArr,int[] keywordsCount) {
		if(filePath==null) {
			System.out.println("文件路径错误");
			return;
		}

		try(BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));){
			String line="";
			while((line=br.readLine())!=null) {
				//System.out.println(line);
				//统计每个文件中每一行关键字出现的次数,不分大小写
				keywordsCountByLine(line.trim().toLowerCase(),keywordsArr,keywordsCount);	
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
     }
	
	//统计每个文件中每一行关键字出现的次数
	public static void keywordsCountByLine(String line,String[] keywordsArr,int[] keywordsCount){
		
		if(line == null || keywordsArr.length == 0 || keywordsCount.length == 0){
			return;
		}
		
		int size=keywordsArr.length;
		for(int index=0;index<size;index++){
			
			 keywordsCount[index]+=AkeywordCountByLine(line,keywordsArr[index]);
		}
				
	}
	
	//正则表达式 统计每一行每个关键字的次数
	public static int AkeywordCountByLine(String line,String keyword){
		
		Pattern pattern=Pattern.compile(keyword);			
		Matcher matcher=pattern.matcher(line);
		int count=0;
		while(matcher.find()){
			count++;
		}
		return count;
	}
		
}
	


查找关键字的方法

package keywordsfind.service;

import java.io.File;

import keyworldsfind.util.fileReadUtil;

public class KeywordsService {
	
	//查找出现次数最多的关键字
	public static void keywordsMaxCount(String foldPath,String keywordsStr){
		
		if(foldPath == null){
			System.out.println("文件夹路径错误");
			return;
		}
		File fold=new File(foldPath);
		//保证是个目录且存在
		if(!fold.exists() || !fold.isDirectory()){
			System.out.println("此文件夹不存在");
			return;
		}

		//获取每个关键字
		String[] keywordsArr=keywordsStr.split(",");
		if(keywordsArr.length == 0){
			System.out.println("分割关键字发生错误");
			return;
		}
		int SIZE=keywordsArr.length;
		int[] keywordsCount=new int[SIZE];
		
		//统计每个关键字出现的次数
		keywordCount(fold,keywordsArr,keywordsCount);
		
		//查找出现次数最多的关键字
		int maxCount=keywordsCount[0];
		int resIndex=0;
		for(int index=1;index<SIZE;index++){
			if(maxCount<keywordsCount[index]){
				maxCount=keywordsCount[index];
				resIndex=index;
			}
		}
		System.out.println(keywordsArr[resIndex]+"出现的次数最多,是"+maxCount+"次");
	}
	
	//统计每个关键字出现的次数
	public static void keywordCount(File fold,String[] keywordsArr,int[] keywordsCount){
		
		if(!fold.exists() || !fold.isDirectory()){
			System.out.println("此文件夹不存在");
			return;
		}
		File[] filesPath=fold.listFiles();
		
		for(File filePath: filesPath){
			//列出目录中的全部内容
			//System.out.println(filePath);
			//统计每个文件中的关键字出现的次数
			keywordCountByFile(filePath,keywordsArr,keywordsCount);
		}
	}
	
	//统计每个文件中的关键字出现的次数
	public static void keywordCountByFile(File filePath,String[] keywordsArr,int[] keywordsCount){
		if(filePath == null){
			System.out.println("文件路径错误");
			return;
		}
		//读每个文件
		fileReadUtil.fileRead(filePath,keywordsArr,keywordsCount);
	}

}

主函数测试

package keywordsfind.service;

import java.io.FileNotFoundException;
import java.util.Scanner;

import keyworldsfind.util.propertiesUtil;

public class KeywordsTest {

	public static void main(String[] args) throws FileNotFoundException  {

		System.out.println("请输入配置文件的路径(注意路径的输入格式)");
		//D:\\workspace\\keyworldsfind\\src\\keyworldsfind\\util\\1.properties
		try(Scanner scanner=new Scanner(System.in);){
			String propertiesPath=scanner.next();
			if(propertiesPath == null){
				System.out.println("配置文件路径错误");
				return;
			}
			
			//获取文件夹的路径
			String foldPath=propertiesUtil.propertiesread(propertiesPath, "foldPath");
			//获取关键字的字符串
			String keywordsStr=propertiesUtil.propertiesread(propertiesPath, "keywordsStr");
			if(keywordsStr.length() == 0){
				System.out.println("没有需要查询的关键字");
				return;
			}
			
			//查找出现关键字次数最多的
			KeywordsService.keywordsMaxCount(foldPath, keywordsStr);
		}
	}
}

配置文件:在这里插入图片描述

运行结果

在这里插入图片描述

<think>好的,我现在要为用户介绍C语言中的文件文件夹操作。首先,我需要回忆一下C语言相关的文件操作函数,以及用户可能需要的知识点。用户可能想了解如何创建、读取、写入文件,还有文件夹的操作,但C标准库本身可能没有直接操作文件夹的函数,可能需要提到平台相关的方法,比如POSIX或Windows API。 首先,文件操作方面,要提到文件指针FILE*,然后是打开文件的函数fopen,参数包括文件名和打开模式,比如"r"读,"w"写,"a"追加等。需要说明这些模式的区别,以及可能现的错误,比如文件不存在时用"r"会失败。 接下来是读取和写入文件内容的函数,比如fprintf、fscanf、fgets、fputc这些。还有二进制文件的处理,使用fread和fwrite。要区分文本模式和二进制模式打开文件的差异,比如换行符的处理。 然后需要提到关闭文件的重要性,使用fclose函数,避免资源泄漏。还有错误处理,比如检查fopen是否返回NULL,使用perror或errno来诊断问题。 关于文件夹的操作,C标准库没有直接支持,可能需要用系统调用。比如在POSIX系统(如Linux)中使用mkdir函数,参数是路径和权限模式,例如mkdir("folder", 0777)。而在Windows下可能需要调用_mkdir或者CreateDirectory函数。这里需要说明这是平台相关的,可能影响代码的可移植性。 还需要提到遍历文件夹中的文件,比如使用opendir和readdir函数(在dirent.h中),但这也是POSIX的,Windows下可能需要FindFirstFile等函数。这部分可能需要简要说明,或者建议使用跨平台库。 此外,可能需要提到文件的属性修改,比如重命名(rename函数)、删除(remove函数),这些在C标准库中存在,但具体行为可能因系统而异。 用户可能还关心如何检查文件是否存在,这可以通过尝试打开文件,或者使用access函数(属于POSIX)。但需要注意跨平台的问题。 在组织回答时,应该分点说明,先文件操作,再文件夹操作,每个部分包括常用的函数和示例。需要注意中文术语的准确性,比如“文件指针”、“缓冲区”、“二进制模式”等。 同时,要提醒用户注意错误处理,比如每次文件操作后检查返回值,确保操作成功。例如,fopen失败时返回NULL,并设置errno,这时候可以用perror打印错误信息。 可能还需要提到文件定位函数,如fseek和ftell,用于随机访问文件内容。或者使用fgetpos和fsetpos来处理大文件的情况。 最后,总结一下各个部分,强调文件操作的基本步骤:打开、读写、关闭,以及文件夹操作需要依赖系统特定函数,建议需要跨平台时使用条件编译或第三方库。 现在需要把这些内容结构化,按照用户的要求,分步骤介绍,使用清晰的结构,可能用标题分段,但用户要求的是没有markdown,所以用文字说明。例如: 1. 文件操作基础 - 打开文件:fopen,模式说明 - 读写函数:文本和二进制函数 - 关闭文件:fclose - 错误处理 2. 文件夹操作 - POSIX下的mkdir - Windows下的_mkdir或CreateDirectory - 遍历文件夹内容 3. 其他相关函数 - 文件删除和重命名:remove, rename - 检查文件存在性 示例代码部分可能需要简单展示如何打开文件,读写,以及创建目录。但要注意不同平台的示例可能需要分开说明。 还要注意LaTeX格式的使用,比如函数名用$fopen$,但根据用户指示,行内数学表达式用$...$,可能函数名需要用代码块或引号,但用户可能希望用LaTeX的等宽字体?或者可能不需要,只需要正确使用$符号。例如,在中文回答中,可能更倾向于用代码块符号,但用户要求的是数学表达式用$,比如变量名,方程等。因此,可能函数名不需要用$包围,而代码示例需要用等宽字体,但由于是纯文本,可能用引号或直接写。需要根据用户的要求,但用户可能希望行内代码用$...$,比如$fopen$,但不确定。根据用户的系统级指令,行内数学表达式必须用$...$,但函数名可能不属于数学表达式,可能不需要。可能应该只在数学表达式如变量名时使用$,而函数名直接写,比如fopen()。 需要再仔细查看用户的指令,用户说“所有行内数学表达式(包括变量、不等式、方程等)必须使用$...$格式”,所以函数名不属于数学表达式,不需要用$,而代码部分可能需要用反引号,但用户可能希望用LaTeX的\texttt{}?但用户并没有提到代码格式,只提到数学表达式。因此,可能函数名和代码部分不需要用LaTeX格式,而变量或数学符号需要用$,比如文件指针FILE *fp;中的fp可以写成$fp$?或者可能用户希望所有代码元素用$包围,比如$fopen$,但不确定。 可能需要根据常规做法,在中文技术文档中,函数名、代码关键字等用引号或等宽字体,但在纯文本环境中无法使用格式,所以可能用户接受用$包围代码,比如$fopen()$,但需要符合用户的系统级指令中的数学表达式要求。这可能容易混淆,比如,如果函数调用被视为数学表达式,可能需要用$,否则不用。例如,函数名可能不是数学表达式,而变量如文件指针变量$fp$需要用到$。 因此,在回答中,涉及变量名时使用$,例如$fp$,而函数名如fopen()则不用。例如: 使用$fopen$函数打开文件,语法为: ```c FILE *fp = fopen("file.txt", "r"); ``` 但用户可能要求代码示例用$$...$$?但用户说独立公式用$$,而代码示例可能不属于公式,所以可能需要将代码示例用文字描述,或者用代码块但用户可能无法显示。不过用户允许使用中文回答,可能代码示例需要用引号或其他方式表示。 但根据用户的系统级指令,LaTeX语法正确,所以可能代码部分需要用等宽的LaTeX表示,比如使用\texttt{}或者类似的命令,但用户可能希望用$...$来包裹行内代码,比如函数名,而独立代码块用$$...$$。但可能混淆。 可能更安全的做法是按照用户的要求,数学表达式用$,而代码部分用普通文本,例如: 要打开文件,可以使用`fopen`函数: $$FILE *fp = fopen("filename", "mode");$$ 但不确定是否正确。或者用户可能希望独立代码块用$$...$$,例如: 独立代码示例: $$ FILE *fp = fopen("test.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } $$ 但这样可能不符合LaTeX的语法,因为多行代码需要用适当的换行符。或者用户可能希望将代码示例作为普通段落处理,而不是用LaTeX公式。这可能存在矛盾,需要进一步分析用户的指令。 根据用户的例子,例如用户提到行内数学表达式如$x^2$,而独立公式用$$...$$。因此,代码示例可能不属于数学表达式,所以不需要用LaTeX格式,而使用普通文本。但用户可能希望代码中的变量用$,例如$fp$。 总结:在回答中,涉及到变量名、数学符号时使用$,如$fp$,函数名如fopen()不用,而代码示例可能用普通文本或使用代码块标记,但用户可能没有指定。因此,在无法使用markdown的情况下,用普通文字描述代码,变量用$包围。 现在,整理思路,逐步回答用户的问题,确保结构清晰,覆盖主要函数和操作,同时注意中文化术语和正确性。</think>在C语言中,文件文件夹操作主要通过标准库函数和系统级API实现。以下从文件操作、文件夹操作和注意事项三个方面进行介绍: --- ### 一、文件操作 #### 1. 打开文件 使用$fopen$函数打开文件,语法为: ```c FILE *fp = fopen("文件名", "模式"); ``` - **常见模式**: - $r$:只读(文件需存在) - $w$:写入(创建新文件或清空旧文件) - $a$:追加(在文件末尾写入) - $b$:二进制模式(如$rb$, $wb$) 若失败则返回$NULL$,需检查错误: ```c if (fp == NULL) { perror("错误信息"); exit(1); } ``` #### 2. 读写文件 - **文本文件**: - 写入:$fprintf(fp, "内容")$ 或 $fputc('字符', fp)$ - 读取:$fscanf(fp, "格式", &变量)$ 或 $fgets(缓冲区, 长度, fp)$ - **二进制文件**: - 写入:$fwrite(数据指针, 元素大小, 元素数量, fp)$ - 读取:$fread(数据指针, 元素大小, 元素数量, fp)$ 示例:写入整数 ```c int num = 42; fwrite(&num, sizeof(int), 1, fp); ``` #### 3. 关闭文件 使用$fclose(fp)$关闭文件,释放资源。 --- ### 二、文件夹操作 C标准库不直接支持文件夹操作,需借助系统API: #### 1. 创建文件夹 - **POSIX系统(Linux/Mac)**: ```c #include <sys/stat.h> mkdir("文件夹路径", 0777); // 权限模式 ``` - **Windows系统**: ```c #include <direct.h> _mkdir("文件夹路径"); ``` #### 2. 遍历文件夹 POSIX系统中使用$opendir$和$readdir$: ```c #include <dirent.h> DIR *dir = opendir("路径"); struct dirent *entry; while ((entry = readdir(dir)) != NULL) { printf("%s\n", entry->d_name); } closedir(dir); ``` --- ### 三、其他操作 1. **删除文件**:$remove("文件名")$ 2. **重命名文件**:$rename("旧名", "新名")$ 3. **检查文件存在性**: ```c if (fopen("文件", "r") == NULL) { // 文件不存在 } ``` --- ### 四、注意事项 1. **错误处理**:每次操作后检查返回值,用$perror$定位问题。 2. **二进制模式**:跨平台时需注意换行符和编码差异。 3. **路径分隔符**:Windows用`\`,Linux/Mac用`/`,建议统一为`/`(Windows兼容)。 4. **可移植性**:文件夹操作依赖系统API,跨平台代码需条件编译。 --- 通过以上步骤,可基本实现C语言中对文件文件夹的读写、创建与管理。实际开发中,建议结合具体平台文档或使用第三方库(如Boost.Filesystem)简化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值