流是生產或消費信息的一種抽象描述,通過java的輸入/輸出系統與外部設備連接,併爲所有的輸入/輸出提供統一、簡單的操作方法。
輸入流和輸出流不是絕對不變的。對於一個文件而言,當向其中寫入數據時,它就是一個輸出流;當從其中讀取數據時,它就是一個輸入流。對於鍵盤來說,只能是輸入流;顯示器則只能是一個輸出流。
在io包中,還根據流中的數據類型不同,將流分爲字節流類和字符流類。其中,字節流類專門負責處理以字節爲傳輸單位的操作;而字符流類則專門負責處理以字符爲傳輸單位的操作。
根據流的建立方式和工作原理,還將流類分爲節點流和過濾流類。節點流類用於直接在輸入輸出媒介之上建立流,而過濾流類則用於對節點流類功能上的擴展,此時它必須先以某一個節點流對象作爲流的來源,然後可以修改已經讀出或寫入的數據(包括加密和壓縮的數據),甚至還可以簡單地利用自身提供的附加方法將已經讀出或者寫入的數據轉化成其他格式。
System.in是標準的輸入流,默認情況下,它指的是鍵盤。System.out是標準的輸出流,默認情況下,它指的是某一個控制檯,如顯示器。System.err指的是標準的錯誤流,它默認也是控制檯。
File類在java中,它既可以代表一個特定文件,也可以代表目錄內一系列文件的集合。當代表的是一個文件的集合時,便可以使用目錄所特有的屬性list()方法來查詢這個集合,並列出當前集合中的文件名,該方法返回的是一個字符串數組。
指定目錄下的所有文件都列出來
import java.io.*
class ListAllFiles{
public void listPath(File path){
File files[] = path.listFiles();//獲得當前目錄對象下的所有文件
for(int i=0;i<files.length;i++){
if(files[i].isFile()){
System.out.println(files[i].getPath());
}else if{
System.out.println(files[i].getPath());
listPath(files[i]);//遞歸調用listPath方法
}
}
}
public static void main(String [] args){
File dir = new File(args[0]);
ListAllFiles list = new ListAllFiles();
list.listPath(dir);
}
}
==============================================================================================================
刪除某個目錄下的所有文件
import java.io.*;
import java.util.*;
class DeleteDir{
public DeleteDir(File dir){
if(dir.isDirectory()){
LinkListed dirs = new LinkedList();
dirs.add(dir);
while(dirs.size()>0){
File currentDir = (File)dirs.getFirst();
File[] files = currentDir.listFiles();
boolean emptyDir = true;
for(int i=0;i<files.length;i++){
if(files[i].isFile()){
System.out.println("Deleting ..." +files[i].getAbsolutePath());
try{
files[i].delete();
}catch(SecurityException e){
e.printStackTrace();
}
}else{
dirs.addFirst(Files[i]);
emptyDir = false;
}
}
if(emptyDir){
System.out.println("Deleting ..."+currentDir.getAbsolutionPath());
try{
currentDir.delete();
}catch(SecurityException e){
e.printStackTrace();
}
dirs.removeFirst();
}
}
}
else if(dir.isFile()){
System.out.println("Error:"+dir.getName()+"is a file");
}else{
System.out.println("Error:"+dir.getName()+"is unknow");
}
public static void main(String[] args){
File dir = new File(args[0]);
DeleteDir delDir = new DeleteDir(dir);
}
}
}
=====================================================================================================================
flush()方法僅用於支持緩衝區操作的輸出流類,而fileOutputStream類是用於直接操作目標設備所對應的節點流類,因此該流類不支持flush()方法。直接操作目標設備的節點流類還有ByteArrayOutputStream。
文本文件與二進制文件的區分:
簡單的辦法就是把所有可以用於文本編輯器打開的文件都稱爲文本文件,如.txt,.bat,.ini文件等。這些文件中所有的字符都是可讀的ASCII碼字符。除了這些文件之外其他所有不能被文本編輯器正確打開的文件都是二進制文件。Word文件不能被文本編輯器打開,自然就是二進制文件。
BufferInputStream類可以對任何的InputStream流進行帶緩衝的封裝以達到性能的改善。它的實現原理是,在已定義輸入流上再定義一個具有緩衝的輸入流,可以從此流中成批地讀取字節,而不會每次都引起直接對數據源的讀操作。數據輸入時,首先被放入緩衝區,隨後的讀操作,就是對緩衝區中內容進行訪問。
BufferOutputStream類可以對任何的OutputStream流進行帶緩衝的封裝以達到性能的改善。這是因爲,用戶在緩衝輸出流中寫入字節時,不會每次都直接對數據宿進行寫操作,而是當緩衝區已滿或者清空流時,數據才寫到數據宿上。
BufferOutStream提供了一個flush()方法可以用來將緩衝區的數據強制輸出到數據宿。可見,與緩衝區輸入流不同的是,建立緩衝區輸出流可以通過減少系統實際寫數據的時間和次數來改善I/O性能。
flush()方法並不是對所有的輸出流都起作用,而是隻對那些使用了緩衝區的輸出流纔有效。而且如果調用了close()方法,系統也會在關閉這個流之前將緩衝區的內容刷新到外部設備中去,只是這樣做會存在不安全的因素。
字節流與字符流的轉換:
InputStreamReader:將字節轉換爲字符的輸入流
OutputStreamWriter:將字符轉換爲自己的輸出流