JavaIO/輸出輸入入門<一>

IO稱之爲輸入輸出,Java的IO是經過java.io包下的類和接口來支持,包含兩大類:輸入,輸出.  java

在整個Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable.掌握了這些IO的核心操做那麼對於Java中的IO體系也就有了一個初步的認識了。 數組

1.File類

File類是java.io下表明與平臺無關的文件和目錄.也就是說若是要操做文件和目錄,均可以經過File來操做.File不能訪問訪問文件自己,若是須要訪問文件自己,須要使用輸入/輸出流. 網絡

File 類有一個欺騙性的名字——一般會認爲它對付的是一個文件,但實情並不是如此。
它既表明一個特定文件 的名字,也表明目錄內一系列文件的名字。
若表明一個文件集,即可用list()方法查詢這個集,返回的是一 個字串數組。之因此要返回一個數組,而非某個靈活的集合類,是由於元素的數量是固定的。並且若想獲得 一個不一樣的目錄列表,只需建立一個不一樣的File 對象便可。
事實上,「FilePath 」(文件路徑)彷佛是一個 更好的名字。 ide

----摘自 think in java 工具

代碼示例File的使用:
package org.credo.io;

import java.io.File;
import java.io.IOException;

public class FileTest {

	@SuppressWarnings("static-access")
	public static void main(String[] args) throws IOException {
		//以當前路徑來建立一個File對象
		File file=new File("credo");
		System.out.println("直接獲取文件名:"+file.getName());
		System.out.println("獲取文件相對路徑的父路徑可能出錯,輸出爲NULL:"+file.getParent());
		System.out.println("獲取絕對路徑:"+file.getAbsolutePath());
		System.out.println("獲取絕對路徑對應的File對象:"+file.getAbsoluteFile());
		System.out.println("獲取上一級路徑:"+file.getAbsoluteFile().getParent());
		System.out.println("file:"+file);
		//檢查是否存在,先建立目錄。而後建立文件.否則報java.io.IOException: 系統找不到指定的路徑.
		if(!file.exists()){  
			file.mkdirs();  
		} 
		//在當前路徑下建立一個臨時文件,名aaa屬性爲txt的.
		File tmpFile=File.createTempFile("aaa", ".txt",file);
		//JVM退出時刪除該文件,另外一個delete是直接刪除.
		tmpFile.deleteOnExit();
		
		//以系統當前時間做爲新文件名來建立新文件.
		File newFile=new File(System.currentTimeMillis()+"");
		System.out.println("判斷newFile是否存在:"+newFile.exists());
		//以指定的newFile對象來建立一個文件
		newFile.createNewFile();
		//以newFile對象來建立一個目錄,由於newFile已經存在因此下面方法返回false,沒法建立該目錄
		newFile.mkdir();
		
		//使用list()方法列出當前路徑下的全部文件和路徑
		String[] fileList=file.list();
		System.out.println("=========當前路徑下全部文件和路徑以下===========");
		for(String fileName:fileList){
			System.out.println("fileName:"+fileName);
		}
		
		//listRoots()靜態方法列出全部的磁盤根路徑
		File[] roots=file.listRoots();
		System.out.println("==========系統全部根路徑以下=======");
		for(File root:roots){
			System.out.println("root:"+root);
		}
	}

}
跟具體的請查閱java API.

2 文件過濾器

在File類的list()方法中能夠接收一個FilenameFilter參數,經過該參數能夠只列出符合條件的文件.
FilenameFilter接口裏包含了一個accept(File dir,String name)方法,該方法將依次對指定File的全部子目錄或者文件進行迭代,若是該方法返回true,則list()方法會列出該子目錄或者文件. spa

package org.credo.io;

import java.io.File;
import java.io.FilenameFilter;

public class FileNameFilterTest {

	public static void main(String[] args) {
		//以當前路徑來建立一個File對象
		File file=new File(".");
		String[] nameList=file.list(new MyFileNameFilter());
		for(String str:nameList){
			System.out.println(str);
		}
	}

}
class MyFileNameFilter implements FilenameFilter{
	@Override
	public boolean accept(File dir, String name) {
		//若是文件名以.java結尾,或者文件對應一個路徑,則返回true
		return name.endsWith(".java")||new File(name).isDirectory();
	}
	
}

3.理解java的IO流

按照流的流向來分,能夠分爲輸入流和輸出流. 設計

輸入流 只能讀取數據,不能寫入數據.java裏由InputStream和Reader做爲基類.抽象基類,沒法建立實例.
輸出流 只能寫入數據,不能讀取數據.java裏由OutputStream和Writer做爲基類.抽象基類,沒法建立實例.

字節流和字符流

字節流和字符流的用法基本一致的.區別是字節流操做的數據單元是8位的字節.而字符是16位的字符.一個字節byte是8位二進制.Java中的字符char是unicode碼,佔2個字節,即16位.
字節流是由InputStream和OutputStream做爲基類.而字符流主要由Reader和Writer做爲基類. code

或者這麼解釋:Byte Stream皆起源與InputStream和OutputStream. Char Stream皆起源與Reader和Writer. 字符和字節的區別是,字符是字符集中一個有意義的字符單元. 而字節只是一個8bit二進制數據. 對象

字節流最原始的方法是InputStream的read()和OutputStream的write(). 分別爲讀取一個字節和寫入一個字節. 在InputStream和OutputStream之上,包裝了不少字節流工具,來一次性的讀或者寫多個字符. 但不管如何調用什麼方法,最終包裝過的方法都是經過調用最原始的read()和write()來操做流.
字符流最原始的方法是Reader的read()和Writer的write()方法.分別爲讀取一個字符或寫入一個字符.同上,包裝的字符流工具最終也是在和原始的read()和write()在打交道. 接口

下面是兩個體系圖:

因爲存在大量不一樣的設計方案,因此該任務的困難性是很容易證實的。其中最大的挑戰彷佛是如何覆蓋全部 
可能的因素。不只有三種不一樣的種類的 IO 須要考慮(文件、控制檯、網絡鏈接),並且須要經過大量不一樣的 
方式與它們通訊(順序、隨機訪問、二進制、字符、按行、按字等等)。 
Java 庫的設計者經過建立大量類來攻克這個難題。

----摘自 think in java

下面是字節流的

下面是字符流的:

相關文章
相關標籤/搜索