码迷,mamicode.com
首页 > 其他好文 > 详细

课堂测试-------文件操作

时间:2019-11-05 16:59:21      阅读:67      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!