在java.io包裏面File類是惟一一個與文件自己有關的程序處理類,可是File只可以操做文件自己而不能操做文件的內容,或者說在實際的開發之中IO操做的核心意義在於:輸入與輸出操做。輸入和輸出實質上傳遞的就是一種數據流的處理形式,數據流指的是字節數據 。而對於這種流的處理形式在java.io包裏面提供有兩類支持。java
流操做的統一處理步驟(以文件處理流程爲例):數組
字節的數據是以byte類型爲主實現的操做,在進行字節內容的輸出的時候可使用OutputStream類完成app
類的基本定義:spa
三個內容輸出的方法:code
注意:對象
OutputSream是一個抽象類,若是想要得到實例化對象應該經過對子類實例的向上轉型完成,若是說如今要進行的是文件處理操做,則可使用FileOutputStream子類blog
FileOutputStream構造方法:資源
範例:使用OutputStream類實現內容輸出(符合上述的流操做的統一處理步驟)開發
import java.io.*; public class OutputStreamDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); //1.指定要操做的文件路徑 if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目錄 } try (OutputStream output = new FileOutputStream(file,true)) {//2.經過子類實例化 String str = "hello world\r\n"; //要輸出的文件內容 output.write(str.getBytes());//3.將字符串變爲字節數組並輸出 } catch (IOException e) { e.printStackTrace(); }//4.AutoCloseable 自動關閉 //執行後會自動幫助用戶建立文件 } }
類的基本定義:字符串
核心方法:
InputoutStream和OutputStream同樣都屬於抽象類,要依靠子類來實例化對象
FileInputStream構造方法:
範例:讀取數據
import java.io.*; public class InputStreamDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt");//讀取的文件路徑 InputStream input = new FileInputStream(file); byte[] data = new byte[1024];//用於存放讀取出的內容的緩衝區 int len = input.read(data);//讀取的內容長度 System.out.println("【"+new String(data,0,len)+"】");//輸出緩衝區讀取的內容 input.close(); } }
OutputStream數據輸出的時候使用的是字節,而不少時候字符串的輸出是比較方便的,因此在JDK1.1時推出字符輸出流
類的基本定義:
兩個主要的輸出方法:
範例:使用Writer輸出
import java.io.*; public class WriterDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); //1.指定要操做的文件路徑 if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目錄 } Writer out = new FileWriter(file,true); String str = "goodbye world\r\n"; out.write(str); out.append("hahahaha");//追加輸出內容 out.close(); } }
類的基本定義:
輸入方法:
字符流讀取的時候只可以按照數組的形式來實現處理操做,不可以直接按照字符串的形式
範例:實現數據讀取
import java.io.*; public class ReaderDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); if(file.exists()) { Reader in = new FileReader(file); char[] data = new char[1024]; int len = in.read(data); System.out.println(new String(data,0,len)); in.close(); } } }
在使用OutputStream類輸出的時候若是沒有使用close()方法關閉輸出流發現內容依然能夠實現正常的輸出
可是若是在使用Writer的時候沒有使用close()方法關閉輸出流,那麼這個內容將沒法進行輸出,由於Writer使
用到緩衝區,當使用了close()方法的時候實際上會出現有強制刷新緩衝區的狀況,因此這個時候會將內容進行
輸出操做,因此此時若是在不關閉的狀況下想要將所有內容輸出可使用flush()方法強制狀況緩衝區
字符流的優點在於處理中文數據上
轉換流就是能夠實現字節流與字符流操做的功能轉換,例如:進行輸出的時候OutputStream須要將內容變
爲字節數組後才能夠輸出,而Writer能夠直接輸出字符串,這一點是方便的,因此不少人就認爲須要提供一種
轉換的機制,來實現不一樣的流類型的轉換操做,爲此在java.io包裏面提供有兩個類:InputStreamReader
OutputStreamWriter。
類: OutputStreamWriter InputStreamReader
定義: public class OutputStreamWriter extends Writer public class InputStreamReader extends Reader
構造方法:public OutputStreamWriter(OutputStream out) public InputStreamReader(InputStream in)
從構造方法能夠看出,所謂的轉換處理,就是將接收到的字節流對象向上轉型變爲字符流對象
範例:轉換流
import java.io.*; public class OutputStreamWriterDemo { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub File file = new File("D:"+File.separator+"hello" +File.separator+"demo.txt"); if(!file.getParentFile().exists()) { //文件不存在 file.getParentFile().mkdirs(); //建立父目錄 } OutputStream output = new FileOutputStream(file,true); Writer out = new OutputStreamWriter(output); out.write("i am back"); out.close(); } }