日期:2018.11.18

博客期:025

星期日

  Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件

 package temp;

 import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.List; public class FindFile2 {
public void test1() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
//Path path = fileSystem.getPath("c:/windows");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor4(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public void test2() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
//Path path = fileSystem.getPath("c:/windows");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public void test3() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor2(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public void test4() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor3(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public static void main(String[] args) throws IOException {
FindFile2 t = new FindFile2();
t.test1();
//t.test2();
//t.test3();
//t.test4();
} }
class FilterFilesVisitor extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}
class FilterFilesVisitor2 extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor2(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".java")) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}
class FilterFilesVisitor3 extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor3(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")&&(file.toString().contains("no")||file.toString().contains("on"))) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}
class FilterFilesVisitor4 extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor4(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toFile().length()>1024) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}

FilterFilesVisitor4.java

  运行截图:

  解说:这个是总体的代码,test1对应Part1,test2、3对应Part2和test4对应Part3,而我们的区别就在于判定条件上,File类的length()方法,求得文件的大小,求出的值为long类型,实际上就是文件有多少B(字节)。

  Part 2:使用 Files.walkFileTree()来找出指定文件夹下以.txt和.java为后缀的文件

 package temp;

 import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.List; public class FindFile2 {
public void test2() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
//Path path = fileSystem.getPath("c:/windows");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public void test3() throws IOException{
Path path = Paths.get("D:\\test\\hold1");
List<String> result = new LinkedList<String>();
Files.walkFileTree(path,new FilterFilesVisitor2(result));
System.out.println("result.size()=" + result.size());
for (String name : result) {
System.out.println(name);
}
}
public static void main(String[] args) throws IOException {
FindFile2 t = new FindFile2();
t.test2();
t.test3();
} }
class FilterFilesVisitor extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}
class FilterFilesVisitor2 extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); public FilterFilesVisitor2(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".java")) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}

FindFile2.java

  运行截图:

  解说:实际上这个就是继承一下 模板类 SimpleFileVisitor<Path> 的基础属性,然后自己定义我们自己的应用方法。不会的园友要实现文件的查找,只需按照以上模板修改file.toString().endsWith(".txt")里的语句即可,如上代码也可以直接写file.toString().endsWith(".txt")||file.toString().endsWith(".java"),嗯?是不是很好理解?

  Part 3: Files.walkFileTree()来找出指定文件夹下含有特殊字符串的.txt文件

 class FilterFilesVisitor3 extends SimpleFileVisitor<Path> {

     private List<String> result = new LinkedList<String>();

     public FilterFilesVisitor3(List<String> result) {
this.result = result;
} public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")&&(file.toString().contains("no")||file.toString().contains("on"))) {
result.add(file.toString());
}
return FileVisitResult.CONTINUE;
}
}

FilterFilesVisitor3.java

  运行截图:

  解说:这个实际上,就是更改判定的问题,配合上边代码实现任务!

  Part 4:看懂如下代码

 package file;

 import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.HashMap;
import java.util.Map; public class FileWatcherDemo { /**
* @param args
*/
public static void main(String[] args) {
//创建一个WatchService对象,此对象将用于管理特定文件夹的变动信息队列。
try{WatchService service=FileSystems.getDefault().newWatchService();
//此集合可保存多个文件夹的监控信息,当前只使用了一个
Map<WatchKey, Path> keyMap= new HashMap<WatchKey, Path>();
Path path=Paths.get("D:\\test");
//设置WatchService对象管理的内部队列,将保存指定的文件夹的创建、删除和修改事件信息
//返回的WatchKey对象可用于从事件队列中获取事件对象
WatchKey key=path.register(service, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
keyMap.put(key, path); do {
//开始监控,阻塞等待,当感兴趣的事件发生时,take()方法返回。
key=service.take();
Path eventDir=keyMap.get(key);
//从事件队列中提取所有的事件
for (WatchEvent<?> event : key.pollEvents()) {
//是什么类型的事件?
WatchEvent.Kind<?> kind=event.kind();
//是哪个对象发生了变动?
Path eventPath=(Path)event.context();
System.out.println(eventDir+":"+kind+":"+eventPath);
}
} while (key.reset()); //reset方法重置此对象,让其可以重新接收信息 } catch (Exception e) { } } }

FileWatcherDemo

  运行结果:

  解说:嗯,我是进行了对hold1文件夹里的文件进行改名,改了两次;之后是将本目录下的文件line2.bmp复制并粘贴到当前文件目录中,之后删掉原来的line2.bmp,之后改名line2 - 副本.bmp为line2.bmp文件,截图如上,就是针对此操作进行的监听,WatchKey对象可用于从事件队列中获取事件对象,其中path.register()方法是返回WatchKey对象的工具,需要Path给好路径。StandardWatchEventKinds就正如它的翻译一样,它是标准的监听事件种,其内部含有我们静态的事件成员,比如ENTRY_CREATE(创建)和ENTRY_DELETE(删除)等。WatchService service=FileSystems.getDefault().newWatchService();一句是

WatchService功能的伪构造方法,就是新建一个监听对象的方法...

  简易UML类图:

  Part 5:写一个小实例——文件分割工具、文件组合工具(目前领域只限txt文件)

 package com.zhang.pvp;

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner; public class TestZip {
public void FileFrozen(File x) throws FileNotFoundException{
File f1,f2,f3;
f1 = new File("file/part1.txt");
f2 = new File("file/part2.txt");
f3 = new File("file/part3.txt");
Scanner sc = new Scanner(x);
PrintWriter pw1 = new PrintWriter(f1);
PrintWriter pw2 = new PrintWriter(f2);
PrintWriter pw3 = new PrintWriter(f3);
pw1.println(sc.nextLine());
pw2.println(sc.nextLine());
while(sc.hasNextLine())
{
pw3.println(sc.nextLine());
}
pw1.close();
pw2.close();
pw3.close();
sc.close();
}
public void FileGroup(File []x,int num) throws FileNotFoundException{
File file = new File("file/AddTo.txt");
PrintWriter pw = new PrintWriter(file);
for(int i=0;i<num;++i)
{
Scanner sc = new Scanner(x[i]);
while(sc.hasNextLine())
{
pw.println(sc.nextLine());
}
sc.close();
}
pw.close();
}
public static void main(String[] args) throws FileNotFoundException {
File f = new File("file/basic.txt");
File []fs = new File[3];
for(int i=0;i<3;++i)
fs[i] = new File("file/part"+(i+1)+".txt");
TestZip tz = new TestZip();
tz.FileFrozen(f);
tz.FileGroup(fs,3);
}
}

TestZip.java

  Part 6:计算文件夹的总大小的工具+实现文件加密功能

 package tempzerb;

 import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Scanner; class FilterFilesVisitor extends SimpleFileVisitor<Path> { private List<String> result = new LinkedList<String>(); private long Length = 0; public long getLength() {
return Length;
}
public void setLength(long length) {
Length = length;
}
public FilterFilesVisitor(List<String> result) {
this.result = result;
Length = 0;
}
//查询以 ends 为结尾的文件
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
Length = Length + file.toFile().length();
return FileVisitResult.CONTINUE;
}
//查询以 ends 为结尾的文件
public FileVisitResult visitFileEndWith(Path file, BasicFileAttributes attrs,String ends) {
if (file.toString().endsWith(ends)) {
result.add(file.toString());
}
Length = Length + file.toFile().length();
return FileVisitResult.CONTINUE;
}
//查询包含 card 字符串的文件
public FileVisitResult visitFileContains(Path file, BasicFileAttributes attrs,String card) {
if (file.toString().contains(card)) {
result.add(file.toString());
}
Length = Length + file.toFile().length();
return FileVisitResult.CONTINUE;
}
//查询大小处于m和n之间的文件
public FileVisitResult visitFileContains(Path file, BasicFileAttributes attrs,long m,long n) {
if (file.toFile().length()>=m&&file.toFile().length()<=n) {
result.add(file.toString());
}
Length = Length + file.toFile().length();
return FileVisitResult.CONTINUE;
}
} public class QTest {
public void test1(Path path) throws IOException{
List<String> result = new LinkedList<String>();
FilterFilesVisitor ffv = new FilterFilesVisitor(result);
Files.walkFileTree(path,ffv);
System.out.println("总大小为: " + ffv.getLength());
}
public void test2(File x) throws IOException{
//加密文件
File enFile = new File("file/enfile.txt");
//解密文件
File untiFile = new File("file/untifile.txt");
if(enFile.exists())
enFile.delete();
if(untiFile.exists())
untiFile.delete();
enFile.createNewFile();
untiFile.createNewFile();
Scanner sc = new Scanner(x);
PrintWriter pw = new PrintWriter(enFile);
PrintWriter pws = new PrintWriter(untiFile);
Random random = new Random(System.currentTimeMillis());
int c = random.nextInt(10);
pws.append((char)c);
while(sc.hasNext())
{
String str = sc.next();
char []cha = str.toCharArray();
for(int i=0;i<cha.length;++i)
pw.append((char)(cha[i]-c));
pw.append(' ');
}
pws.close();
sc.close();
pw.close();
}
public void test3(Path path){ }
public static void main(String[] args) throws IOException {
QTest q = new QTest();
Path path = Paths.get("file");
q.test1(path);
q.test2(new File("file/Mort.jsp"));
q.test3(path);
}
}

QTest.java

  运行截图:

  说明:我的文件加密就是文件的字符都减去同一个随机值...并把这个随机值读到某一个文件当中去,这个文件就是解码文件,而减去随机值的字符们进而构成了我们无法直接识别、读取的伪乱码,这就是加密文件了,这个加密文件的保存内容,你真的看不懂,难道你看的出来上边的图片内容实际上是"Hello World"吗?只有通过调用解码文件的特殊字符,进而完成对加密文件的解码,才能得到真正“可读”的文件!而读取文件总大小的话,就设一个值,遍历文件就好了,没遍历一个文件,就加上它的长度!最终得到的大小就是文件夹里的所有文件的大小。至于文件的分割其实就是将文件读取到的数据,写入不同的两个文件里边去。

Java的动手动脑(七)的更多相关文章

  1. Java之动手动脑(三)

    日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...

  2. java的动手动脑10月20日

    (1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/publi ...

  3. Java的动手动脑

    动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...

  4. java异常处理动手动脑问题解决和课后总结

    动手动脑 一.问题:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1.源代码 import javax.swing.*; cl ...

  5. java课java方法动手动脑

    动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) {       ...

  6. java课堂动手动脑及课后实验总结

      动手动脑一:枚举   输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...

  7. java课堂动手动脑博客

    随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 要求将设计思路.程序流程图.源程序代码.结果截图.编程总结等发表到博客园. (截止时间2015 ...

  8. Java一些动手动脑实验

    一.Java字段初始化的规律: 输出结果为:100 和 300 当把{filed=200}放在public int field=100之后输出结果为:200 和 300 所以执行类成员定义时指定的默认 ...

  9. Java的动手动脑(六)

    日期:2018.11.8 星期四 博客期:022 --------------------------------------------------------------------------- ...

随机推荐

  1. 数据库设计理论与实践·<五>常见疑难杂症

  2. Cloudflare DNS 域名解析

    参考文章:Cloudflare DNS 域名解析 小白一枚,等我这几天搞定后就写.....

  3. php函数:解决数组转对象时数组内中文乱码问题

    function to_urlencode(&$arr){//解决数组转对象时数组内中文乱码问题 foreach($arr as $key => $value){ if(is_array ...

  4. 添加 node mocha 测试模块

    1.mocha  支持TDD 和 BDD两种测试风格 2.引用assert模块  此模块是node的原生模块,实现断言的功能,作用是声明预期的结果必须满足 3.mocha测试用例中可以使用第三方测试库 ...

  5. Django REST Framework API Guide 04

    本节大纲 1.serializers 1.Serializers Serializers允许复杂的数据,像queryset和模型实例转换成源生的Python数据类型.从而可以更简单的被渲染成JSON, ...

  6. C#后台进行Http请求

    1.Get请求 新建一个webform项目,添加一个按钮,定义click事件 protected void Button1_Click(object sender, EventArgs e) { st ...

  7. 机器学习超参数优化算法-Hyperband

    参考文献:Hyperband: Bandit-Based Configuration Evaluation for Hyperparameter Optimization I. 传统优化算法 机器学习 ...

  8. oracle 修改数据文件路径

      一.关库修改文件位置 1.连接到数据库 [oracle@linux]$ ./sqlplus /nolog SQL> conn / as sysdba 2. 查看数据文件位置 SQL>  ...

  9. tp5.0 SHOW COLUMNS FROM 生成数据表字段缓存

    TP5.0 生成数据表字段缓存 =控制台执行以下命令= 1.生成指定数据库的所有表字段缓存 php think optimize:schema --db databaseName 2.生成指定数据表的 ...

  10. Android软键盘在清单文件中所有配置含义

    android:windowSoftInputMode 活动的主窗口如何与包含屏幕上的软键盘窗口交互.这个属性的设置将会影响两件事情: 1>     软键盘的状态——是否它是隐藏或显示——当活动 ...