日期: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"吗?只有通过调用解码文件的特殊字符,进而完成对加密文件的解码,才能得到真正“可读”的文件!而读取文件总大小的话,就设一个值,遍历文件就好了,没遍历一个文件,就加上它的长度!最终得到的大小就是文件夹里的所有文件的大小。至于文件的分割其实就是将文件读取到的数据,写入不同的两个文件里边去。