java - 流
| ? | 字節流 | 描述 | 字符流? | 描述 |
| 輸入流 | InputStream | ? | Reader | ? |
| FileInputStream | 從文件中讀取原始字節流,如圖像 | FileReader | 從文件中讀取字符流 | |
| ? | ? | BufferedReader | ?從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取 | |
| 輸出流 | OutputStream | ? | Writer | ? |
| FileOutputStream | 向文件中寫入原始字節流,如圖像 | FileWriter | 向文件中寫入字符流 | |
| ? | ? | ?BufferedWriter | ?將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入 |
?
?
package com.sungoal.webmanagement.log;import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException;/** * @Package com.sungoal.webmanagement.log* @ClassName: Testdecode* @Description: TODO(這里用一句話描述這個類的作用)* @author andy* @date 2013-10-22 下午05:57:02*/ public class Testdecode {static String fileName = "D:\\logs\\log_dir1\\2013102210.txt";/*** * @Title: simpleJudge* @Description: TODO(單一判斷文件是否是uft-8編碼)*/public static void simpleJudge(){File file = new File(fileName);byte[] b = new byte[3];try {InputStream ios = new java.io.FileInputStream(file);ios.read(b);ios.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}if (b[0] == -17 && b[1] == -69 && b[2] == -65)System.out.println(file.getName() + ":編碼為UTF-8");elseSystem.out.println(file.getName() + ":可能是GBK,也可能是其他編碼。");}/*** * @Title: codeString* @Description: TODO(返回文件的編碼)* @param fileName* @return* @throws Exception String*/public static String codeString(String fileName) throws Exception{ BufferedInputStream bin = new BufferedInputStream( new FileInputStream(fileName)); int p = (bin.read() << 8) + bin.read(); String code = null; switch (p) { case 0xefbb: code = "UTF-8"; break; case 0xfffe: code = "Unicode"; break; case 0xfeff: code = "UTF-16BE"; break; default: code = "GBK"; } return code; } /*** @return * @Title: readFile* @Description: TODO(以文件的存儲編碼來讀取文件,防止讀取出來為亂碼)void*/private static void readFile() {//code為上面方法里返回的編碼方式 InputStreamReader inputStreamReader = null;try {FileInputStream fInputStream = new FileInputStream("D:\\logs\\log_dir1\\2013102210.txt"); inputStreamReader = new InputStreamReader(fInputStream, codeString(fileName));} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (UnsupportedEncodingException e1) {e1.printStackTrace();} catch (Exception e1) {e1.printStackTrace();} BufferedReader in = new BufferedReader(inputStreamReader); StringBuffer sBuffer = new StringBuffer();try {String strTmp = in.readLine();//按行讀取 while (strTmp != null) { sBuffer.append(strTmp + "/n"); strTmp = in.readLine();}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println(sBuffer.toString()); }public static void main(String[] args) {readFile(); } } View Code?
?
?
?
?
任何數據的讀寫都是01010101
java以unicode編碼,一個字符兩個字節
以stream結尾的都是字節流
方向不同(單位為8bit)分為: 字節輸入流(InputStream)和字節輸出流(OutputStream)
數據單位(單位為16bit)不同:字符輸入流(Reader)和字符輸出流(Writer)
功能不同??? :?? 節點流(管道直接套接在數據源上)和處理流(套接在其他管道之上的流)
flush先把緩沖區的數據寫出來,然后close
bufferedreader readline,提高讀取效率
bufferedwriter newline
轉換流 : 字節流轉換成字符流 如 outputstreamwriter 將輸出的字節流轉換成輸出的字符流
阻塞
數據流? : datainputstream,bytearrayoutputstream 現在讀寫英文(字節流)中文(字符流)都沒問題,但是讀寫double,和long等類型的,沒有此類對應的接口,當然你可以通過String.valueOf(參數).getBytes() ,再一個字節一個字節的讀寫,
第一麻煩
第二 列舉一個long類型的 23223233232323243432323322,本來long類型在內存中只占8個字節,現在內存中占了幾十個字節了
所以數據流應運而生了
print流 : 不會拋異常,不用try catch,會自動flush
object流: objectoutputstream
?????????? 實現Serializable接口(標記性接口,空實現),jdk幫你實現對象的實例化
?????????? transient 修飾的成員變量不予考慮,不被序列化
?????????? 序列化把一個object轉換成字節流直接寫到文件中
?????????? Externalizable(可外部化),自己可以控制如何實現序列化
總結
- 上一篇: 实例:如何设计一款好的Metro UI应
- 下一篇: Java程序员从笨鸟到菜鸟之(四十四)细