Java文件類操作實(shí)例總結(jié)

1.1? ? 文件類操作

1.1.1? 遞歸文件刪除

public static void main(String[] args) {

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

DeleteDirAndFile(dir);

}

/***

*刪除指定的文件夾(包含內(nèi)容)

* @param dir指定的文件

*/

private static voidDeleteDirAndFile(File dir) {

//寫代碼需要保證代碼的健壯性

//入?yún)z測(cè)

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

//如果參數(shù)報(bào)錯(cuò),通常會(huì)拋出非法參數(shù)異常

throw newIllegalArgumentException("File對(duì)象不能為空,并且只能是文件夾");

}

//刪除文件中的所有內(nèi)容

//如果File對(duì)象描述的是文件,調(diào)用listFiles方法返回的是null

File[] files=dir.listFiles();

for (File f : files) {

if(f.isFile()){

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

f.delete();

}else{

//如果是文件夾,就需要先刪除文件夾中的內(nèi)容,再刪除文件夾

DeleteDirAndFile(f);?????? //遞歸調(diào)用

}

}

//刪除文件本身(空文件夾)

dir.delete();

}

1.1.2? 文件及文件內(nèi)容拷貝與新異常處理機(jī)制

/***

*將一個(gè)文件夾(包含子目錄)的內(nèi)容復(fù)制到其它目錄中。提示:通過字節(jié)流和遞歸進(jìn)行復(fù)制

*

*/

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

*文件夾拷貝到的目標(biāo)位置

*/

private static void CopyDir(FilesrcDir, File desDir) {

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

throw newIllegalArgumentException("被復(fù)制的必須是一個(gè)文件夾并且不能為空");

}

if (!desDir.exists()) {

//創(chuàng)建空文件夾

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

*文件拷貝到的目標(biāo)位置

*/

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

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

throw newIllegalArgumentException("被復(fù)制的必須是一個(gè)文件并且不能為空");

}

/*

* JDK1.7新特性,自動(dòng)釋放資源(try-with-resource)語(yǔ)法糖

* 1)try后的圓括號(hào)中寫上創(chuàng)建資源的代碼,并且在這里面被創(chuàng)建的資源會(huì)進(jìn)行自動(dòng)釋放(先開啟后釋放)

* 2)可以寫入多個(gè)資源,多個(gè)資源之間用";"進(jìn)行分割3)資源類型必須是實(shí)現(xiàn)了AutoCloseable接口

* 4)在try后面的括號(hào)中創(chuàng)建的資源自動(dòng)加上了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? 緩沖流結(jié)合實(shí)際綜合運(yùn)用

程序要求【

/*如在E盤下有一個(gè)Test.txt文本文件內(nèi)容是

#劉德華#89#77#60

#張信哲#76#97#70

#周杰倫#89#88#90

#隨便啦#87#70#80

要求通過Java讀取文本并把文本中的每一行后面的三個(gè)成績(jī)相加,

最后按從大到小的順序輸出到另一個(gè)文本文件中.

輸出后的文本文件內(nèi)容應(yīng)為:

#周杰倫#267

#張信哲#243

#隨便啦#237

#劉德華#226

PS:盡量把此題做成一個(gè)模塊性質(zhì)的東西,并不是單獨(dú)當(dāng)成一道題做!*/

程序源碼:

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

}

}????????????????????????????????????? 以上實(shí)體類

publicclass Demo {

public static void main(String[] args){

// 讀數(shù)據(jù)

List list =readData();

//將list中的求和數(shù)值按降序排列

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集合中的數(shù)據(jù)寫入到另一個(gè)文件中去

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();????? //如果數(shù)據(jù)不是很多,該行可以省略,如果數(shù)據(jù)比較多,那就要每寫一次就刷新一次

}

} 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? 文件過濾綜合運(yùn)用

/***

*

*輸出一個(gè)文件夾(包括子目錄)中的所有以".java"結(jié)尾的文件的文件名

*擴(kuò)展需求:

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

*2、將規(guī)律的規(guī)則抽取出來,方法的調(diào)用者可以自定義過濾的規(guī)則

*

*開閉原則:對(duì)修改封閉,對(duì)擴(kuò)展開放

*

*/

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

}

});

//循環(huán)遍歷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不能為空并且必須是一個(gè)文件夾");

}

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不能為空并且必須是一個(gè)文件夾");

}

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

//拋出非法參數(shù)異常

throw newIllegalArgumentException("File不能為空并且必須是一個(gè)文件夾");

}

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

}

}

獲取一個(gè)文件夾下所有指定后綴名(.java)的文件(包括子文件夾中的內(nèi)容),并將這些文件的絕對(duì)路徑寫入到一個(gè)文本文件中

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

}

/**

* 遍歷文件夾,獲取指定后綴名的對(duì)象

* @param dir 文件目錄

* @param list list集合

*/

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

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

throw newIllegalArgumentException("必須是一個(gè)存在的文件夾,并且文件夾不能為空!");

}

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? 文件操作與對(duì)象結(jié)合綜合實(shí)例

/*

#姓名 性別 帳號(hào) 發(fā)生額

劉德華|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 * 實(shí)現(xiàn)功能:

* 一個(gè)人可能消費(fèi)有多筆。(當(dāng)姓名和賬號(hào)相同的話就認(rèn)為是同一人)統(tǒng)計(jì)每個(gè)人的消費(fèi)總額,

* 按消費(fèi)額升序排序。要求顯示每個(gè)人的姓名、性別、帳號(hào)、消費(fèi)總額的信息

*/

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

//遍歷集合中的每一個(gè)元素,判斷集合中有沒有指定的用戶的記錄

booleanflag = false; // 代表有沒有現(xiàn)有的記錄

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;

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容