java IO html
以pathname爲路徑建立File對象,能夠是絕對路徑或者相對路徑,若是pathname是相對路徑,則默認的當前路徑在系統屬性user.dir中存儲。java
以parent爲父路徑,child爲子路徑建立File對象。數組
常見方法:緩存
eg:安全
File dir1 = new File("D:/IOTest/dir1"); 網絡 if (!dir1.exists()) { // 若是D:/IOTest/dir1不存在,就建立爲目錄 dom dir1.mkdir(); } 函數 // 建立以dir1爲父目錄,名爲"dir2"的File對象 編碼 File dir2 = new File(dir1, "dir2"); spa if (!dir2.exists()) { // 若是還不存在,就建立爲目錄 dir2.mkdirs(); } File dir4 = new File(dir1, "dir3/dir4"); if (!dir4.exists()) { dir4.mkdirs(); } // 建立以dir2爲父目錄,名爲"test.txt"的File對象 File file = new File(dir2, "test.txt"); if (!file.exists()) { // 若是還不存在,就建立爲文件 file.createNewFile();} |
(抽象基類) |
字節流 |
字符流 |
輸入流 |
InputStream |
Reader |
輸出流 |
OutputStream |
Writer |
讀取文件
1.創建一個流對象,將已存在的一個文件加載進流。
2.建立一個臨時存放數據的數組。
3.調用流對象的讀取方法將流中的數據讀入到數組中。
FileReader fr = null; try{ fr = new FileReader("c:\\test.txt"); char[] buf = new char[1024]; int len= 0; while((len=fr.read(buf))!=-1){ System.out.println(new String(buf ,0,len));} }catch (IOException e){ System.out.println("read-Exception :"+e.toString());} finally{ if(fr!=null){ try{ fr.close(); }catch (IOException e){ System.out.println("close-Exception :"+e.toString()); } } } |
寫入文件
1.建立流對象,創建數據存放文件
2.調用流對象的寫入方法,將數據寫入流
3.關閉流資源,並將流中的數據清空到文件中。
FileWriter fw = null; try{ fw = new FileWriter("Test.txt"); fw.write("text"); } catch (IOException e){ System.out.println(e.toString()); } finally{ If(fw!=null) try{ fw.close(); } catch (IOException e){ System.out.println(e.toString()); } } |
注意點:
BufferedReader br = null; BufferedWriter bw = null; try { //step1:建立緩衝流對象:它是過濾流,是對節點流的包裝 br = new BufferedReader(new FileReader("d:\\IOTest\\source.txt")); bw = new BufferedWriter(new FileWriter("d:\\IOTest\\destBF.txt")); String str = null; while ((str = br.readLine()) != null) { //一次讀取字符文本文件的一行字符 bw.write(str); //一次寫入一行字符串 bw.newLine(); //寫入行分隔符 } bw.flush(); //step2:刷新緩衝區 } catch (IOException e) { e.printStackTrace(); } finally { // step3: 關閉IO流對象 try { if (bw != null) { bw.close(); //關閉過濾流時,會自動關閉它所包裝的底層節點流 } } catch (IOException e) { e.printStackTrace(); } try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } |
如: Reader isr = new
InputStreamReader(System.in,"ISO5334_1");//指定字符集
public void testMyInput() throws Exception{ FileInputStream fis = new FileInputStream("dbcp.txt"); FileOutputStream fos = new FileOutputStream("dbcp5.txt"); InputStreamReader isr = new InputStreamReader(fis,"GBK"); OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK"); BufferedReader br = new BufferedReader(isr); BufferedWriter bw = new BufferedWriter(osw); String str = null; while((str = br.readLine()) != null){ bw.write(str); bw.newLine(); bw.flush(); } bw.close(); br.close();} |
計算機只能識別二進制數據,早期由來是電信號。爲了方便應用計算機,讓它能夠識別各個國家的文字。就將各個國家的文字用數字來表示,並一一對應,造成一張表。這就是編碼表。
System.out.println("請輸入信息(退出輸入e或exit):"); //把"標準"輸入流(鍵盤輸入)這個字節流包裝成字符流,再包裝成緩衝流 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String s = null; try { while ((s = br.readLine()) != null) { //讀取用戶輸入的一行數據 --> 阻塞程序 if (s.equalsIgnoreCase("e") || s.equalsIgnoreCase("exit")) { System.out.println("安全退出!!"); break; } //將讀取到的整行字符串轉成大寫輸出 System.out.println("-->:"+s.toUpperCase()); System.out.println("繼續輸入信息"); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); //關閉過濾流時,會自動關閉它包裝的底層節點流 } } catch (IOException e) { e.printStackTrace(); } }
|
FileOutputStream fos = null; try { fos = new FileOutputStream(new File("D:\\IO\\text.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); }//建立打印輸出流,設置爲自動刷新模式(寫入換行符或字節 '\n' 時都會刷新輸出緩衝區) PrintStream ps = new PrintStream(fos,true); if (ps != null) { // 把標準輸出流(控制檯輸出)改爲文件 System.setOut(ps);} for (int i = 0; i <= 255; i++) { //輸出ASCII字符 System.out.print((char)i); if (i % 50 == 0) { //每50個數據一行 System.out.println(); // 換行 } } ps.close(); } |
boolean readBoolean() byte readByte()
char readChar() float readFloat()
double readDouble() short readShort()
long readLong() int readInt()
String readUTF() void readFully(byte[] b)
DataOutputStream dos = null; try { //建立鏈接到指定文件的數據輸出流對象 dos = new DataOutputStream(new FileOutputStream( "d:\\IOTest\\destData.dat")); dos.writeUTF("ab中國"); //寫UTF字符串 dos.writeBoolean(false); //寫入布爾值 dos.writeLong(1234567890L); //寫入長整數 System.out.println("寫文件成功!"); } catch (IOException e) { e.printStackTrace(); } finally { //關閉流對象 try { if (dos != null) { // 關閉過濾流時,會自動關閉它包裝的底層節點流 dos.close(); } } catch (IOException e) { e.printStackTrace(); } } |
序列化:將對象寫入到磁盤或者進行網絡傳輸。
要求對象必須實現序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test3.txt"));
Person p = new Person("韓梅梅",18,"中華大街",new Pet());
oos.writeObject(p);
oos.flush();
oos.close();
//反序列化:將磁盤中的對象數據源讀出。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test3.txt"));
Person p1 = (Person)ois.readObject();
System.out.println(p1.toString());
ois.close();
讀取文件內容
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw"); raf.seek(5); byte [] b = new byte[1024]; int off = 0; int len = 5; raf.read(b, off, len);
String str = new String(b, 0, len); System.out.println(str);
raf.close(); |
寫入文件內容
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw"); raf.seek(5);
//先讀出來 String temp = raf.readLine();
raf.seek(5); raf.write("xyz".getBytes()); raf.write(temp.getBytes());
raf.close(); |
流的基本應用小節