黑馬程序員-----java基礎IO流

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章