1. 程式人生 > >Java進階篇(五)——Java的I/O技術

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             int
b; 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學習筆記之react1

ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state   state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示

React學習筆記之react2

-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信   組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信  

React1 -- react-router4模組化

本篇內容: 單一的路由無巢狀 多層巢狀路由 獲取路徑中的引數 按需載入 單一的路由無巢狀 routers.js import Home from 'components/Home'; import News from 'components/News'; import

React2 -- 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引擎不用寫程式就可以設定資料同步規則。

Tensorflow2: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