java reader类 实例_Java文件类操作实例总结

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();

}

/***

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

*

*/

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();

}

}

}

程序要求【

/*如在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;

}

}

/***

*

*输出一个文件夹(包括子目录)中的所有以".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|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;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值