Java中的IO流
------- android培訓、java培訓、期待與您交流! ----------
在之前的時候我已經接觸過C#中的IO流,也就是說集中數據固化的方式之一,那么我們今天來說一下java中的IO流。
首先,我們學習IO流就是要對文件或目錄進行一系列的操作,那么怎樣操作文件或目錄呢?這就用到了File類,一個強大的對象,它既可表示文件,又可以表示目錄。在程序中,利用File可以對文件進行基本的操作,比如說查看文件名稱,文件大小等等。
創建一個File對象的句法如下:
File file = new File(String path);
在該類創建的時候,通過構造函數傳遞path,path表示所指向的文件路徑名。例如,"File file = new File("C://Hello.txt");"就創建了一個指向C盤根目錄下名為Hello的txt文件的對象。注意,在windows操作系統中,路徑名中的分隔符可以用"/",或者用"/",但是必須要寫成"http://"其中第一個代表轉義字符。File對象是java.io包中引用磁盤文件的唯一對象,File類僅僅是描述File對象的屬性,而并未說明數據是如何存儲的。File類提供了一些重要的方法來管理文件或目錄的屬性,下面來個大家一一列舉:

我只是列舉出一些File類的常用方法,他還有很多其他的方法,在需要用到的時候大家可以自行查看API,好了,廢話不多少直接上代碼,看看File類是如何獲取文件屬性的:
public static void main(String[] args) { File file = new File("D://Hello.txt"); if(file.exists()){ System.out.這樣我們就進行了一系列簡單的File類的操作,在這里要提一下,可能有很多初學IO流的人還不是很明白相對路徑與絕對路徑的區別,可是我們要通過文件流老操作文件就要清楚的知道文件的位置,也就是要清楚的給出路徑來讓程序找到他,那么什么是相對路徑與絕對路徑呢?現在我們先來看一下絕對路徑,絕對路徑就是你當前計算機下文件所在的位置,也就是我們通常在瀏覽文件的時候上方地址欄上給出的路徑就是絕對路徑,也就是不倫你做什么程序,是找文件也好是導圖片也要,只要你寫的是絕對路徑,并且是在你的本機上操作那就是絕對沒有問題的,可是這樣我們也看出了他的缺點,我們寫出來的程序都是要給別人用的,要在很多電腦上顯示,這樣你再用絕對路徑的話就會出現找不到該文件或者我們常說的圖裂了,那么這時候就要用到相對路徑了,相對路徑就是相對于你自身這個程序或者執行程序的文件的路徑,簡單說也就是你的代碼寫在哪個文件里就相對于哪個文件,這樣不管我們的放在什么地方,只要他的相對位置沒有變就不會出錯。另外,我們用"../"來表示上一層目錄,"../../"來表示山商城目錄,以此類推。
我們簡單的說了一下文件的查看,下面我們來看看文件或目錄的創建等一系列操作:
public static void main(String[] args) { //通過剛剛的演示,我們已經刪除了該文件 File file = new File("D://Hello.txt"); try { if(file.createNewFile()){ System.out.println("文件創建成功"); } } catch (IOException e) { e.printStackTrace(); } File directory = new File("D://通過file創建"); if(directory.mkdirs()){ System.out.println("目錄創建成功"); } }通過兩段簡單的代碼我們學習了java中對文件的基本操作,下面我們來進行今天的重點,IO流那么流是什么呢?我們來看一下官方對于流的定義:流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。而在java中,我們處理數據的類型不同又分為字符流和字節流,數據的流向不同我們又分為了輸出流和輸入流。
了解了一下流的定義,我們直接來看代碼,下面這段代碼是一段輸入流,也就是通過FileInputStream來讀取文件中的數據:
public static void main(String[] args) { //在使用inputStream的時候很多地方都要拋出異常,所以我們在外部定義 //一個為空的流,方便使用 InputStream input = null; try { input = new FileInputStream("D://Hello.txt"); int data = 0; byte[] b = new byte[input.available()]; for (int i = 0; (data = input.read()) != -1; i++) { b[i] = (byte) data; } String name = new String(b); System.out.println(name); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { input.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }因為inputStream的read方法返回值是int類型,所以我們循環每次讀到的數據都是int類型,因為編碼方式原因,如果我們文件里的數據漢字漢字的話,我們通過(char)int強制轉換就會出現亂碼,所以要先將數據保存在byte數組里,再通過newString(byte[])來進行轉換。
通過代碼我們可以看出inputStream讀取文件的核心方法就是read()方法,那么同樣的OutputStream的寫入文件方法就是write():
public static void main(String[] args) { // 代碼中沒有太大的改動,在存入文件時同樣是存入byte數組 OutputStream output = null; try { output = new FileOutputStream("D://Hello.txt"); String str = "好好學習天天向上"; byte[] b = str.getBytes(); output.write(b); System.out.println("數據寫入成功"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }這樣就完成了文件讀寫,還有一種便是帶緩沖區的方法,通過BufferedReader和BufferedWriter來讀寫文件,這種方法可以先把一批數據放到緩沖區,接下來的操作都是通過緩沖區獲得,可以提高操作效率,與上面方法沒有太大的改動,就不一一列舉。還要提一下的就是二進制文件的讀寫,我們知道在計算機中所有的東西都是二進制的存在形式,也就是說這種二進制的讀寫基本可以讀寫全部文件,圖片或電影,下面我們就來寫一個復制圖片的例子來給大家一個直觀的感受:
public static void main(String[] args) { DataOutputStream dos = null; DataInputStream dis = null; try { //創建輸入流 InputStream input = new FileInputStream("D://cat.jpg"); dis = new DataInputStream(input); //創建輸出流 OutputStream output = new FileOutputStream("D://mao.jpg"); dos = new DataOutputStream(output); int num = 0; while ((num=dis.read())!=-1) { dos.write(num); } System.out.println("復制成功"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { dos.close(); dis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }這樣就完成了圖片的復制,java的IO流還有許多nice的方法,望大家多提建議!
新聞熱點
疑難解答