一、动手动脑
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);
}
}
测试截图
大文件
小文件
小文件内容