1. 程式人生 > >java IO流(一)

java IO流(一)

win 技術分享 eat 水流 tst 構造 需要 col 遞歸算法

一.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流(一)