理解java
對於文件流來講是io流的基礎,牽扯到緩衝流,緩衝流是在內存中使用io流的各種操做,轉換流顧名思義,是字節與字符流之間的轉換 ,要先有字節流和字符流,對象流,最主要的是類的序列化與反序列化,至關於一個封裝轉化,隨機存取流,也是在有字節流和字符流的基礎上。編程
能新建,刪除,重命名文件和目錄,但不能訪問文件內容,訪問文件內容要經過輸入/輸出流數組
簡單梳理緩存
File操做dom
package day12; import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) { File f = new File("D:\\test\\abc\\tt.txt");//這個時候對象f就是tt.txt文件 File f4 = new File("D:\\test\\abc");//這個目錄 <!-- File f2 = new File("D:/test/abc/tt.txt"); File f3 = new File("D:" + File.separator + "test\\abc\\tt.txt"); File f1 = new File("D:\\test","abc\\tt.txt");//這個f1也是tt.txt文件,這種實驗相對比較少 --> //注意,\在文件中是路徑的分隔符,可是在java編程中一個\的意思是轉移符,在java中\\或者/纔是文件的分隔符 //也能夠File.separator做爲文件分隔符 System.out.println(f.getName());//獲取文件名 System.out.println(f4.getName());//獲取文當前的文件名稱 File f5 = new File("src/day12/Test.java");//使用相對路徑來建立file對象 System.out.println(f5.getPath());//獲取文件或者文件夾的路徑,就是new file時候寫的路徑 System.out.println(f5.getAbsolutePath());//獲取當前文件的絕對路徑 System.out.println(f5); System.out.println(f5.getAbsoluteFile());//返回一個用當前的文件的絕對路徑構建的file對象 System.out.println(f5.getParent());//返回當前文件或者文件夾的父級路徑 f.renameTo(new File("D:\\test\\abc\\tt1.txt"));//給文件或文件夾重命名 File f6 = new File("D:\\test\\abc1"); System.out.println(f6.exists());//判斷文件或者文件夾是否存在 File f7 = new File("D:\\test\\abc\\tt1.txt"); System.out.println(f7.canWrite());//判斷文件是否可寫 System.out.println(f7.canRead());//判斷文件是否可讀 System.out.println(f7.isFile());//判斷當前的file對象是否是文件 System.out.println(f7.isDirectory());//判斷當前的file對象是否是文件夾或者目錄 System.out.println(f7.lastModified());//獲取文件的最後修改時間,返回的是一個毫秒數 System.out.println(f7.length());//返回文件的長度,單位是字節數 File f8 = new File("D:\\test\\abc\\tt2.txt"); System.out.println(f8.exists());//判斷文件是否存在 if(!f8.exists()){ try { f8.createNewFile();//建立新的文件 } catch (IOException e) { e.printStackTrace(); } } <!-- f8.delete();//刪除文件 File f9 = new File("D:\\test\\abc\\cc"); File f9 = new File("D:\\test\\abc\\cc\\dd"); f9.mkdir();//建立單層目錄,若是使用這一方法來建立多層目錄,就得一層一層的執行mkdir() File f10 = new File("D:\\test\\abc\\a\\b\\c"); f10.mkdirs();//這個方法是直接用來建立多層目錄 --> File f11 = new File("D:\\test"); String[] fl = f11.list();//返回的是當前文件夾的子集的名稱,包括目錄和文件 for(String s : fl){ System.out.println(s); } File[] fs = f11.listFiles();//返回的是當前文件夾的子集的file對象,包括目錄和文件 for(File ff : fs){ System.out.println(ff); } }
遞歸遍歷文件ide
public void test(File file){ if(file.isFile()){ System.out.println(file.getAbsolutePath() + " 是文件"); }else{ System.out.println(file.getAbsolutePath() + " 是文件夾"); //若是是文件夾,這個文件夾裏就可能有子文件夾或者文件 File[] fs = file.listFiles();//獲取當前文件夾下的子文件夾或者文件的file對象 if(fs != null && fs.length > 0){ for(File ff : fs){ test(ff);//遞歸 if(ff.isFile()){ System.out.println(ff.getAbsolutePath() + " 是文件"); }else{ System.out.println(ff.getAbsolutePath() + " 是文件夾"); File[] fs1 = ff.listFiles(); if(fs1 != null && fs1.length > 0){ for(File ff1 : fs1){ } } } } } } } }
字節流很是通用,能夠用來操做字符的文檔,還能夠操做而後的其餘類型文件,都是使用二進制轉換編碼
FileInputStream:字節輸入流code
public static void testFileInputStream(){ try { FileInputStream in = new FileInputStream("D:/test/abc/tt1.txt"); byte[] b = new byte[10];//設置一個byte數組接收讀取的文件的內容 int len = 0;//設置一個讀取數據的長度 //in.read(b);//in.read方法有一個返回值,返回值是讀取的數據的長度,若是讀取到最後一個數據,還會向後讀一個,這個時候返回值就是-1 //也就意味着當in.read的返回值是-1的時候整個文件就讀取完畢了 while((len = in.read(b)) != -1){ System.out.println(new String(b,0,len)); //new String(b,0,len),參數1是緩衝數據的數組,參數2是從數組的那個位置開始轉化字符串,參數3是總共轉化幾個字節 } in.close();//注意。流在使用完畢以後一段要關閉 } catch (Exception e) { e.printStackTrace(); } }
FileOutputStream:字節輸出流對象
public static void testFileOutputStream(){ try { FileOutputStream out = new FileOutputStream("D:/test/abc/tt4.txt");//指定行tt4輸出數據 String str = "knsasjadkajsdkjsa"; out.write(str.getBytes());//把數據寫到內存 out.flush();//把內存中的數據刷寫到硬盤 out.close();//關閉流 } catch (Exception e) { e.printStackTrace(); } }
複製文件到指定位置blog
public static void copyFile(String inPath, String outPanth){ try { FileInputStream in = new FileInputStream(inPath);//讀取的源文件 FileOutputStream out = new FileOutputStream(outPanth);//複製到哪裏 byte[] b = new byte[100]; int len = 0; while((len = in.read(b)) != -1){ out.write(b, 0, len);//參數1是寫的緩衝數組,參數2是從數組的那個位置開始,參數3是獲取的數組的總長度 } out.flush();//把寫到內存的數據刷到硬盤 out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } }
FileReader:字符輸入流
public static void testFileReader(String inPath){ try { FileReader fr = new FileReader(inPath);//建立文件字符輸入流的對象 char[] c = new char[10];//建立臨時存數據的字符數組 int len = 0;//定義一個輸入流的讀取長度 while((len = fr.read(c)) != -1){ System.out.println(new String(c, 0, len)); } fr.close();//關閉流 } catch (Exception e) { e.printStackTrace(); } }
FileWriter:字符輸出流
public static void testFileWriter(String text,String outPath){ try { FileWriter fw = new FileWriter(outPath); fw.write(text);//寫到內存中 fw.flush();//把內存的數據刷到硬盤 fw.close();//關閉流 } catch (Exception e) { e.printStackTrace(); } }
複製文件到指定位置(字符流只適合操做內容是字符文件)
public static void copyFile(String inPaht, String outPath){ try { FileReader fr = new FileReader(inPaht); FileWriter fw = new FileWriter(outPath); char[] c = new char[100]; int len = 0; while((len = fr.read(c)) != -1){//讀取數據 fw.write(c,0,len);//寫數據到內存 } fw.flush(); fw.close(); fr.close(); } catch (Exception e) { e.printStackTrace(); } }
BufferedInputStream:緩衝字節輸入流
public static void testBufferedInputStream() throws Exception { // 文件字節輸入流對象 FileInputStream in = new FileInputStream("D:\\testdemo\\demo\\src\\day13\\tt.txt"); // 把文件字節輸入流放到緩衝字節輸入流對象 BufferedInputStream br = new BufferedInputStream(in); byte[] b = new byte[10]; int len = 0; while ((len = br.read(b)) != -1) { System.out.println(new String(b, 0, len)); } // 關閉流的時候,本着一個最晚開的最先關,依次關 br.close(); in.close(); }
BufferedOutputStream:緩衝字節輸入流
public static void testBufferedOutputStream() throws Exception { // 建立字節輸出流對象 FileOutputStream out = new FileOutputStream("D:\\testdemo\\demo\\src\\day13\\tt1.txt"); // 把字節輸出流對象放到緩衝字節輸出流中 BufferedOutputStream bo = new BufferedOutputStream(out); String s = "hello world"; bo.write(s.getBytes());// 寫到內存中 bo.flush();// 刷到硬盤上 // 關閉流的時候,本着一個最晚開的最先關,依次關 bo.close(); out.close(); }
緩衝流實現文件的複製
public static void copyFile() throws Exception { // 緩衝輸入流 BufferedInputStream br = new BufferedInputStream( new FileInputStream("D:\\testdemo\\demo\\src\\day13\\tt1.txt")); // 緩衝輸出流 BufferedOutputStream bo = new BufferedOutputStream( new FileOutputStream("D:\\testdemo\\demo\\src\\day13\\tt2.txt")); byte[] b = new byte[1024]; int len = 0;// 設置一個沒出讀取到的數據的長度,直到br.read方法執行到最後(好比說文件中只有hello // world,執行到最後一個就讀取d的後面,這個時候返回值就是-1) while ((len = br.read(b)) != -1) { bo.write(b, 0, len);// 寫到內存 } bo.flush();// 刷到硬盤 bo.close(); br.close(); }
BufferedReader:緩衝字符輸入流
public static void testBufferedReader() throws Exception { FileReader r = new FileReader("D:\\testdemo\\demo\\src\\day13\\tt.txt"); BufferedReader br = new BufferedReader(r); char[] c = new char[100]; int len = 0; while ((len = br.read(c)) != -1) {// br.read(c)讀到文件的最後一個字符的下一位,返回值就是-1 System.out.println(new String(c, 0, len)); } br.close(); r.close(); }
BufferedWriter:緩衝字符輸出流
public static void testBufferedWriter() throws Exception { FileWriter fw = new FileWriter("D:\\testdemo\\demo\\src\\day13\\tt3.txt"); BufferedWriter bw = new BufferedWriter(fw); String s = "hello world!!!!"; bw.write(s); bw.flush(); bw.close(); fw.close(); }
緩衝字符流複製文件
public static void copyFile() throws Exception { BufferedReader br = new BufferedReader(new FileReader("D:\\testdemo\\demo\\src\\day13\\tt3.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\testdemo\\demo\\src\\day13\\tt4.txt")); char[] c = new char[100]; int len = 0; while ((len = br.read(c)) != -1) { bw.write(c, 0, len); } bw.flush(); bw.close(); br.close(); }
InputStreamReader:轉換字節輸入流爲字符輸入流
public static void testInputStreamReader() throws Exception { FileInputStream fs = new FileInputStream("D:\\testdemo\\demo\\src\\day13\\tt5.txt"); // 把字節流轉換爲字符流 InputStreamReader in = new InputStreamReader(fs, "GBK");// 參數1是字節流,參數2是編碼 //InputStreamReader in = new InputStreamReader(fs,"UTF-8");//參數1是字節流,參數2是編碼 char[] c = new char[100]; int len = 0; while ((len = in.read(c)) != -1) { System.out.println(new String(c, 0, len)); } in.close(); fs.close(); }
OutputStreamReader:轉換字節輸出流爲字符輸出流
public static void testOutputStreamWriter() throws Exception { FileOutputStream out = new FileOutputStream("D:\\testdemo\\demo\\src\\day13\\tt6.txt"); //OutputStreamWriter os = new OutputStreamWriter(out, "UTF-8"); OutputStreamWriter os = new OutputStreamWriter(out, "GBK"); os.write("你好你好"); os.flush(); os.close(); out.close(); }
標準的輸入流
public static void testSystemIn() throws Exception { // 建立一個接收鍵盤輸入數據的輸入流 InputStreamReader is = new InputStreamReader(System.in); // 把輸入流放到緩衝流裏 BufferedReader br = new BufferedReader(is); String str = "";// 定義一個臨時接收數據的字符串 while ((str = br.readLine()) != null) { System.out.println(str); } br.close(); is.close(); }
把控制檯輸入的內容寫到指定的TXT文件中,當接收到字符串over,就結束程序的運行
public static void write2TXT() throws Exception { // 建立一個接收鍵盤輸入數據的輸入流 InputStreamReader is = new InputStreamReader(System.in); // 把輸入流放到緩衝流裏 BufferedReader br = new BufferedReader(is); BufferedWriter out = new BufferedWriter(new FileWriter("D:\\testdemo\\demo\\src\\day13\\tt7.txt")); String line = ""; while ((line = br.readLine()) != null) { if (line.equals("over")) { break; } // 讀取的每一行都寫到指定的TXT文件 out.write(line); } out.flush(); out.close(); br.close(); is.close(); }
PrintStream/PrintWriter:System.out.println等
DataInputStream:數據輸出流
用數據輸出流寫到文件的中的基本數據類型的數據,是亂碼的,不能直接辨認出來,須要數據輸入流來讀取 DataOutputStream
public static void testDataOutputStream() throws Exception { DataOutputStream out = new DataOutputStream(new FileOutputStream("D:/testdemo/demo/src/day13/tt8.txt")); //out.writeBoolean(true); out.writeDouble(1.35d); //out.writeInt(100); out.flush(); out.close(); }
DataOutputStream:數據輸入流
若是寫的時候是writeDouble,讀的時候就得是readDouble DataInputStream
public static void testDataInputStream() throws Exception { DataInputStream in = new DataInputStream(new FileInputStream("D:/testdemo/demo/src/day13/tt8.txt")); System.out.println(in.readDouble()); in.close(); }
ObjectInputStream:對象的序列化
public static void testSerialize() throws Exception { // 定義對象的輸出流,把對象的序列化以後的流放到指定的文件中 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/testdemo/demo/src/day13/tt9.txt")); Person p = new Person(); p.name = "zhangsan"; p.age = 11; out.writeObject(p); out.flush();// 刷寫數據到硬盤 out.close(); }
ObjectOutputStream:對象的反序列化
public static void testDeserialize() throws Exception { // 建立對象輸入流對象,從指定的文件中把對象序列化後的流讀取出來 ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/testdemo/demo/src/day13/tt9.txt")); Object obj = in.readObject(); Person p = (Person) obj; // 這個時候序列化與反序列化使用的類不是一個類分別是day13.Person和day13.test.Person // 這個時候反序列化就有異常day13.Person cannot be cast to day13.test.Person //day13.test.Person p = (day13.test.Person)obj; System.out.println(p.name); System.out.println(p.age); in.close(); }
隨意讀文件
public static void testRandomAccessFileRead() throws Exception { RandomAccessFile ra = new RandomAccessFile("D:/testdemo/demo/src/day13/tt10.txt", "r"); //ra.seek(0);//設置讀取文件內容的起始點 ra.seek(8);// 經過設置讀取文件內容的起始點,來達到從文件的任意位置讀取 byte[] b = new byte[1024]; int len = 0; while ((len = ra.read(b)) != -1) { System.out.println(new String(b, 0, len)); } ra.close(); }
隨意存文件
public static void testRandomAccessFileWrite() throws Exception { RandomAccessFile ra = new RandomAccessFile("D:/testdemo/demo/src/day13/tt10.txt", "rw"); //ra.seek(0);//設置寫的起始點,0表明從開頭寫 // 注意:若是是在文件開頭或者中間的某個位置開始寫的話,就會用寫的內容覆蓋掉等長度的原內容 ra.seek(ra.length());// 設置寫的起始點,ra.length()表明從文件的最後結尾寫,也就是文件的追加 ra.write("你好".getBytes()); ra.close(); }