1、基本的輸入流和輸出流
流是 Java 中最重要的基本概念之一。文件讀寫(xiě)、網(wǎng)絡(luò)收發(fā)、進(jìn)程通信,幾乎所有需要輸入輸出的地方,都要用到流。
流是做什么用的呢?就是做輸入輸出用的。為什么輸入輸出要用“流”這種方式呢?因?yàn)槌绦蜉斎胼敵龅幕締挝皇亲止?jié),輸入就是獲取一串字節(jié),輸出就是發(fā)送一串字節(jié)。但是很多情況下,程序不可能接收所有的字節(jié)之后再進(jìn)行處理,而是接收一點(diǎn)處理一點(diǎn)。比方你下載魔獸世界,不可能全部下載到內(nèi)存里再保存到硬盤(pán)上,而是下載一點(diǎn)就保存一點(diǎn)。這時(shí),流這種方式就非常適合。
在 Java 中,每個(gè)流都是一個(gè)對(duì)象。流分為兩種:輸入流(InputStream)和輸出流(OutputStream)。對(duì)于輸入流,你只要從流當(dāng)中不停地把字節(jié)取出來(lái)就是了;而對(duì)于輸出流,你只要把準(zhǔn)備好的字節(jié)串傳給它就行。
流對(duì)象是怎么獲得的呢?不同的外部系統(tǒng),獲取流的方式也不同。例如,文件讀寫(xiě)就要?jiǎng)?chuàng)建 FileInputStream/FileOutputStream 對(duì)象,而網(wǎng)絡(luò)通信是通過(guò) Socket 對(duì)象來(lái)獲取輸入輸出流的。一般來(lái)說(shuō),如果一個(gè)類有 getInputStream() 或 getOutputStream() 這樣的方法,就表明它是通過(guò)流對(duì)象來(lái)進(jìn)行輸入輸出的。
InputStream 是輸入流,下面是一個(gè)通過(guò) InputStream 讀取文件的例子:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.FileNotFoundException; import java.util.Arrays; /** * 通過(guò)流讀取文件 */ public class ReadFileDemo { // 程序入口 public static void main(String[] args) { String path = "c:/boot.ini"; File file = new File(path); // 創(chuàng)建輸入流 InputStream is; try { is = new FileInputStream(file); } catch (FileNotFoundException e) { System.err.println("文件 " + path + " 不存在。"); return; } // 開(kāi)始讀取 byte[] content = new byte[0]; // 保存讀取出來(lái)的文件內(nèi)容 byte[] buffer = new byte[10240]; // 定義緩存 try { int eachTime = is.read(buffer); // 第一次讀取。如果返回值為 -1 就表示沒(méi)有內(nèi)容可讀了。 while (eachTime != -1) { // 讀取出來(lái)的內(nèi)容放在 buffer 中,現(xiàn)在將其合并到 content。 content = concatByteArrays(content, buffer, eachTime); eachTime = is.read(buffer); // 繼續(xù)讀取 } } catch (IOException e) { System.err.println("讀取文件內(nèi)容失敗。"); e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { // 這里的異常可以忽略不處理 } } // 輸出文件內(nèi)容 String contentStr = new String(content); System.out.println(contentStr); } /** * 合并兩個(gè)字節(jié)串 * * @param bytes1 字節(jié)串1 * @param bytes2 字節(jié)串2 * @param sizeOfBytes2 需要從 bytes2 中取出的長(zhǎng)度 * * @return bytes1 和 bytes2 中的前 sizeOfBytes2 個(gè)字節(jié)合并后的結(jié)果 */ private static byte[] concatByteArrays(byte[] bytes1, byte[] bytes2, int sizeOfBytes2) { byte[] result = Arrays.copyOf(bytes1, (bytes1.length + sizeOfBytes2)); System.arraycopy(bytes2, 0, result, bytes1.length, sizeOfBytes2); return result; } }
雖然寫(xiě)得很 主站蜘蛛池模板: 柳州市| 凤翔县| 周口市| 台东市| 建德市| 怀柔区| 瓮安县| 共和县| 五家渠市| 郑州市| 聊城市| 若尔盖县| 乌拉特后旗| 阿坝县| 宁海县| 方山县| 永兴县| 盘锦市| 绥中县| 大丰市| 商河县| 晋中市| 湖州市| 辽宁省| 宁都县| 宁化县| 浏阳市| 大方县| 三门峡市| 柳江县| 陈巴尔虎旗| 淮滨县| 嘉兴市| 剑河县| 永和县| 广东省| 郸城县| 旺苍县| 来凤县| 江永县| 称多县|