標籤:java
一.I/O操作:
先看一下File類的構造方法:
構造方法摘要 |
File(File parent,String child) 根據 parent 抽象路徑名和 child 路徑名字串建立一個新 File 執行個體。 |
File(String pathname) 通過將給定路徑名字串轉換為抽象路徑名來建立一個新 File 執行個體。 |
File(String parent,String child) 根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 執行個體。 |
File(URI uri) 通過將給定的 file: URI 轉換為一個抽象路徑名來建立一個新的 File 執行個體。 |
看一下輸入輸出資料流的層次:
從例子直接入手能更好的理解io:
1).建立檔案:
public class IOTest {public static void main(String[] args) {File file = new File("E:/lzr.txt");try {System.out.println(file.createNewFile());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
列印:true
我們在E盤下就會看到有一個lzr.txt檔案。
在這裡先說明一下\,在windows中使用\可以,但是在linux中就不可以了,因為不識別這個符號什麼意思了,這時就要用/來替代了。為了更好地跨平台性,那麼File類給我們提供了兩個常量File.separator和File.separatorChar分別表示\和:,那麼我就應該這樣使用了。
public class IOTest {public static void main(String[] args) {File file = new File("E:"+File.separator+"lzr.txt");try {System.out.println(file.createNewFile());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
2).建立檔案夾:
public class IOTest {public static void main(String[] args) {File file = new File("E:"+File.separator+"lzr"+File.separator+"lzr");System.out.println(file.mkdir());System.out.println(file.mkdirs());}}
列印: false true 因為中間的一層的檔案夾lzr沒有建立,所以第一個方法失敗,第二個成功。
這兩個方法的區別是:
mkdir()只能建立最後一層的檔案夾,如果父目錄其中一個不存在則會失敗。
mkdirs()包括不存在的父目錄也一塊建立出來。
3).刪除檔案:
public class IOTest {public static void main(String[] args) {File file = new File("E:"+File.separator+"lzr");System.out.println(file.delete());}}
列印:true
遞迴實現刪除目錄下檔案:
public class IOTest2 {public static void deleteFile(File file){if(file.isFile() || file.list().length == 0){file.delete();}else{File[] files = file.listFiles();for(File f:files){deleteFile(f);f.delete();}}}public static void main(String[] args) {File file = new File("E:"+File.separator+"lzr");deleteFile(file);}}
會刪除指定目錄下的所有檔案。
4).列出目錄下的全部檔案:
public class IOTest {public static void main(String[] args) { File f=new File("E:"+File.separator); //獲得目下檔案的名稱 String[] fileName=f.list(); for (String name:fileName) { System.out.println(name); } //獲得目下的檔案 File[] fileNames = f.listFiles(); for(File files :fileNames){ System.out.println(files.getName()); }}}
列印:此處省略
列印的就是你檔案目錄下的所有檔案。
比如我們可以篩選目錄下的檔案列印出來,就比如找.txt:
public class IOTest {public static void main(String[] args) { File f=new File("E:"+File.separator); //獲得目下檔案的名稱 String[] fileName=f.list(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) { //判斷尾碼是否是.txt結尾if(name.endsWith(".txt")){return true;}return false;} }); for (String name:fileName) { System.out.println(name); }}}
列印:此處省略。。。
列印出的結果只是結尾是.txt的檔案。
5).輸入輸出資料流:
輸入輸出是相對程式來說的,程式在使用資料時所扮演的角色有兩個:一個是源,一個是目的。若程式是資料流的源,即資料的提供者,這個資料流對程式來說就是輸出資料流。若程式是資料流的目的地,則就是輸入資料流。
從流的結構上可以分為位元組流(以位元組為處理單位)和字元流(以字元為處理單位)。
位元組流的輸入資料流和輸出資料流基礎是InputStream和OutpurStream這兩個抽象類別,位元組流的輸入輸出操作由這兩個類的子類實現。字元流輸入輸出基礎是Reader和Writer。在底層的所有輸入輸出資料流都是位元組流形式的。
流的分類有節點流和過濾類。
a).節點類:從特定的地方讀寫的流類。
b).過濾流:使用節點流作為輸入或輸出。過濾流是使用一個已經存在的輸入資料流或輸出資料流串連建立的。主要特點是在輸入輸出資料的同時能對所傳輸的資料做指定類型或格式的轉換,即可實現對二進位位元組資料的理解和編碼轉換。
實現一個簡單的讀檔案(輸入資料流)例子:
public class InputStreamTest {public static void main(String[] args) throws Exception {InputStream is = new FileInputStream("E:"+File.separator+"lzr.txt");byte[] buffer = new byte[100];int length = 0;while(-1 != (length=(is.read(buffer,0,100)))){String str = new String(buffer,0,length);System.out.println(str);}is.close();}}
列印:
asdf
zxcv
qwer
tyui
實現一個寫入檔案的(輸出資料流)例子:
public class OutputStreamTest {public static void main(String[] args) throws Exception { File f=new File("E:"+File.separator+"hello.txt"); OutputStream out =new FileOutputStream(f); String str="你好!"; byte[] b=str.getBytes(); out.write(b); out.close();}}
開啟檔案:你好!
開啟流之後一定要記得關閉,否則會一直佔資源。
封裝一個輸出資料流(緩衝流):
public class BufferedOutputStreamTest {public static void main(String[] args) throws Exception {OutputStream os = new FileOutputStream("lzr.txt");//緩衝流BufferedOutputStream bos = new BufferedOutputStream(os);bos.write("www.baidu.com".getBytes());bos.close();}}
重新整理下項目,在目錄上會多一個lzr.txt檔案開啟就會看到內容了。
當寫滿緩衝區或關閉輸出資料流時,它在一次性輸出到流,或者用flush()方法主動將緩衝區輸出到流。
6).位元組數組輸出資料流:
public class ByteArrayOutputStreamTest {public static void main(String[] args) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();String str = "hello world welcome";byte[] b = str.getBytes();baos.write(b);byte[] b2 = baos.toByteArray();for(int i = 0;i<b2.length;i++){System.out.println((char)b2[i]);}OutputStream os = new FileOutputStream("test.txt");baos.writeTo(os);baos.close();os.close();}}
7).基本類型輸出資料流:
public class DataStreamTest {public static void main(String[] args) throws Exception {DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));int i = 10;char ch = 'a';byte b = 1;dos.writeByte(b);dos.writeInt(i);dos.writeChar(ch);dos.close();}}
帶緩衝的基本類型輸出資料流。顯示的是一堆亂碼,因為儲存的不是字串。
8).基本類型輸入資料流:
public class DataStreamTest {public static void main(String[] args) throws Exception {//DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));//int i = 10;//char ch = 'a';//byte b = 1;//dos.writeByte(b);//dos.writeInt(i);//dos.writeChar(ch);//dos.close();DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("data.txt")));//要按儲存資料一樣讀取資料System.out.println(dis.readByte());System.out.println(dis.readInt());System.out.println(dis.readChar());dis.close();}}
輸出:1 10 a
其他的輸入輸出資料流在jdk上都可以查到,這隻是寫了部分的。懂一個其他的基本也差不多了。
java(25) - I/O操作