Java進階篇(五)——Java的I/O技術
程式中,為了永久的儲存建立的資料,需要將其儲存在磁碟檔案中,以便在其它程式中使用它們。Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。
本篇我們要介紹的內容就是Java的I/O技術,即輸入/輸出。
一、輸入/輸出流
流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流。
而專門負責各種方式的輸入、輸出的類,都被放在java.io包中。所有輸入流都是抽象類InputStream(位元組輸入流)或抽象類Reader(字元輸入流)的子類;所有輸出流都是抽象類OutputStream(位元組輸出流)或抽象類Writer(字元輸出流)的子類。
1. 位元組輸入/輸出流
下面是一個位元組輸入/輸出流的例項。其中,第14行為從輸入流中讀取位元組並存入buffer陣列中,最長讀取2500個位元組,返回值b為實際讀取的長度。
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 5 public class IOExample { 6 public static void main(String[] args) { 7 try { 8 intb; 9 File file = new File("E:\\test.txt"); // 建立一個檔案 10 11 FileInputStream readfile = new FileInputStream(file); // 建立輸入流 12 13 byte buffer[] = new byte[2500]; // 建立位元組陣列 14 b = readfile.read(buffer, 1, 2000); // 1為buffer陣列中的起始偏移量15 String str = new String(buffer, 0, b, "Default"); 16 System.out.println(str); 17 readfile.close(); // 關閉流 18 19 FileOutputStream writefile = new FileOutputStream(file, true); // 建立一個輸出流,true為保留原有資料,新資料追加至結尾 20 writefile.write(buffer, 0, b); 21 writefile.close(); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 } 26 }
上述程式碼中的FileInputStream類和FileOutputStream類屬於檔案輸入輸出流,該類分別繼承自InputStream類和OutputStream類。
InputStream類常用方法需瞭解read()、close()、reset()等方法;OutputStream類常用方法需瞭解write()、flush()、close()等方法。具體可參照API。
2. 字元輸入/輸出流
下面是一個字元輸入/輸出流的例項。
1 import java.io.FileReader; 2 import java.io.FileWriter; 3 4 public class IOExample { 5 public static void main(String[] args) { 6 try { 7 FileReader fileread = new FileReader("E:\\test.txt"); // 字元輸入流,讀取檔案資訊 8 9 char[] cbuf = new char[500]; 10 int b = fileread.read(cbuf, 0, 500); 11 System.out.println(String.valueOf(cbuf)); 12 fileread.close(); 13 14 FileWriter filewriter = new FileWriter("E:\\test.txt", true); // 字元輸出流,向輸出流中寫入資訊,並且保留原有資料,追加資料值末尾處 15 filewriter.write(cbuf); 16 filewriter.close(); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 }
上述程式碼中的FileReader類和FileWriter類也屬於檔案輸入輸出流。
3. 檔案輸入/輸出流
上面的程式碼中出現了一個新的名詞叫檔案輸入/輸出流,也就是FileInputStream、FileOutputStream和FileReader、FileWriter。它們的作用是與指定的檔案建立連線,將需要的資料永久儲存到檔案中。
FileInputStream類和FileOutputStream類都是用來操作磁碟檔案的,如果使用者的檔案讀取比較簡單,則可使用該類。但由於漢字在檔案中佔用兩個位元組,讀取不好可能出現亂碼現象。
FileReader類和FileWriter類可避免亂碼現象,分別對應了FileInputStream類和FileOutputStream類。
二、File類
File類是io包中唯一代表磁碟檔案本身的物件,可以通過呼叫File類中的方法,實現建立、刪除、重新命名檔案等。
1. 檔案的建立與刪除
可以使用File類建立一個檔案物件,三種構造方法的語法格式如下:
new File(String pathname) new File(String parent, String child) new File(File f, String child)
pathname是路徑名稱,parent是父路徑字串,child是子路徑字串,f是父路徑物件。如下例:
File file = new File("E:/test.txt"); File file = new File("E:/myword","word.txt");
如果E:/myword目錄下沒有名稱為word的檔案,File類物件可通過createNewFile()方法建立一個名稱為word.txt的檔案;如果存在,可通過delete()方法將其刪除。
2. 獲取檔案資訊
File類提供了許多方法用於獲取檔案本身的一些資訊,下表是一些常用方法。
方法 | 說明 |
getName() | 獲取檔案的名稱 |
canRead() | 判斷檔案是否可讀 |
canWrite() | 判斷檔案是否可以被寫入 |
exist() | 判斷檔案是否存在 |
length() | 獲取檔案的長度 |
getAbsolutePath() | 獲取檔案的絕對路徑 |
getParent() | 獲取檔案的父路徑 |
isFile() | 判斷檔案是否存在 |
isDirectory() | 判斷檔案是否是一個目錄 |
isHidden() | 判斷檔案是否是隱藏檔案 |
lastModifed() | 獲取檔案最後修改時間 |
如我們建立一個檔案,獲取檔案長度等資訊如下:
1 import java.io.File; 2 3 public class FileTest { 4 5 public static void main(String[] args) { 6 File file = new File("E:/myword", "word.txt"); // 建立檔案物件 7 if(file.exists()) { // 判斷檔案是否存在 8 String name = file.getName(); // 獲取檔名稱 9 long length = file.length(); // 獲取檔案長度 10 boolean hidden = file.isHidden(); // 判斷檔案是否是隱藏檔案 11 12 System.out.println("檔名稱:" + name); 13 System.out.println("檔案長度是:" + length); 14 System.out.println("是否是隱藏檔案:" + hidden); 15 } else { 16 System.out.println("檔案不存在"); 17 } 18 } 19 20 }
三、帶快取的輸入/輸出流
快取是I/O的一種效能優化。快取流為I/O流增加了記憶體快取區。
1. BufferedInputStream類與BufferedOutputStream類
建構函式如下:
BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size) BufferedOutputStream(OutputStream in) BufferedOutputStream(OutputStream in, int size)
2. BufferedReader類與BufferedWriter類
常用方法如下:
方法 | 說明 |
read() | 讀取單個字元 |
readLine() | 讀取一個文字行,返回為字串;若無資料則返回為null |
write(String s, int off, int len) | 寫入字串的某一部分 |
flush() | 重新整理該流的快取 |
newLine() | 寫入一個行分隔符 |
這裡要注意,在使用BufferedWriter類的write()方法時,資料並沒有立刻被寫入到輸出流時,而是首先進入快取區中,如果想立刻將緩衝區中的資料寫入輸出流中,一定要呼叫flush()方法。
四、資料輸入/輸出流
資料輸入/輸出流為DataInputStream類與DateOutputStream類,允許應用程式以與機器無關的方式從底層輸入流中讀取基本Java資料型別。
構造方法如下:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
DataOutputStream類提供了以下三種寫入字串的方法:
writeBytes(String s)
writeChars(String s)
writeUTF(String s)
五、ZIP壓縮輸入/輸出流
利用ZipOutputStream類物件,可將檔案壓縮為.zip檔案。
建構函式如下:
ZipOutputStream(OutputStream out);
ZipInputStream類可讀取ZIP壓縮格式的檔案,包括對已壓縮和未壓縮條目的支援。
建構函式如下:
ZipInputStream(InputStream out);
相關推薦
Java進階篇(五)——Java的I/O技術
程式中,為了永久的儲存建立的資料,需要將其儲存在磁碟檔案中,以便在其它程式中使用它們。Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。 本篇我們要介紹的內容就是Java的I/O技術,即輸入/輸出。 一、輸入/輸出流 流是一組有序的資料序
Java多執行緒知識點總結——進階篇(五)之多執行緒下的單例模式
餓漢式 餓漢式多執行緒和單執行緒的程式碼是一樣的,如下: class Single { private static final Single s = new Single(); p
Java多執行緒之進階篇(二)
概述 1.基本原子類 1.1 AtomicBoolean 1.2 AtomicInteger和AtomicLong 2.引用原子類
Java多執行緒之進階篇(一)
一、執行緒池 1.1 執行緒池的建立 1.1.1 ThreadPoolExecutor 1.1.2 執行緒池的分類
Java多執行緒知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版
JDK1.5 中提供了多執行緒升級解決方案。 將同步 Synchronized 替換成現實 Lock 操作。 將Object中的 wait、notify、notifyAll,替換成了C
Java語言程式設計-進階篇(七)多執行緒與並行程式設計【上】
1.簡單的多執行緒例子package test; public class hello { public static void main(String args[]){ Runnable printA = new PrintChar('a',100);
Spring Boot學習進階筆記(五)-添加定時任務
imp 配置 ren 時間 report rate enable lin enables 一、在Spring [email protected]/* */,啟用定時任務的配置。@SpringBootApplication@EnableSchedulingpubl
Python進階內容(五)--- type和object的關系
行動 關系 函數 tex 進階 類模板 clas lin cnblogs 面向對象編程(OOP)的兩大關系 繼承與實現 繼承關系: 子類繼承自父類(base),可以使用父類的一些方法(method)和屬性(attribute) 實現關系: 以類為模板,實例化一個對
shell腳本進階篇(上)
col oss family 指定 -o for循環 用戶輸入 span 創建用戶 shell腳本是我們學習運維的難點,本篇內容簡單舉例shell腳本的進階上篇,有任何技術上的指導,知識上的不足都歡迎指出點明。 流程控制過程式編程語言: 順序執行 選擇執行 循環執行條
React學習筆記之react進階篇(1)
ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示
React學習筆記之react進階篇(2)
-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信 組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信
React進階篇(1) -- react-router4模組化
本篇內容: 單一的路由無巢狀 多層巢狀路由 獲取路徑中的引數 按需載入 單一的路由無巢狀 routers.js import Home from 'components/Home'; import News from 'components/News'; import
React進階篇(2) -- Redux
前言 如果還不知道為什麼要使用Redux,說明你暫時還不需要它。 三大原則 單一資料來源 整個應用的 state 被儲存在一棵 object tree 中,並且這個 object tree 只存在於唯一一個 store 中。 State 是隻讀的 唯一改變 state 的方法就是觸發 action
軟體測試進階篇(經驗)
出來做軟體測試三,四年了,確實正應了那句“測試不如開發”,只是個人觀點,而且我工作過都是外企和大型國有企業,軟體測試流程和管理都相對很規範化的。 下面幾點給做測試的朋友參考一下: 1、錢肯定少過開發人員,除非你工作七,八年才能拿年薪10W以上,一般的軟體測試工程師很
SODBASE CEP學習進階篇(二)續:日誌採集-Logstash、Kafka和CEP整合
相比Flume,筆者更推薦使用Logstash做日誌採集,見SODBASE CEP學習進階篇(二)續:日誌採集-Logstash、Kafka和CEP整合。如果之前專案中已經選型使用Flume,則本文供參考。 1. 啟動CEP模型 啟動CEP Server ./catalina
SODBASE CEP學習進階篇(七)續:SODBASE CEP與Spark streaming整合-低延遲規則管理 與分散式快取整合
在實際大資料工作中,常常有實時監測資料庫變化或實時同步資料到大資料儲存,解決大資料實時分析的需求。同時,增量同步資料庫資料相比全量查詢也減少了網路頻寬消耗。本文以Mysql的bin-log到Kafka為例,使用Canal Server,通過SODBASE引擎不用寫程式就可以設定資料同步規則。
Tensorflow(2):MNIST識別自己手寫的數字--進階篇(CNN)
本文利用卷積神經網路(CNN)實現自己手寫的數字識別。主要參考自Tensorflow中文社群官方教程【Minst進階】 1.卷積神經網路簡介 卷積神經網路是一種多層神經網路,擅長處理影象特別是大影象的相關機器學習問題。 卷積網路通過一系列方法
SODBASE CEP學習進階篇(二):日誌採集-Flume
在IT系統運維和效能監控中,常常需要對日誌進行分析,得到系統的故障點或效能瓶頸。採用現成的日誌分析軟體,通常著重於監測節點和網路狀態,幾乎都難以滿足大型應用系統對故障點或效能瓶頸分析的要求。 舉幾個例子: (1)找出故障的上下層呼叫的關係,定位應用層故障對應的底層介面 (
linux shell script 進階篇(1)--如何打造功能強大的函式?
函式不管在那個程式語言中都有舉足輕重的地位,在linux shell script中當然也不例外,下面我們就一起學習如何打造出功能強大的函式。 1.如何在script中建立一個函式,可以用以下兩種方式: A. function name { commands } B.
SODBASE CEP學習進階篇(六):實現反壓和流限速
前面文章介紹過流資料輸入速率要和處理能力相匹配,短時資料爆發由內部緩衝佇列來緩衝。如果確實存在某個時間點持續資料爆發,可以考慮採取反壓限流的方法。 1. 示例操作步驟 (1)下載SODBASE Studio2.0.22(sp1)以上版本,解壓,開啟configuration