Input / Output:指跨越出JVM的邊界,與外界數據的源頭或者目標數據源進行數據交換.
輸出 Output
------------------------------->
JVM 數據源
<-------------------------------
輸入 Input
注意:輸入/輸出是針對JVM 而言。
File 類
可表示一個文件,也有可能是一個目錄(在JAVA中文件和目錄都屬于這個類中,而且區分不是非常的明顯,可以調用isDirectory()和isFile()來判斷)。
常用的方法:
exists() 用來判斷 文件或目錄是否存在。
isDirectory() 判斷是否是目錄
isFile() 判斷是否是文件
mkdir() 創建目錄
mkdirs() 創建目錄包括它下面的子目錄。
getAbsolutePath() 得到文件絕對路徑
getParentFile() 得到父目錄的File對象
list() 得到文件名的String數組 (得到當前目錄下的文件名,目錄名)
listFiles() 返回File類型數組,(目錄,文件的File對象)可用getName()得到文件名。
delete() 刪除文件
getName() 得到文件名
getPath() 得到文件相對路徑
separtor() 得到文件分隔符 //這個方法有更好的通用性,平臺不同結果不同
deleteOnExit() 在進程退出的時候刪除文件,常用在臨時文件的刪除。
1、流的概念:
輸出流
程序----------->文件、網絡
程序<-----------數據來源
輸入流
2、流的分類:
按處理方式來分:
字節流:按8位傳輸 InputStream OutputStream
字符流:按16位傳輸 Reader Writer
按功能來分:
節點流:與文件、網絡打交道的流,操作數據的來源
處理流(包裝流):操作節點流
如何區分:
輸入流:以InputStream、Reader結尾的流
FileInputStream BufferedReader
輸出流:以OutputStream、Writer結尾的流
FileOutputStream PrintWriter
字節流:以InputStream、OutputStream結尾的流
字符流:以Reader、Writer結尾的流
節點流:看構造器,參數為數據來源,參數是String或File之類的
new FileInputStream("d:\\abc.txt");
new FileOutputStream(new File("d:\\abc.txt"))
處理流:構造器的參數為其它流
new BufferedReader(new InputStreamReader(new FileInputStream("d:\\abc.txt")));
選擇流時:
首先確定是輸入還是輸出。
其次確定是字節流還是字符流。
然后確定是節點流還是處理流。
根據數據類型選擇輸入/輸出流:
①byte、byte[] InputStream / OutputStream
②int、byte、char、double DataInputStream / DataOutputStream
③char、String Reader / Writer
④Object ObjectInputStream / ObjectOutputStream
若考慮性能會在前試著加Buffered
3、常用流:
DataInputStream&DataOutputStream 用于讀寫基本類型數據,如int、float、long、double和boolean等。
此外,DataInputStream的readUTF()方法還能讀取采用UTF-8字符編碼的字符串。
BufferedInputStream&BufferedOutputStream
因為利用了緩沖區,所以常用于提高讀寫數據的效率。
BufferedInputStream先把一批數據讀入到緩沖區,接下來read方法只需要從緩沖區內獲得數據,減少了物理性讀取數據的次數。
可以使用BufferedInputStream(InputStream in, int size) 中的size來指定緩沖區的大小
ObjectOutputStream&ObjectInputStream
對象的序列化是指把對象寫到一個輸出流中,
對象的反序列化是指從一個輸入流中讀取一個對象。
Java語言要求只有實現了java.io.Serializable接口的類的對象才能序列化和反序列化
Reader/Writer
當需要程序讀寫文本文件,而且文本文件采用特定的字符編碼集時,應采用Reader/Writer。
InputStreamReader & OutputStreamWriter 橋梁流
把字節流轉換成字符流
在橋轉換的時候可以指定編解碼方式
BufferedReader
readLine()方法可以一次讀入一行字符,以字符串形式返回。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file"),"UTF-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("file"),"UTF-8"));
PrintWriter 輸出格式化的數據,所有的寫數據的方法以print開頭。
print (int i)
print (long l)
print (float f)
print (String s)
每個print() 方法都有一個println()方法對應
a.
printWriter.println("Hello");
b.
printWriter.print("Hello");
printWriter.println();
c.
printWriter.print("Hello\n");
以上三段代碼是等價的
4、JAVA編碼問題:UTF-8,GBK,GB2312是可以顯示中文的。
ASCII 一個字符-----1B 任何一種編碼均兼容 A<-->65
ISO8859-1 (西歐) 一個字符-----1B
GB2312 / GBK 一個字符-----2B
Unicode 一個字符-----2B 會增加網絡負擔 Java中的char是Unicode
UTF-8 變長字節(變長的Unicode方式)
英文-----1B
中文-----3B
提供編碼幫助的類:java.nio.charset.Charset
GBK---中、日、韓,gb2312是GBK的子集
會出現中文編碼問題的情況:
1、用流操作文件時
2、網頁(動態、靜態)
3、網絡傳遞信息時
String--->亂碼(再次轉碼)
String temp=p.getProperty("name");
temp=new String(temp.getBytes("ISO8859-1"),"GBK");這兩處的編碼有時需要互換位置
對象序列化
1:定義:把對象作為一個整體,在I/O流中傳播
2:語法:
(1)實現了Serializeble接口的對象才能可序列化。這個接口里沒有任何方法,沒有方法的接口稱為標記接口。
例如:class Student implements Serializeble{}
(2)如果一個序列化后的對象里面有一個屬性是個對象屬性,那么這個對象屬性也需要實現序列化。
例如:class Student implements Serializeble{
Teacher t;//必須序列化
}
class Teacher implements Serializeble{}
(3)包名、類名、屬性可以被序列化
方法、構造器不會序列化
所有的靜態屬性都不會被序列化
用transient關鍵字修飾的屬性是臨時屬性,臨時屬性不參與序列化。
3:使用注意:
a.用readObject讀文件的時候,當文件結束的時候會拋出EOFException,當我們捕獲這個異常的時候,程序就結束了。
b.如果需要向一個文件中追加對象,首先要把文件中原有的對象讀出來,再把原有對象和新追加的對象一起寫入到文件。
c. serialVersionUID是靜態常量,表示當前對象的版本號,在接受傳輸的數據時會自動檢查該值,保證版本的相同。
java.util.Properties屬性類,針對屬性文件操作,早期使用。
好處是可以在不修改代碼的情況下改變相應的需求。
文件名以.properties結尾的文件稱為屬性文件
文件的內容是:名字=值 的形式
常用方法:
public void load(InputStream inStream)throws IOException
從輸入流中讀取屬性列表
public void store(OutputStream out,String comments)throws IOException
把屬性列表寫入輸出流
public String getProperty(String key)
public String getProperty(String key,String defaultValue)
public Object setProperty(String key,String value)
posted on 2009-03-31 19:40
faye 閱讀(194)
評論(0) 編輯 收藏