文件,文件夾,路徑java
file
就是文件路徑,文件,文件夾的抽象類。數組
//file的三種夠着函數public File(String pathName) File file = new File("d:\\xxxx"); //只負責抽象出對象,提供方法,無論路徑是否存在 public File(String father, String child) public File(File parent, String child) public boolean createNewFile(String name) //只能從建立文件不能建立文件夾 public boolean mdirs() public boolean delete() public File getAbsoluteFile() public boolean exists() public boolean isDirectory() //list listFile獲取功能 public String[] list() //獲得File中的文件和文件夾名的集合 public File[] listFile()
遍歷一個文件對象的時候能夠根據需求選擇合適的文件app
接口FileFilter
並實現內部方法for example:函數
public boolean accept(File file){測試
return file.getName().endWith(".java")編碼
}操作系統
**原理:**實現了FileFilter的類就會調用acceptcode
File file = new File("xxxx"); File[] fileArr = file.listFile(new xxxxFilter());
listFile先遍歷File對象,而後將得到的文件名的全路徑,用過濾器傳遞給accept方法進行判斷,最後返回true的就裝進File[]對象
public static getAllDir(File dir){ File[] fileArray = dir.list; for(File file : fileArray){ if(file.isDirectory){ getAllDir(file); }else{ System.out.println(file); } } }
在存儲中,任何一個文件個的最小單位都是Byte,字節流就是操做最小的存儲單元,對於任何的文件均可以操做,每次只操做一個字節,能夠寫一個文件,也能夠讀取文件,可是文件夾不是文件
。接口
|--java.io.OutputStream全部的字節輸出流的超類 public void public Byte write(int b)寫入一個字節 public Byte write(byte[] b)寫入b.length長度的字節 public Byte write(byte[] b, int index, int howmunch)寫誰,從哪開始寫,寫幾個字節 public void close() public void flush()
流對象的構造方法都是用來綁定數據目的,File對象
String串
public FileOutputStream(){ }
流對象的操做
注意文件被覆蓋
FileOutputStream fos = new FileOutputStream("流對象"); //構造方法會自動建立,若是有,就會將數據覆蓋 //FileNotFoundException fos.write(100); //IOException,可能寫不進去 fos.close(); //寫字節數組 byte[] bytes = {65,66,67,68}; fos.write(bytes); //從一開始寫兩個 fos.write(bytes, 1, 2); //直接寫入字符串的方式 fos.write("hello".getBytes())
打開文件看見的不是100而是d
字母,由於文本在打開的時候都會去運行ASCII碼。
續寫問題,流對象
public FileOutputStream = newFileOutputStream(File file, boolean append)
在不一樣的操做系統中,換行符不同,可是在Windows中是\r\n
File file = new File("xxxx.txt") FileOutputStream fos = new FileOutputStream(file,true); fos.write("hello\r\n".getBytes())
//try的外面聲明變量,內部創建對象 //對fos的做用域提高 FileOutputStream fos = null; try{ fos = new FileOutputStream("xxxxx"); fos.write() }catch(IOException ex){ System.out.println(ex.getMessage()); throw new RuntimeException("文件寫入失敗"); }finally{ //提高做用域自後,Unhandle exception type of ioException if(fos != null){} try{ fos.close(); }catch (IOException ex){ throw new RuntimeException("關閉文件失敗"); } } }
public int available() public void close() public void mark(int readlimit)在此輸入流中標記當前位置 public void reset()定位到最後一次調用mark的位置 public boolean MarkSupported()測試此輸入流是否支持mark和reset public int read()將文件讀入,下一次調用自動讀取下一個字節,到達文件末尾返回-1 public int read(byte[] b)從輸入流中讀取必定數量的字節,而且將其寫入緩衝區數組b中,返回值讀取了多少個有效字節,-1表示結束 public long skip(long n)跳過和丟棄n個字節
流對象操做
FileInputStream fis = new FileInputStream("xxxx"); //接受read方法的返回值 int len = 0; while((len = fis.read() != -1){ System.out.prineln((char)len) } fis.close() //解決讀多了的問題 byte[] b = new byte[1024]; int len = 0; while((len = fis.read(b)) != -1){ System.out.print(new String(b,0,len)); } fis.close();
將一個文件中的字節放到另外一個文件中去就是複製
//按字節的方式去拿,弊端 慢 public static void main(String[] args){ FileInputStream fis = null; FIleOutputStream fos = null; int len = 0; try{ fis = new FileInputStream("xxxx"); fos = new FileOutputStream("xxxx"); while((len = fis.read()) != -1){ fos.write(len); } }catch(IOException ex){ System.out.println(ex.getMessage()); throw new RuntimeException("文件複製失敗") }finally{ if((fis != null)&&(fos != null))){ fis.close(); fos.close(); } } } //採用數組的緩衝來提升效率 public static void main(String[] args){ FileInputStream fis = null; FIleOutputStream fos = null; int len = 0; try{ fis = new FileInputStream("xxxx"); fos = new FileOutputStream("xxxx"); byte[] bytes = new byte[1024] while((len = fis.read(bytes)) != -1){ fos.write(bytes,0,len); } }catch(IOException ex){ System.out.println(ex.getMessage()); throw new RuntimeException("文件複製失敗") }finally{ if((fis != null)&&(fos != null))){ fis.close(); fos.close(); } } }
ASCII:一個字節中有七位表示內容
用兩個字節表示中文,可是第一個字節的開頭必定是複數,可是第二個開頭多是負數
unicode,不管什麼類型都用連個字節表示,在java中char就是使用這個編碼
UTF-8,一個字節就可存儲,不用兩個字節,在每一個字節頭加入了編碼信
這個超類只能寫文本文件,每次操做的是一個字符,只能用來讀和寫字符文件
與FileOutputStream不一樣的是,寫入以後必須調用flush才能寫入,而且close暗含刷新的方法。
FileWriter fw = new FileWriter("xxxxxx"); fw.write("xxxxx"); fw.flush();
全部字符輸入流的超類
FileReader fr = new FileReader("xxxx"); int len = 0; char[] c = new char[1024]; while((len = fr.read()) != -1){ System.out.println(new String(char,0,len)); }