java IO流(一)
一.IO流概述
1 什麽是IO流 (流就是通道對象)
IO - Input(輸入) Output(輸出)
在Java的IO中,流是一個很形象的概念,就像水流一樣。
當程序需要讀取數據的時候,就會開啟一個通向數據源的流,這個數據源可以是文件,內存,或是網絡連接。
當程序需要寫出數據的時候,就會開啟一個通向目的地的流
水流裏面流的是水,輸入輸出流流的是二進制數據!
二.File
(1)何為File
File是java提供的一個用來代表磁盤上的一個實際文件(其實也可以上網絡上的一個文件),它是一個存在在內存中的一個對象而已
File 不完全等同 磁盤上的文件
File 只是代表 磁盤上的文件
我們可以用File對象來操作它代表的磁盤文件,如刪除,創建,改名。。。。
(2)File的API介紹
1.常量和構造方法
System.out.println(File.separator);//文件路徑的分隔符 System.out.println(File.pathSeparator);//Path環境變量的分隔windows ; linux : File file1 = new File("D:\\corejava\\TestFile.java"); File file2 = new File("D:\\corejava", "TestFile.java"); File file3= new File(new File("D:\\corejava"),"TestFile.java");
2.創建,重命名,移動,刪除
createNewFile()-創建一個新的文件
mkdir-創建一個文件夾,但是不能創建層級
mkdirs - 創建層級文件夾
renameTo() - 文件重命名或移動
delete - 刪除文件和文件夾
3.判斷是文件還是目錄
isFile() - 判斷是否是文件 a.txt ,b.doc
isDirectory() - 判斷是否是目錄 (音樂) ,文件夾
4.獲取文件名和路徑
getName() - 獲得文件名
getAbsolutePath() - 獲得文件的絕對路徑
5.讀取權限和時間屬性
6.絕對路徑和相對路徑
絕對路徑就是以確切的目錄開始
windows確切的目錄從盤符開始,例如C:\ D:\
linux的確切的目錄就是根目錄,就是 /
相對路徑
. 當前目錄,可以省略,例如a.txt 和 ./a.txt 是一樣的
.. 上一級目錄
java下的當前目錄在哪裏??
得看你在哪個目錄下運行java命令
(3)文件過濾
list() - ()
listFiles()
list(FilenameFilter)
listFiles(FilenameFilter)
listFiles(FileFiter)
public class TestFiles8 { public static void main(String[] args) { File f = new File("c:\\d"); if (f.isDirectory()) {// 只有是文lenameFilter filter = new TxtFileNameFilter(); String[] names = f.list(filter); for(String name : names){ System.out.println(name); } File[] files = f.listFiles(filter); for(File file : files){ System.out.println(file.isFile()+"------->"+file.getAbsolutePath()); } //保留所有le[] dirs = f.listFiles(new DirFileFilter()); for(File d : dirs){ System.out.println(d.isDirectory()+" =====> "+d.getAbsolutePath()); } } } } class TxtFileNameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } } class DirFileFilter implements FileFilter { @Override public boolean accept(File file) { return file.isDirectory(); } }
(4)遞歸算法
應用:解決數學中的一些問題,階乘,求斐波那切數列。
java 應用:遍歷樹都用到遞歸
註意:遞歸一定要有一個最終結束的條件。
核心:自己調用自己
沒有結束條件的遞歸錯誤:
Exception in thread "main" java.lang.StackOverflowError
求階乘 5!= 5*4*3*2*1
5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1!=5*4*3*2*1
4!=4*3!=
n!=n*(n-1)!
fn(n)
if(n==1){
return 1;
}
return n*fn(n-1)
求斐波那切數列
1 1 2 3 5 8 13 .....
fn(1) = 1
fn(2) = 1
fn(3) = 2 = fn(3-1)+fn(3-2)
fn(4) = 3 = fn(4-1)+fn(4-2)
fn(5) = 5 = fn(5-1)+fn(5-2)
fn(6) = 8 = fn(6-1)+fn(6-2)
fn(n) => n=1 return 1
=> n=2 return 1
= n>2 return fn(n-1)+f(n-2);
public class TestDiGui { static int i = 0; public static void go() { System.out.println("sfdfs"); i++; System.out.println(i); if(i>=100){ return; } go(); } public static int fn(int n) { //fn(n) ===>n! if (n==1) { return 1; } return n*fn(n-1);//n*n! } public static void listFileName(File file) { if (file.isFile()) { //文件 System.out.println(file.getName()); }else { //文件夾 System.out.println(file.getName()); File[] files = file.listFiles(); for (File f : files) { listFileName(f); } } } public static void listFileName2(String s ,File file) { s+="-->"; if (file.isFile()) { //文件 System.out.println(s+file.getName()); }else { //文件夾 System.out.println(s+file.getName()); File[] files = file.listFiles(); for (File f : files) { listFileName2(s,f); } } } public static int boFei(int n) { if(n==1||n==2){ return 1; } return boFei(n-1)+boFei(n-2); } public static void main(String[] args) { // int r = boFei(5); // System.out.println(r); //go(); // int r = fn(3); // System.out.println(r); // File file = new File("c:\\test"); // listFileName(file); File file = new File("c:\\test"); listFileName2("" , file) ; } }
三.IO流分類
1 三種分類法
按流的方向:輸入流和輸出流
按數據的大小:字節(byte)流和字符(char)流
按功能分:節點流 和 過濾流(包裝流,裝飾流,處理流)
2 輸入輸出流
3 字節流和字符流
4 節點流和過濾流
節點流就是直接接數據源的流(硬盤,網絡)
四.IO流類(API)體系
輸入:Input Read
輸出:Output Write
字節流:以Stream結尾
字符流:以Reader和Writer結尾
節點流:構造方法的參數是一個文件或者其它的數據源
過濾流:構造方法的參數是另外一個流
五.字節流
(1)OutputStream和FileOutputStream
字節流+ 輸出
FileOutputStream(FileDescriptor fdObj)
構造方法的講解網址:
http://www.fengfly.com/plus/view-214059-1.html
(2)InputStream和FileInputStream
字節流+ 輸入流
六.字符流
(1)Writer和FileWriter
字符流+輸出流
構造方法使用例子的網址:
FileWriter(FileDescriptor fd)
http://www.jb51.net/article/87476.htm
(2)Reader和FileReader
字符流+ 輸入流
java IO流(一)