zoukankan      html  css  js  c++  java
  • 文件与流动手动脑解决与课后作业

    一、动手动脑
    1、题目

    使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件

    程序设计思路:

    (1)首先找出指定文件夹下所有文件

    (2)遍历所有文件用if判断找出所有大于1*1024*1024字节的文件

    源代码:

    import java.io.File;
    import java.text.DecimalFormat;
    
    public class Findfile {
        static DecimalFormat df=new DecimalFormat("######0.00");
        public static void main(String[] args) {
            File dir = new File("D:\UML学习资料");
            File [] allfile = dir.listFiles();
            for(int i=0;i<allfile.length;i++) {
                if(allfile[i].isFile()) {
                    if(allfile[i].length()>1*1024*1024) {
                        System.out.print(allfile[i]+"的文件大小为        ");
                        System.out.print(df.format(allfile[i].length()/1024.0/1024.0)+"M");
                        System.out.println("");
                    }
                }
            }
        }
    }

    测试截图

     

     

     

    2、题目

    使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件

    程序设计思路:

    (1)首先找出指定文件夹下所有文件

    (2)遍历所有文件用if判断找出所有后缀名为.txt和.java的文件

    源代码:

    import java.io.IOException;
    import java.nio.file.FileSystems;
    import java.nio.file.FileVisitResult;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.PathMatcher;
    import java.nio.file.Paths;
    import java.nio.file.SimpleFileVisitor;
    import java.nio.file.attribute.BasicFileAttributes;
    
    
    public class Findfile2 {
        
        public static void match(String glob, String location) throws IOException {
            // TODO Auto-generated method stub
            final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
    
            Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
    
                @Override
                public FileVisitResult visitFile(Path path,
                        BasicFileAttributes attrs) throws IOException {
                    if (pathMatcher.matches(path)) {
                        System.out.println(path);
                    }
                    return FileVisitResult.CONTINUE;
                }
    
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc)
                        throws IOException {
                    return FileVisitResult.CONTINUE;
                }
            });
        }
    
        public static void main(String[] args) throws IOException {
            String glob = "glob:**/*.{java,txt}";
            String path = "D:\Test";
            match(glob,path);
        }
    
    }

     

    测试截图

     

     

     

    3、题目

    使用Files. walkFileTree()找出指定文件夹下所有包容指定字符串的txt文件

    程序设计思路:

    (1)首先找出指定文件夹下所有文件

    (2)遍历所有文件用if判断找出所有后缀名为.txt的文件

    (3)在所有txt文件中查找所有包容指定字符的txt 文件

    源代码:

    import java.io.IOException;
    import java.io.*;
    import java.nio.file.FileSystems;
    import java.nio.file.FileVisitResult;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.PathMatcher;
    import java.nio.file.Paths;
    import java.nio.file.SimpleFileVisitor;
    import java.nio.file.attribute.BasicFileAttributes;
    
    public class Findfile3 {
    
        public static void main(String args[]) throws IOException {
            String glob = "glob:**/*.txt";
            String path = "D:\Test";
            match(glob, path);
        }
    
        public static void match(String glob, String location) throws IOException {
    
            final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
    
            Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
    
                @Override
                public FileVisitResult visitFile(Path path,
                        BasicFileAttributes attrs) throws IOException {
                    if (pathMatcher.matches(path)) {
                     BufferedReader reader =Files.newBufferedReader(path);//读取文件内的内容 
                      String s=null;
                      while((s = reader.readLine()) !=null) {
                       if(s.indexOf("yang")!=-1){//若读取的内容等于“main"则输出文件名
                             System.out.println(path);
                             break;
                       }
                      }
                    }
                      return FileVisitResult.CONTINUE;
                }
    
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc)
                        throws IOException {
                    return FileVisitResult.CONTINUE;
                }
            });
        }
    
    }

     

    测试截图

     

     

    4、题目

    请通过查询JDK文件和使用搜索引擎等方式,看懂此示例代码,并弄明白Watchable、

    WatchService等类型之间的关系,使用UML类图表示出这些类之间的关系

    解答:

    WatchService 看作是文件监控器

    WatchService 用来观察被注册了的对象所有的变化和事件

    Watchable 被观察者,与WatchService结合使用

    WatchService和Watchable通过Path联系并使用

    (1)java.nio.file.WatchService文件系统监视服务的接口类,它的具体实现由监视服务提供者负责加载

    (2)ava.nio.file.Watchable 实现了 java.nio.file.Watchable 的对象,然后才能注册监视服务 WatchService,java.nio.file.Path实现了 watchable 接口,后者使用 Path 对象注册监视服务。 

    (3)java.nio.file.WatchKey 这个类代表着 Watchable 对象和监视服务 WatchService 的注册关系,WatchKey 在 Watchable 对象向 WatchService 注册的时候被创建。它是 Watchable 

    和WatchService 之间的关联类

     

    二、课后作业

    1、题目

    编写一个程序,指定一个文件夹,能自动计算出其总容量

    程序设计思路:

    (1)将指定文件夹下的所有文件存入list中

    (2)如果文件夹还有文件夹,递归调用(1)将其中的文件也加到list中

    (3)将所有所有文件的大小相加,然后输出

    源代码:

    import java.io.File;
    import java.util.ArrayList;
    
    public class Capacity {
        static long sum=0;
        private static ArrayList<String> filelist=new ArrayList<String>();
        public void getFiles(String filePath)
        {
            File f=new File(filePath);
            File[] allfile=f.listFiles();
            for(File file:allfile)
            {
                if(file.isDirectory())//若还有文件夹,就将其中的文件加到list中
                {
                    getFiles(file.getAbsolutePath());
                    filelist.add(file.getAbsolutePath());
                }
                else 
                {
                    sum+=file.getAbsolutePath().length();
                }
            }
            System.out.println("D:\Test  的总容量是:    "+sum+"字节");
        }
        public static void main(String[] args) 
        {
            Capacity s=new Capacity();
            String filePath="D:\Test";
            s.getFiles(filePath);
        }
    
    }

     

    测试截图

     

     

     

    2、题目

    编写一个文件加解密程序,通过命令行完成加解密工作

    程序设计思路:

    (1)声明加密解密的密匙

    (2)从初始化文件中读取内容,用密匙加密后存到加密文件中

    (3)从加密文件中读取内容,用密匙解密后输出到解密文件

    源代码:

    import java.io.File;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    public class Miyao {
        private static final int numOfEncAndDec=0x99;//加密解密密钥
         private static int dataOfFile=0;//文件字节内容
    
         public static void main(String[] args) {
          File srcFile=new File("D:\Test\chushihua.txt");//初始化文件
          File encFile=new File("D:\Test\jiami.txt"); //加密文件
          File decFile=new File("D:\Test\jiemi.txt");  //解密文件
          
          try {
           EncFile(srcFile,encFile);  //加密操作
           DecFile(encFile,decFile);  //解密操作
          }catch(Exception e) {
           e.printStackTrace();
          }
         }
         private static void EncFile(File srcFile,File encFile)throws Exception{
          if(!srcFile.exists()) {
           System.out.println("文件不存在");//初始化文件不存在
           }
          if(!encFile.exists()) {
           System.out.println("文件没有创建");
           encFile.createNewFile();//若无加密文件,则新建一个加密文件
          }
          InputStream fis=new FileInputStream(srcFile);
          OutputStream fos=new FileOutputStream(encFile);
          
          while((dataOfFile=fis.read())>-1) {//当读到文件内容时
           fos.write(dataOfFile^numOfEncAndDec);//将读出的内容加密后写入
          }
          fis.close();
          fos.flush();
          fos.close();
         }
         private static void DecFile(File encFile,File decFile)throws Exception{
          if(!encFile.exists()) {
           System.out.println("加密文件不存在");
          }
          if(!decFile.exists()) {
           System.out.println("解密文件不存在");
           decFile.createNewFile();
          }
          InputStream fis=new FileInputStream(encFile);
          OutputStream fos=new FileOutputStream(decFile);
          
          while((dataOfFile=fis.read())>-1) {//当读到文件内容时
           fos.write(dataOfFile^numOfEncAndDec);//将读出的内容解密后写入
          }
          fis.close();
          fos.flush();
          fos.close();
         }
    
    }

    测试截图

    初始化文件

     

    加密文件

     

     

     解密文件

     

     

     

     

    3、题目

    编写一个文件分割工具,能把一个大文件分割成多个小的文件。并且能再次把它们合并起来得到完整的文件

    程序设计思路:

    (1)先用文件分割工具分割指定的大文件

    (2)将分割后的小文件存入

    (3)用文件合并工具将小文件合并

    源代码:

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class CutBigFile{
        
        private static void partitionFile(String src, String endsrc, int num) {
            FileInputStream fis = null;
            File file = null;
            int name=1;
            try {
                InputStreamReader reader = new InputStreamReader(new FileInputStream(src),"GBK"); 
                BufferedReader br = new BufferedReader(reader);//读取文件内的内容 
                String str=br.readLine();
                file =new File(src);
                while (str != null) {
     
                    String name2 = file.getName();//分别找到原大文件的文件名和文件类型,为下面的小文件命名做准备
                    int lastIndexOf = name2.lastIndexOf(".");
                    String substring = name2.substring(0, lastIndexOf);
                    String substring2 = name2.substring(lastIndexOf, name2.length());
                    FileWriter write = new FileWriter(endsrc + "\\"+ substring + "-" + name + substring2);
                    BufferedWriter out=new BufferedWriter(write);
                    for(int k=0;k<num;k++) {
                        out.write(str);
                        str=br.readLine();
                        if(str == null) {
                            break;
                        }
                    }
                    //结束资源
                    out.close();
                    name++;
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fis != null) {
                        //结束资源
                        fis.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args) {
            //partitionFile(原大文件,切割后存放的小文件的路径,切割规定的行数)
            partitionFile("D:\Test\Harry Potter and the Sorcerer's Stone.txt", "D:\Test\切割后",2500);
        }
    }

     

    测试截图

    大文件

     

     

    小文件

     

     

    小文件内容

     

     

  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/yang2000/p/11806238.html
Copyright © 2011-2022 走看看