java_05_IO

1,动手动脑

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

分析思路:

1)找到该文件夹下所有文件。

2)找出其中字节数大于1*1024*1024的并输出。

  1. package com.me.afterclass;
  2.  
  3. import java.io.File;
  4.  
  5. public class Size {
  6. public static void main(String[] args) {
  7. File dir = new File("D:\\java编译器");
  8. File[] files=dir.listFiles();
  9. for(int i=0;i<files.length;i++)
  10. {
  11. if(files[i].isFile())
  12. {
  13. if(files[i].length()>1*1024*1024)
  14. System.out.print(files[i]+"的大小:");
  15. System.out.printf("%.2f",files[i].length()/1024.0/1024.0);
  16. System.out.println("M");
  17. }
  18. }
  19. }
  20.  
  21. }

运行测试:

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

源代码:

  1. package com.me.afterclass;
  2.  
  3. import java.io.IOException;
  4. import java.nio.file.FileSystems;
  5. import java.nio.file.FileVisitResult;
  6. import java.nio.file.Files;
  7. import java.nio.file.Path;
  8. import java.nio.file.PathMatcher;
  9. import java.nio.file.Paths;
  10. import java.nio.file.SimpleFileVisitor;
  11. import java.nio.file.attribute.BasicFileAttributes;
  12.  
  13. public class houzhui {
  14.  
  15. public static void main(String args[]) throws IOException {
  16. String glob = "glob:**/*.{java,txt}";
  17. String path = "D:\\JAVA\\源代码\\java上课";
  18. match(glob, path);
  19. }
  20.  
  21. public static void match(String glob, String location) throws IOException {
  22.  
  23. final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
  24.  
  25. Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
  26.  
  27. @Override
  28. public FileVisitResult visitFile(Path path,
  29. BasicFileAttributes attrs) throws IOException {
  30. if (pathMatcher.matches(path)) {
  31. System.out.println(path);
  32. }
  33. return FileVisitResult.CONTINUE;
  34. }
  35.  
  36. @Override
  37. public FileVisitResult visitFileFailed(Path file, IOException exc)
  38. throws IOException {
  39. return FileVisitResult.CONTINUE;
  40. }
  41. });
  42. }
  43.  
  44. }

运行测试:

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

分析思路:

1,寻找出后缀为.txt的文件。

2,再逐行查找是否有相应字符。

源代码:

  1. package com.me.afterclass;
  2.  
  3. import java.io.IOException;
  4. import java.io.*;
  5. import java.nio.file.FileSystems;
  6. import java.nio.file.FileVisitResult;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.PathMatcher;
  10. import java.nio.file.Paths;
  11. import java.nio.file.SimpleFileVisitor;
  12. import java.nio.file.attribute.BasicFileAttributes;
  13.  
  14. public class Content {
  15.  
  16. public static void main(String args[]) throws IOException {
  17. String glob = "glob:**/*.txt";
  18. String path = "D:\\JAVA\\源代码\\java上课";
  19. match(glob, path);
  20. }
  21.  
  22. public static void match(String glob, String location) throws IOException {
  23.  
  24. final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
  25.  
  26. Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
  27.  
  28. @Override
  29. public FileVisitResult visitFile(Path path,
  30. BasicFileAttributes attrs) throws IOException {
  31. if (pathMatcher.matches(path)) {
  32. BufferedReader reader =Files.newBufferedReader(path);//读取文件内的内容
  33. String line=null;
  34. while((line = reader.readLine()) !=null) {
  35. if(line.indexOf("main")!=-1)//若读取的内容等于“main"则输出文件名
  36. //int indexOf(String string)返回第一次出现的指定子字符串在此字符串中的索引。没找到返回-1
  37. {
  38. System.out.println(path);
  39. break;
  40. }
  41. }
  42. }
  43. return FileVisitResult.CONTINUE;
  44. }
  45.  
  46. @Override
  47. public FileVisitResult visitFileFailed(Path file, IOException exc)
  48. throws IOException {
  49. return FileVisitResult.CONTINUE;
  50. }
  51. });
  52. }
  53.  
  54. }

运行测试:

二,动手动脑:实现监控文件夹功能

Path类实现了Watchable接口,因此我们能监控它的变化。 示例FileWatchDemo.java展示了如何监控一个文件夹中文件的新增、删除和改名。 请通过查询JDK文件和使用搜索引擎等方式,看懂此示例代码,并弄明白Watchable、WatchService等类型之间的关系,使用UML类图表示出这些类之间的关系。

WatchService 
看作是文件监控器,通过操作系统原生文件系统来运行。 
针对单点多appkey的情况,可以注册开启多个监控器。 
每个监控器可看作是后台线程,通过监控文件发出的信号来实现监控。

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

Watchable 被观察者,与WatchService结合使用, java.nio.file.Path 已经实现

WatchService 实例化:

WatchService watchService = FileSystems.getDefault().newWatchService();

利用 Path 实例化监控对象 Watchable

Path dir = Paths.get(path);

将 Path 注册到 WatchService 中//这里监控文件的 创建、修改、删除  但是这里返回的key里面的监控信息为空

WatchKey key = dir.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);

注意:监控池是静态的,只有当你主动去获取新的监控池时才会有更新的内容加入监控池。这就造成了系统接收到监控信息事件可能稍长的问题。

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),若有子目录,将其中的文件加到list中。

3),计算所有文件的大小,并输出。

  1. package com.me.afterclass;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. public class Capacity {
  6. static long size=0;
  7. private static ArrayList<String> filelist=new ArrayList<String>();
  8. public void getFiles(String filePath)
  9. {
  10. File root=new File(filePath);
  11. File[] files=root.listFiles();
  12. for(File file:files)
  13. {
  14. if(file.isDirectory())//若有子目录,将其中的文件加到list中
  15. {
  16. getFiles(file.getAbsolutePath());
  17. filelist.add(file.getAbsolutePath());
  18. }
  19. else
  20. {
  21. size+=file.getAbsolutePath().length();
  22. }
  23. }
  24. System.out.print("D:\\JAVA\\源代码\\java上课 的总容量是:");
  25. System.out.println(size+"字节");
  26. }
  27. public static void main(String[] args)
  28. {
  29. Capacity s=new Capacity();
  30. String filePath="D:\\JAVA\\源代码\\java上课";
  31. s.getFiles(filePath);
  32. }
  33.  
  34. }

运行测试:

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

分析思路:

1),声明加密解密的密匙。

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

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

源代码:

  1. package com.me.afterclass;
  2.  
  3. import java.io.File;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. public class Encryption {
  9. private static final int numOfEncAndDec=0x99;//加密解密密钥
  10. private static int dataOfFile=0;//文件字节内容
  11.  
  12. public static void main(String[] args) {
  13. File srcFile=new File("Initialization.txt");//初始化文件
  14. File encFile=new File("Encryption.txt"); //加密文件
  15. File decFile=new File("Decryption.txt"); //解密文件
  16.  
  17. try {
  18. EncFile(srcFile,encFile); //加密操作
  19. DecFile(encFile,decFile);
  20. }catch(Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. private static void EncFile(File srcFile,File encFile)throws Exception{
  25. if(!srcFile.exists()) {
  26. System.out.println("source file not exixt");
  27. }
  28. if(!encFile.exists()) {
  29. System.out.println("encrypt file created");
  30. encFile.createNewFile();//若无加密文件,新建一个加密文件
  31. }
  32. InputStream fis=new FileInputStream(srcFile);
  33. OutputStream fos=new FileOutputStream(encFile);
  34.  
  35. while((dataOfFile=fis.read())>-1) {//当读到文件内容时
  36. fos.write(dataOfFile^numOfEncAndDec);//将读出的内容加密后写入
  37. }
  38. fis.close();
  39. fos.flush();
  40. fos.close();
  41. }
  42. private static void DecFile(File encFile,File decFile)throws Exception{
  43. if(!encFile.exists()) {
  44. System.out.println("encrypt file not exixt");
  45. }
  46. if(!decFile.exists()) {
  47. System.out.println("decrypt file created");
  48. decFile.createNewFile();
  49. }
  50. InputStream fis=new FileInputStream(encFile);
  51. OutputStream fos=new FileOutputStream(decFile);
  52.  
  53. while((dataOfFile=fis.read())>-1) {
  54. fos.write(dataOfFile^numOfEncAndDec);
  55. }
  56. fis.close();
  57. fos.flush();
  58. fos.close();
  59. }
  60.  
  61. }

运行测试:

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

源代码:

  1. package com.me.afterclass;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileNotFoundException;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11.  
  12. public class Partition {
  13. public static void main(String[] args) {
  14. //声明:!!partitionFile(原大文件,切割后存放的小文件的路径,切割规定的行数)
  15. partitionFile("D:\\中转站3\\test\\圣墟.txt", "D:\\中转站3\\test\\t",30000);
  16. }
  17.  
  18. private static void partitionFile(String src, String endsrc, int num) {
  19. FileInputStream fis = null;
  20. File file = null;
  21. int name=1;
  22. try {
  23. InputStreamReader reader = new InputStreamReader( new FileInputStream(src),"GBK");
  24. BufferedReader br = new BufferedReader(reader);//读取文件内的内容
  25. String str=br.readLine();
  26. file =new File(src);
  27. while (str != null) {
  28.  
  29. //分别找到原大文件的文件名和文件类型,为下面的小文件命名做准备
  30. String name2 = file.getName();
  31. int lastIndexOf = name2.lastIndexOf(".");
  32. String substring = name2.substring(0, lastIndexOf);
  33. String substring2 = name2.substring(lastIndexOf, name2.length());
  34. FileWriter write = new FileWriter(endsrc + "\\\\"+ substring + "-" + name + substring2);
  35. BufferedWriter out=new BufferedWriter(write);
  36. for(int k=0;k<num;k++) {
  37. out.write(str);
  38. str=br.readLine();
  39. if(str == null) {
  40. break;
  41. }
  42. }
  43. //结束资源
  44. out.close();
  45. name++;
  46. }
  47. } catch (FileNotFoundException e) {
  48. e.printStackTrace();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. } finally {
  52. try {
  53. if (fis != null) {
  54. //结束资源
  55. fis.close();
  56. }
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62. }

运行测试:

java_05_IO的更多相关文章

随机推荐

  1. Keras入门——(5)长短期记忆网络LSTM(二)

    参考: https://blog.csdn.net/zwqjoy/article/details/80493341 https://blog.csdn.net/u012735708/article/d ...

  2. 面试题23从上到下打印二叉树+queue操作

    //本题思路就是层次遍历二叉树,使用一个队列来模拟过程 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *ri ...

  3. 关于pandas增加行时,索引名称的一些问题

    学习pandas两天了,关于这个增加行的问题一直困扰着我,测试了几个代码,终于搞通了一点(昨天是因为代码敲错了...) 直接上代码: dates = pd.date_range(',periods=6 ...

  4. [转载]@Component 和 @Bean 的区别

    @Component 和 @Bean 的区别 @Component 和 @Bean 的区别 Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean. 完成这两个动作有三种方 ...

  5. vs2010编译C++ 栈的使用

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  6. Springboot注解使用总结

    使用Spring boot已经有段时间了,但是对很多注解的使用经常会遇到模糊甚至不解的地方,这次有时间便总结一下. 注解(Annotation)概念 注解是Java5开始对元数据的支持,注解与注释是有 ...

  7. [Java] Eclipse 设置相同变量背景色高亮显示

    在Eclipse中,鼠标选中或者光标移动到java类的变量名时,相同变量会被标识显示(设置背景色高亮), 并且侧边滚动条会标出变量的位置, 查找变量十分方便. 1.相同变量标识高亮显示:Window ...

  8. 初识python 廖雪峰(慕课网)

    3-9 Python中的布尔类型 短路计算 True和False是布尔值,就像1,2,3是整数,“abc”是字符串一样. 做这个题,需要了解以下两点: 第一,在一个语句中,当and和or同时存在时,a ...

  9. Fréchet Inception Distance(FID)

    计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集 ------ ImageNet,在 ...

  10. ACM-Antiprime数

      问题描述: swust打不开,随便找了个博客.... 对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4. 定义:如果某个正整数x满足:对于任意i(0<i<x) ...