标签:txt readline 缓冲流 int() buffered 个数 内容 排序 文件名
今天测试java文件内容,但文件还不熟悉,这几天一直在搞JavaWeb,该好好看看Java文件了
问题一:读入文件中的内容,输出前n个出现最多的字母(将单词分解成字母),区分大小写
解题思路:首先得先读取文件内容,将一些符号删去,然后提取单词,再提取字母,将它们分别放到52个char类型的数组当然还有它的次数,当然放数组里是由规律的。最后排序。
代码:这是一个方法,用的时候只需把文件地址传入即可!
public static void showTheMostAlphabet(String path) { double AlphabetNum[] = new double[52]; char Alphabet[] = new char[52]; double AlphabetSum = 0; int num = 0,a = 0; Scanner scanner = new Scanner(System.in); System.out.print("请输入n:(n为前n个最常出现的字母数)"); int n = scanner.nextInt(); File file1 = new File(path); String path1 = "E:/test/新建文本文档 (4).txt"; File file2 = new File(path1); /* * 加载缓冲流 */ try(BufferedReader br = new BufferedReader(new FileReader(file1)); BufferedWriter bw = new BufferedWriter(new FileWriter(file2))){ String line = null; // 逐行读取 line = br.readLine(); while(line!=null) { // 将字符串按指定要求分割 StringTokenizer st = new StringTokenizer(line," .,?;!\r\n:“”‘: "); while(st.hasMoreElements()) { String str =(String)st.nextElement(); for(int i = 0;i<str.length();i++) { if(str.charAt(i)>=65&&str.charAt(i)<=90) { Alphabet[str.charAt(i)-65] = str.charAt(i); AlphabetNum[str.charAt(i)-65]++; }else if(str.charAt(i)>=97&&str.charAt(i)<=122) { Alphabet[str.charAt(i)-71] = str.charAt(i); AlphabetNum[str.charAt(i)-71]++; } } } line=br.readLine(); } /* * 按大小给字母排序 */ for(int i=0;i<52;i++) { for(int j=i+1;j<52;j++) { if(AlphabetNum[j]>AlphabetNum[i]) { double temp=AlphabetNum[i]; AlphabetNum[i]=AlphabetNum[j]; AlphabetNum[j]=temp; char Temp=Alphabet[i]; Alphabet[i]=Alphabet[j]; Alphabet[j]=Temp; } } } // 字母的总数 for(int i = 0;i<52;i++) { AlphabetSum+=AlphabetNum[i]; } /* * 输出前n个出现最多的字母,并输出次数和百分比 */ for(int i = 0;i < n;i++) { System.out.print(i+1+": "+Alphabet[i]+" 次数:"+AlphabetNum[i]+" 百分比:"); System.out.printf("%.2f",AlphabetNum[i]/AlphabetSum*100); System.out.println("%"); } }catch(Exception e) { e.printStackTrace(); } }
运行结果:
问题2:和问题1一样,只不过是将字母换成单词。
代码:
/* * 输出指定文件里前n个最常出现的单词 */ public static void showTheMostWord(String path) { double wordNum[] = new double[100000]; String word[] = new String[100000]; double wordSum = 0; int num = 0,a = 0; Scanner scanner = new Scanner(System.in); System.out.print("请输入n:(n为前n个最常出现的单词数)"); int n = scanner.nextInt(); File file = new File(path); // 加载缓冲流 try(BufferedReader br = new BufferedReader(new FileReader(file))){ String line = null; // 逐行读取 line = br.readLine(); while(line!=null) { StringTokenizer st = new StringTokenizer(line," \".,?;!\r\n:“”‘: "); while(st.hasMoreElements()) { String str =(String)st.nextElement(); // 判断重复的单词 for(int i = 0;i < num;i++) { if(str.equals(word[i])) { wordNum[i]++; }else { a++; } } if(a==num) { word[num] = str; wordNum[num]++; num++; } a = 0; } line=br.readLine(); } /* * 按大小给单词排序 */ for(int i=0;i<num;i++) { for(int j=i+1;j<num;j++) { if(wordNum[j]>wordNum[i]) { double temp=wordNum[i]; wordNum[i]=wordNum[j]; wordNum[j]=temp; String Temp=word[i]; word[i]=word[j]; word[j]=Temp; } } } /* * 输出前n个出现最多的单词,并输出次数 */ for(int i = 0;i < n;i++) { System.out.println(i+1+": "+word[i]+" 次数:"+wordNum[i]); } }catch(Exception e) { e.printStackTrace(); } }
运行结果:
问题3:输出文件里的全部单词。(把问题2里的n改成num即可,记得删去获取n的操作)
运行结果:
问题4:到指定执行功能2;
解题思路:得考录是否为目录,而且如果文件不是txt文件的话就会报错。当然即使是txt文件,有可能内容为空,所有还需判断内容是否为空
代码:
/* * 到指定文件执行指定功能 */ public static void test(File f) { if(f.isDirectory()) { File[] files = f.listFiles(); for(File temp:files) { if(temp.getName().endsWith("txt")) { if(temp.length()==0) { System.out.println(temp.getAbsolutePath()+"是个空文件"); continue; }else { System.out.println(temp.getAbsolutePath()); showTheMostWord(temp.getAbsolutePath()); } } test(temp); } } }
运行结果:
问题5:利用递归遍历文件
解题思路:利用递归方法,如果是目录则继续递归,然后输出文件名。
代码:
/* * 利用递归输出给定目录的子文件 */ public static void printFileTree(File f) { if(f.isDirectory()) { // 判断是否为目录 File[] files = f.listFiles(); // 将子文件存在File数组里 for(File temp:files) { // 遍历整个数组 printFileTree(temp); System.out.println(temp.getAbsolutePath()); } } }
运行结果:
如果有大佬发现错误,请留言提示,正在学习中,感谢提错误!!!!!谢谢!!!!!!
标签:txt readline 缓冲流 int() buffered 个数 内容 排序 文件名
原文地址:https://www.cnblogs.com/yangxiao-/p/11799406.html