Java文件类操作实例总结

1.1    文件类操作

1.1.1  递归文件删除

public static void main(String[] args) {

File dir = newFile("E:\\homeFile");

DeleteDirAndFile(dir);

}

/***

*删除指定的文件夹(包含内容)

* @param dir指定的文件

*/

private static voidDeleteDirAndFile(File dir) {

//写代码需要保证代码的健壮性

//入参检测

if(dir==null ||!dir.isDirectory()){

//如果参数报错,通常会抛出非法参数异常

throw newIllegalArgumentException("File对象不能为空,并且只能是文件夹");

}

//删除文件中的所有内容

//如果File对象描述的是文件,调用listFiles方法返回的是null

File[] files=dir.listFiles();

for (File f : files) {

if(f.isFile()){

//如果是文件,就直接删除

f.delete();

}else{

//如果是文件夹,就需要先删除文件夹中的内容,再删除文件夹

DeleteDirAndFile(f);       //递归调用

}

}

//删除文件本身(空文件夹)

dir.delete();

}

1.1.2  文件及文件内容拷贝与新异常处理机制

/***

*将一个文件夹(包含子目录)的内容复制到其它目录中。提示:通过字节流和递归进行复制

*

*/

public classCopyDirAndFile {

public static void main(String[] args){

File srcDir = newFile("E:\\homeTest");

File desDir = newFile("E:\\homeTest_copy");

CopyDir(srcDir, desDir);

}

/***

*文件夹拷贝

*

* @param srcDir

*被拷贝的文件夹

* @param desDir

*文件夹拷贝到的目标位置

*/

private static void CopyDir(FilesrcDir, File desDir) {

if (srcDir == null ||!srcDir.isDirectory()) {

throw newIllegalArgumentException("被复制的必须是一个文件夹并且不能为空");

}

if (!desDir.exists()) {

//创建空文件夹

desDir.mkdir();

}

File[] files =srcDir.listFiles();

for(File f : files) {

if (f.isFile()) {

//拷贝文件

copyFile(f,new File(desDir, f.getName()));

} else if(f.isDirectory()) {

//拷贝文件

CopyDir(f,new File(desDir, f.getName()));

}

}

}

/****

*文件的拷贝

*

* @param src

*被拷贝的文件

* @param des

*文件拷贝到的目标位置

*/

private static void copyFile(File src,File des) {

if (src == null ||!src.isFile()) {

throw newIllegalArgumentException("被复制的必须是一个文件并且不能为空");

}

/*

* JDK1.7新特性,自动释放资源(try-with-resource)语法糖

* 1)try后的圆括号中写上创建资源的代码,并且在这里面被创建的资源会进行自动释放(先开启后释放)

* 2)可以写入多个资源,多个资源之间用";"进行分割3)资源类型必须是实现了AutoCloseable接口

* 4)在try后面的括号中创建的资源自动加上了final修饰

*/

try (FileInputStream fis = newFileInputStream(src);

FileOutputStream fos = newFileOutputStream(des)) {

byte[] bur = newbyte[1024];

int len = 0;

while ((len =fis.read(bur)) != -1) {

fos.write(bur,0, len);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

1.1.3  缓冲流结合实际综合运用

程序要求【

/*如在E盘下有一个Test.txt文本文件内容是

#刘德华#89#77#60

#张信哲#76#97#70

#周杰伦#89#88#90

#随便啦#87#70#80

要求通过Java读取文本并把文本中的每一行后面的三个成绩相加,

最后按从大到小的顺序输出到另一个文本文件中.

输出后的文本文件内容应为:

#周杰伦#267

#张信哲#243

#随便啦#237

#刘德华#226

PS:尽量把此题做成一个模块性质的东西,并不是单独当成一道题做!*/

程序源码:

publicclass Record {

private String name;

private int num1,num2,num3;

private int sum;

public Record(){

}

public Record(String name, int num1,int num2, int num3) {

this.name = name;

this.num1 = num1;

this.num2 = num2;

this.num3 = num3;

this.sum =num1+num2+num3;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getNum1() {

return num1;

}

public void setNum1(int num1) {

this.num1 = num1;

}

public int getNum2() {

return num2;

}

public void setNum2(int num2) {

this.num2 = num2;

}

public int getNum3() {

return num3;

}

public void setNum3(int num3) {

this.num3 = num3;

}

public int getSum() {

return sum;

}

public void setSum(int sum) {

this.sum = sum;

}

@Override

public String toString() {

return "Record[name=" + name + ", num1=" + num1 + ", num2=" + num2

+ ",num3=" + num3 + ", sum=" + sum + "]";

}

public String getData(){

StringBuffer sb = newStringBuffer();

sb.append("#").append(name).append("#").append(sum);

return sb.toString();

}

}                                      以上实体类

publicclass Demo {

public static void main(String[] args){

// 读数据

List list =readData();

//将list中的求和数值按降序排列

Collections.sort(list, new Comparator(){

@Override

public intcompare(Record o1, Record o2) {

returno2.getSum() - o1.getSum();

}

});

for (Record record : list) {

//                        System.out.println(record);

System.out.println(record.getData());

}

//将list集合中的数据写入到另一个文件中去

writeData(list);

}

private static voidwriteData(List list) {

BufferedWriter bw = null;

try {

bw = new BufferedWriter(newFileWriter("buffer_ex_des.txt"));

for (Record record : list) {

bw.write(record.getData());

bw.newLine();

bw.flush();      //如果数据不是很多,该行可以省略,如果数据比较多,那就要每写一次就刷新一次

}

} catch (IOException e) {

e.printStackTrace();

}finally{

if(bw != null){

try {

bw.close();

bw= null;

} catch(IOException e) {

e.printStackTrace();

}

}

}

}

private static ListreadData() {

List list = newArrayList();

BufferedReader br = null;

try {

br = newBufferedReader(new FileReader("buffer_ex_src.txt"));

String line = null;

while ((line =br.readLine()) != null) {

String[]strs = line.split("#");

String name= strs[1];

int num1 =Integer.parseInt(strs[2]);

int num2 =Integer.parseInt(strs[3]);

int num3 =Integer.parseInt(strs[4]);

list.add(newRecord(name, num1, num2, num3));

}

return list;

} catch (IOException e) {

// TODOAuto-generated catch block

e.printStackTrace();

} finally {

if (br != null) {

try {

br.close();

br= null;

} catch(IOException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

return null;

}

}

1.1.4  文件过滤综合运用

/***

*

*输出一个文件夹(包括子目录)中的所有以".java"结尾的文件的文件名

*扩展需求:

*1、将所有.java文件的文件路径都存入集合中

*2、将规律的规则抽取出来,方法的调用者可以自定义过滤的规则

*

*开闭原则:对修改封闭,对扩展开放

*

*/

publicclass FileFilterT {

public static void main(String[] args){

File dir = newFile("E:\\homeTest");

List list = newArrayList();

//方式一

//               traverse(dir,list);

//方式二

//               traverse2(dir,list,newMyFilter());

//方式三

// 方式三

traverse3(dir, list, newFileFilter() {

@Override

public booleanaccept(File file) {

returnfile.getName().endsWith(".class") || file.isDirectory();

}

});

//循环遍历list集合

for (String str : list) {

System.out.println(str);

}

}

public static void traverse3(File dir,List list, FileFilter filter) {

if(dir == null ||!dir.isDirectory()) {

throw newIllegalArgumentException("File不能为空并且必须是一个文件夹");

}

File[] files =dir.listFiles(filter);

for (File f : files) {

if(f.isFile()) {

list.add(f.getName());

} else {

traverse3(f,list, filter);

}

}

}

private static void traverse2(File dir,List list, MyFilter fitler) {

if(dir == null ||!dir.isDirectory() ){

throw new IllegalArgumentException("File不能为空并且必须是一个文件夹");

}

File[] files =dir.listFiles();

for (File f : files) {

if(f.isFile()&& fitler.accept(f)){

list.add(f.getName());

}elseif(f.isDirectory()){

traverse2(f,list, fitler);

}

}

}

private static void traverse(File dir,List list) {

if(dir == null ||!dir.isDirectory()){

//抛出非法参数异常

throw newIllegalArgumentException("File不能为空并且必须是一个文件夹");

}

File[] files =dir.listFiles();

for (File f : files) {

if(f.isFile() &&f.getName().endsWith(".java")){

list.add(f.getName());

}elseif(f.isDirectory()){

traverse(f,list);

}

}

}

}

interfaceIMyFilter{

//过滤指定的文件

public abstract boolean accept(Filefile);

}

classMyFilter implements IMyFilter{

@Override

public boolean accept(File file) {

returnfile.getName().endsWith(".java");

}

}

获取一个文件夹下所有指定后缀名(.java)的文件(包括子文件夹中的内容),并将这些文件的绝对路径写入到一个文本文件中

publicclass Ex3 {

public static void main(String[] args)throws IOException {

File dir = newFile("E:\\homeTest");

List list = newArrayList();

traverse(dir, list);

BufferedWriter bw = newBufferedWriter(new FileWriter("buffer_ex3.txt"));

for (File file : list) {

//                        System.out.println(file.getAbsolutePath());

bw.write(file.getAbsolutePath());

bw.newLine();

bw.flush();

}

bw.close();

}

/**

* 遍历文件夹,获取指定后缀名的对象

* @param dir 文件目录

* @param list list集合

*/

public static void traverse(File dir,List list){

if(dir == null ||!dir.exists() || !dir.isDirectory()){

throw newIllegalArgumentException("必须是一个存在的文件夹,并且文件夹不能为空!");

}

File[] files =dir.listFiles();

for (File f : files) {

if(f.isFile()&& f.getName().endsWith(".java")){

list.add(f);

}elseif(f.isDirectory()){

traverse(f,list);

}

}

}

}

1.1.5  文件操作与对象结合综合实例

/*

#姓名 性别 帐号 发生额

刘德华|1|4155990188888888|300.00

晓龙|1|1155990199999999|500.00

黄晓明|1|4155990100000000|1000.50

张东健|1|4155990155555555|600.99

梁朝伟|0|4155990111111111|5000.00

刘德华|1|4155990188888888|200.00

张东健|1|4155990155555555|500.99

刘德华|1|4155990188888888|1200.00 * 实现功能:

* 一个人可能消费有多笔。(当姓名和账号相同的话就认为是同一人)统计每个人的消费总额,

* 按消费额升序排序。要求显示每个人的姓名、性别、帐号、消费总额的信息

*/

public class Ex2 {

publicstatic void main(String[] args) {

Listlist = readData();

Collections.sort(list);

for(TransRecord record : list) {

System.out.println(record);

}

}

privatestatic List readData() {

BufferedReaderbr = null;

try{

Listlist = new ArrayList();

br= new BufferedReader(new FileReader("buffer_ex2.txt"));

Stringline = null;

while((line= br.readLine()) != null) {

if(line.startsWith("#")){

continue;

}

String[]strs = line.split("\\|");

Stringname = strs[0];

intgender = Integer.parseInt(strs[1]);

Stringaccount = strs[2];

doublemoney = Double.parseDouble(strs[3]);

//TransRecord record = new TransRecord(name, gender, account, money);

//遍历集合中的每一个元素,判断集合中有没有指定的用户的记录

booleanflag = false; // 代表有没有现有的记录

for(TransRecord record : list) {

if(record.getName().equals(name)&& record.getAccount().equals(account)) {

//record.setMoney(record.getMoney() + money);

record.addMoney(money);

flag= true;

}

}

if(!flag){

list.add(newTransRecord(name, gender, account, money));

}

}

returnlist;

}catch (IOException e) {

e.printStackTrace();

}finally {

if(br!= null) {

try{

br.close();

br= null;

}catch (IOException e) {

e.printStackTrace();

}

}

}

returnnull;

}

}

class TransRecord implementsComparable {

privateString name;

privateint gender;

privateString account;

privatedouble money;

publicTransRecord() {

}

publicTransRecord(String name, int gender, String account, double money) {

this.name= name;

this.gender= gender;

this.account= account;

this.money= money;

}

publicString getName() {

returnname;

}

publicvoid setName(String name) {

this.name= name;

}

publicint getGender() {

returngender;

}

publicvoid setGender(int gender) {

this.gender= gender;

}

publicString getAccount() {

returnaccount;

}

publicvoid setAccount(String account) {

this.account= account;

}

publicdouble getMoney() {

returnmoney;

}

publicvoid setMoney(double money) {

this.money= money;

}

publicvoid addMoney(double money){

this.money+= money;

}

@Override

publicString toString() {

return"TransRecord [name=" + name + ", gender=" + gender

+", account=" + account + ", money=" + money +"]";

}

@Override

publicint compareTo(TransRecord o) {

if(this.money> o.money) {

return1;

}else if(this.money < o.money) {

return-1;

}else {

return0;

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容