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;
}
}
】
【
/***
*
*輸出一個(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;
}
}
}
】