總結的很粗糙,以后時間富裕了好好修改一下。
1:Java語言定義了許多類專門負責各種方式的輸入或者輸出,這些類都被放在java.io包中。其中,
所有輸入流類都是抽象類InputStream(字節輸入流),或者抽象類Reader(字符輸入流)的子類;
而所有輸出流都是抽象類OutputStream(字節輸出流)或者Writer(字符輸出流)的子類。
【首先需要明白的是:流是干什么的???(為了永久性的保存數據)
根據數據流向的不同分為輸入流和輸出流;
根據處理數據類型的不同分為字符流和字節流;
】
【然后需要明白的是輸入模式和輸出模式是誰流向誰:
InputStream(字節輸入流)和Reader(字符輸入流)通俗的理解都是讀(read)的。
OutputStream(字節輸出流)和Writer(字符輸出流)通俗的理解都是寫(writer)的。
】
最后下面搞清楚各種流的類型的該怎么用,誰包含誰,理清思路。
2:InputStream類是字節輸入流的抽象類,是所有字節輸入流的父類,InputStream類具有層次結構如下圖所示;
3:java中的字符是Unicode編碼的,是雙字節的。InputStream是用來處理字節的,在處理字符文本時很不方便。Java為字符文本的輸入提供了專門的一套類Reader。Reader類是字符輸入流的抽象類,所有字符輸入流的實現都是它的子類。
4:輸出流OutputStream類是字節輸入流的抽象類,此抽象類表示輸出字節流的所有類的超類。
5:Writer類是字符輸出流的抽象類,所有字符輸出類的實現都是它的子類。
6:File類是IO包中唯一代表磁盤文件本身的對象。通過File來創建,刪除,重命名文件。File類對象的主要作用就是用來獲取文本本身的一些信息。如文本的所在的目錄,文件的長度,讀寫權限等等。(有的需要記憶,比如isFile(),isDirectory(),exits();有的了解即可。使用的時候查看API)
1 package com.ningmeng; 2 3 import java.io.File; 4 5 public class Test { 6 7 public static void main(String[] args) throws Exception{ 8 // TODO Auto-generated method stub 9 File file=new File("aa.txt");//文件默認就創建在你創建的項目下面,刷新即可看到 10 System.out.println(file.exists());//判斷文件是否存在 11 file.createNewFile();//創建文件,不是文件夾 12 System.out.println(file.exists());//再次判斷是否存在 13 System.out.println(file.getName());//獲取文件的名字 14 System.out.println(file.getAbsolutePath());//獲取文件的絕對路徑 15 System.out.println(file.getPath());//獲取文件的相對路徑 16 System.out.println(file.getParent());//獲取文件的父路徑 17 System.out.println(file.canRead());//文件是否可讀 18 System.out.println(file.canWrite());//文件是否可寫 19 System.out.println(file.length());//文件的長度 20 System.out.println(file.lastModified());//文件最后一次修改的時間 21 System.out.println(file.isDirectory());//判斷文件是否是一個目錄 22 System.out.println(file.isHidden());//文件是否隱藏 23 System.out.println(file.isFile());//判斷文件是否存在 24 } 25 26 }
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組
list()獲取某個目錄下所有的文件或者文件夾:
1 package com.ningmeng; 2 3 import java.io.File; 4 5 public class FileTest { 6 7 public static void main(String[] args){ 8 File file=new File("D:/");//指定文件目錄 9 String[] str=file.list();//獲取指定目錄下的所有文件或者文件夾的名稱數組 10 for(String s : str){//加強for循環遍歷輸出 11 System.out.println(s); 12 } 13 14 } 15 }
1 package com.ningmeng; 2 3 import java.io.File; 4 5 public class FileTest { 6 7 public static void main(String[] args){ 8 File file=new File("D:/");//指定文件路徑 9 File[] f=file.listFiles();//獲取指定目錄下的所有文件或者文件夾的File數組 10 for(File fi : f){//加強for循環遍歷輸出 11 System.out.println(fi); 12 } 13 14 } 15 }
案例演示:
獲取某種格式的文件比如獲取某種后綴的圖片,並輸出文件名:
1 package com.ningmeng; 2 3 import java.io.File; 4 5 public class FileTest { 6 7 public static void main(String[] args){ 8 File file=new File("C:\\Users\\biehongli\\Pictures\\xuniji"); 9 String[] str=file.list(); 10 11 for(String s : str){ 12 if(s.endsWith(".jpg") || s.endsWith(".png")){//如果后綴是這種格式的就輸出 13 System.out.println(s); 14 } 15 } 16 17 18 } 19 }
下面演示獲取文件夾下面子目錄里面的文件獲取(並沒有完全獲取子目錄的子目錄等等,僅僅獲取了子一級目錄):
1 package com.ningmeng; 2 3 import java.io.File; 4 5 public class FileTest { 6 7 public static void main(String[] args){ 8 File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll"); 9 10 File[] f=file.listFiles(); 11 12 for(File fi : f){ 13 if(fi.isDirectory()){//判斷如果是一個目錄 14 String[] s=fi.list(); 15 for(String str : s){ 16 if(str.endsWith(".jpg")){ 17 System.out.println(str); 18 } 19 } 20 } 21 } 22 } 23 }
A:文件名稱過濾器的概述
1 package com.ningmeng; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 6 public class FileTest { 7 8 public static void main(String[] args){ 9 File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll"); 10 11 String[] str=file.list(new FilenameFilter() {//過濾器,匿名內部類 12 13 @Override 14 public boolean accept(File dir, String name) { 15 // TODO Auto-generated method stub 16 //System.out.println(dir);//獲取文件的路徑 17 //System.out.println(name);//獲取文件的名字 18 File f=new File(dir,name); 19 return f.isFile() && f.getName().endsWith(".jpg"); 20 } 21 }); 22 for(String s : str){ 23 System.out.println(s); 24 } 25 26 } 27 }
7:下面以一些字節輸入輸出流具體的案例操作(操作的時候認清自己使用的是字節流還是字符流):
FileInputStream的單個字節讀取:
FileOutputStream的單個字節寫入:
1 package com.ningmeng; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 6 public class FileTest { 7 8 public static void main(String[] args) throws Exception{ 9 FileInputStream fis=new FileInputStream("aaa.txt"); 10 FileOutputStream fos=new FileOutputStream("bbb.txt",true); 11 //FileOutputStream()后面加true指文件后面可追加 12 13 int a=fis.read();//read()一次讀取一個字節 14 System.out.println(a);//讀取的一個字節輸出 15 16 fos.write(101);//write()一次寫一個字節 17 fis.close();//一定記得關閉流,養成好習慣 18 fos.close(); 19 } 20 }
FileInputStream和FileOutputStream進行拷貝文本或者圖片或者歌曲:
1 package com.ningmeng; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 6 public class FileTest { 7 8 public static void main(String[] args) throws Exception{ 9 FileInputStream fis=new FileInputStream("aaa.txt"); 10 FileOutputStream fos=new FileOutputStream("bbb.txt"); 11 //如果沒有bbb.txt,會創建出一個 12 13 int b; 14 while((b=fis.read())!=-1){ 15 fos.write(b); 16 } 17 fis.close(); 18 fos.close(); 19 } 20 }
FileInputStream和FileOutputStream定義小數組進行讀寫操作:
1 package com.ningmeng; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 6 public class FileTest { 7 8 public static void main(String[] args) throws Exception{ 9 FileInputStream fis = new FileInputStream("aaa.txt"); 10 FileOutputStream fos = new FileOutputStream("bbb.txt"); 11 int len; 12 byte[] arr = new byte[1024 * 8];//自定義字節數組 13 14 while((len = fis.read(arr)) != -1) { 15 //fos.write(arr); 16 fos.write(arr, 0, len);//寫出字節數組寫出有效個字節個數 17 } 18 //IO流(定義小數組) 19 //write(byte[] b) 20 //write(byte[] b, int off, int len)寫出有效的字節個數 21 22 fis.close(); 23 fos.close(); 24 } 25 }
IO流(BufferedInputStream和BufferOutputStream拷貝)
1 package com.ningmeng; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 8 public class FileTest { 9 10 public static void main(String[] args) throws Exception{ 11 FileInputStream fis = new FileInputStream("aaa.txt"); 12 FileOutputStream fos = new FileOutputStream("bbb.txt"); 13 14 BufferedInputStream bis=new BufferedInputStream(fis); 15 //使用裝飾模式,把fis裝飾進去bis中。使用緩沖讀取速度變快 16 BufferedOutputStream bos=new BufferedOutputStream(fos); 17 18 int b; 19 while((b=bis.read())!=-1){ 20 bos.write(b); 21 } 22 bis.close(); 23 bos.close(); 24 } 25 }
面試題:小數組的讀寫和帶Buffered的讀取哪個更快?
1 package com.ningmeng; 2 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 6 public class FileTest { 7 8 public static void main(String[] args) throws Exception{ 9 //FileReader類的read()方法可以按照字符大小讀取 10 FileReader fr=new FileReader("aaa.txt"); 11 int b; 12 while((b=fr.read())!=-1){ 13 System.out.println((char)b);//int類型轉為字符型 14 } 15 fr.close(); 16 17 //FileWriter類的write()方法可以自動把字符轉為字節寫出 18 FileWriter fw = new FileWriter("aaa.txt",true); 19 fw.write("aaa"); 20 fw.close(); 21 22 //字符流的拷貝 23 FileReader fr2 = new FileReader("aaa.txt"); 24 FileWriter fw2 = new FileWriter("bbb.txt"); 25 26 int ch; 27 while((ch = fr2.read()) != -1) { 28 fw2.write(ch); 29 } 30 31 fr2.close(); 32 fw2.close(); 33 } 34 }
1 package com.ningmeng; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7 8 public class FileTest { 9 10 public static void main(String[] args) throws Exception{ 11 BufferedReader br=new BufferedReader(new FileReader("aaa.txt")); 12 BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt")); 13 //BufferedReader和BufferedWriter的使用: 14 int b; 15 while((b=br.read())!=-1){ 16 bw.write((char)b); 17 } 18 br.close(); 19 bw.close(); 20 } 21 }
先寫到這里吧,內容比較多,以后有時間再總結,也方便自己腦補