------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
IO流中的File類:
File類常見方法:
1,創建。
boolean createNewFile():在指定位置創建文件,如果該文件已經存在,則不創建,返回false。
和輸出流不一樣,輸出流對象一建立創建文件。而且文件已經存在,會覆蓋。
boolean mkdir():創建文件夾。
boolean mkdirs():創建多級文件夾。
2,刪除。
boolean delete():刪除失敗返回false。如果文件正在被使用,則刪除不了返回falsel。
void deleteOnExit();在程序退出時刪除指定文件。
3,判斷。
boolean exists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
4,獲取信息。
getName():
getPath():
getParent():
getAbsolutePath()
long lastModified()
long length()
遞歸算法
列出指定目錄下文件或者文件夾,包含子目錄中的內容。
也就是列出指定目錄下所有內容。
因爲目錄中還有目錄,只要使用同一個列出目錄功能的函數完成即可。
在列出過程中出現的還是目錄的話,還可以再次調用本功能。
也就是函數自身調用自身。
這種表現形式,或者編程手法,稱爲遞歸。
遞歸要注意:
1,限定條件。
2,要注意遞歸的次數。儘量避免內存溢出。
/*
練習
將一個指定目錄下的java文件的絕對路徑,存儲到一個文本文件中。
建立一個java文件列表文件。
思路:
1,對指定的目錄進行遞歸。
2,獲取遞歸過程所以的java文件的路徑。
3,將這些路徑存儲到集合中。
4,將集合中的數據寫入到一個文件中。
*/
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class Test {
public static void main(String[] args) throws IOException {
//要變量的文件夾
File srcFile = new File("E:\\wordspace\\JavaLesson\\Code");
List<File> fileList = new ArrayList<File>();
//儲存到到的文件名字
String destinationName = "filelist.txt";
fileToList(srcFile,fileList);
saveFile(fileList,destinationName);
}
//得到有裝有文件的集合
public static void fileToList(File dir,List<File> listFile) {
File[] files = dir.listFiles();
listFile.add(dir);
//遍歷目錄下的文件
for (int i=0; i<files.length; i++) {
//目錄的情況下
if (files[i].isDirectory()) {
fileToList(files[i],listFile);
} else {
listFile.add(files[i].getAbsoluteFile());
}
}
}
//把集合中的文件保存到文件當中,以備查閱
public static void saveFile(List<File> listFile,String filename) throws IOException {
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(filename));
//取出集合中的File再寫入緩衝區中
File f = null;
for (int i=0; i<listFile.size(); i++) {
f = listFile.get(i);
bufw.write(f.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
} finally {
try {
if (bufw != null)
bufw.close();
} catch (IOException e) {
throw new RuntimeException("關閉流出錯了");
}
}
}
}
Properties 類的運用:
/*
Properties是Hashtable的子類。
也就是說它具備map集合的特點。而且它裏面存儲的鍵值對都是字符串。
是集合中和IO技術相結合的集合容器。
該對象的特點:可以用於鍵值對形式的配置文件。
那麼在加載數據時,需要數據有固定格式:鍵=值。
*/
練習:限制程序運行次數。當運行次數到達5次時,給出,請您註冊的提示。並不再讓該程序執行。
class Test {
public static void main(String[] args) throws IOException {
calNum();
}
public static void calNum() throws IOException {
Properties prop = new Properties();
File file = new File("count.ini");
if (!file.exists())
file.createNewFile();
FileInputStream fis = new FileInputStream(file);
prop.load(fis);
int count = 0;
String value = prop.getProperty("time");
if (value != null) {
count = Integer.parseInt(value);
if (count >= 5) {
System.out.println("您好,使用次數已到,請註冊該軟件!");
return;
}
System.out.println("軟件正常使用");
System.out.println("剩餘使用次數"+(5-count));
}
count++;
prop.setProperty("time", count + "");
FileOutputStream fos = new FileOutputStream(file);
prop.store(fos, "soft use times");
fos.close();
fis.close();
}
}
打印流:
該流提供了打印方法,可以將各種數據類型的數據都原樣打印。
字節打印流:
PrintStream
構造函數可以接收的參數類型:
1,file對象。File
2,字符串路徑。String
3,字節輸出流。OutputStream
字符打印流:
PrintWriter
構造函數可以接收的參數類型:
1,file對象。File
2,字符串路徑。String
3,字節輸出流。OutputStream
4,字符輸出流,Writer。
練習:
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
class Test {
public static void main(String[] args) throws IOException {
//從控制檯上錄入數據
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//true表示帶刷新功能,保存到當前目錄下的a.txt文件中
PrintWriter out = new PrintWriter(new FileWriter("a.txt"), true);
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
out.println(line.toUpperCase());
}
out.close();
bufr.close();
}
}
/*
SequenceInputStream的運用
把一個流拆分成多個流
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Vector;
class Test {
public static void main(String[] args) throws IOException {
// showSeq();
spilFile();
}
/**
* SequenceInputStream 的用法:把多個流有序的連接起來,生成一個大流
*/
// 要求: 把1.txt,2.txt,3.txt.三個文件組合成一個新的文件4.txt
public static void showSeq() throws IOException {
Vector<FileInputStream> vec = new Vector<FileInputStream>();
vec.add(new FileInputStream("1.txt"));
vec.add(new FileInputStream("2.txt"));
vec.add(new FileInputStream("3.txt"));
// 構造該函數時添加多個輸入流,並且是枚舉類型的
SequenceInputStream sis = new SequenceInputStream(vec.elements());
// 定義輸出流
FileOutputStream fos = new FileOutputStream("4.txt");
byte[] bs = new byte[1024];
int len = 0;
while ((len = sis.read(bs)) != -1) {
fos.write(bs, 0, len);
}
fos.close();
sis.close();
}
/**
* 將4.txt中的文件進行拆分成3個文件,風別爲1.txt,2.txt,3.txt
*/
public static void spilFile() throws IOException {
// 把4.txt中的文件讀入到流中
FileInputStream fis = new FileInputStream("4.txt");
FileOutputStream fos = null;
byte[] bs = new byte[50];
int len = 0;
int count = 1;
while ((len = fis.read(bs)) != -1) {
// 每讀取50個字節就寫入一個文件
fos = new FileOutputStream((count++) + ".txt");
fos.write(bs, 0, len);
fos.flush();
fos.close();
}
fis.close();
}
}