Java基礎知識回顧之六 ----- IO流


前言

上一篇文章中,回顧了Java的多線程。而在本篇文章中主要介紹Java IO的相關知識。

IO的介紹

什么是IO?

IO的名稱又來是Input與Output的縮寫,也就是輸入流和輸出流。輸入流用於從源讀取數據,輸出流用於向目標寫數據。

可以從下列示例圖來了解IO流:

IO流使用

IO流對文件的操作主要分為字符流和字節流。

字符流

字符流有兩個抽象類:WriterReader類。
其對應子類FileWriterFileReader可實現文件的讀寫操作。
BufferedWriterBufferedReader能夠提供緩沖區功能,用以提高效率。

我記得在開始學習Java不久的時候, 在教程中會使用 字符流來進行字符的讀取和寫入。比較常見的就是,運行一個main方法,然后再控制台輸入字符,獲取輸入的字符做一些邏輯控制之類。
例如: 在控制台輸入字符,輸入quit退出,輸入其它的字符打印。

代碼示例:

	public static void main(String[] args)  {
		try {
			test();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void test() throws IOException {
		  String str;
		    // 使用 System.in 創建 BufferedReader 
		    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		    System.out.println("輸入字符, 輸入 'quit' 退出。");
		    // 讀取字符
		    do {
		       str=br.readLine();
		       System.out.println("您輸入的字符是:"+str);
		    } while(!str.equals("quit"));
			 br.close();
	}

然后我們輸入 helloquit
結果如下:

輸入字符, 輸入 'quit' 退出。
hello
您輸入的字符是:hello
您輸入的字符是:
quit
您輸入的字符是:quit

通過上述示例我們可以簡單的了解下了字符流。
一般來說,我們主要用字符流的情況是讀寫文件,大部分也是文本文件,比如.txt后綴的。這里我們也順便介紹下如何使用。

代碼示例:

	/**
	 *
	 * 寫入和讀取文件
	 * @throws IOException
	 */
	private static void test2() throws IOException {
		//創建要操作的文件路徑和名稱  
        String path ="E:/test/hello.txt";
        String str="hello world";
        FileWriter fw = new FileWriter(path);  
        fw.write(str);  
        fw.close();  
        
        FileReader fr = new FileReader(path);  
        StringBuffer sb=new StringBuffer();
  		while(fr.ready()){
  			sb.append((char)fr.read());
  		}
        System.out.println("輸出:"+sb.toString());
        fr.close();
	}

注:如果在不同的系統上運行,可以使用 File.separator方法,該方法表示系統的分隔符。

輸出結果:

輸出:hello word

上述代碼示例中,我們使用FileWriterFileReader 這兩個類對文件進行讀寫,雖然可以實現字符的寫入和讀取,但是效率並不高,因為是對磁盤的直接讀寫。一般對於文件的讀寫,我們會使用緩沖。使用緩沖的好處就像 倒垃圾一樣,將垃圾進行整理堆積,然后到了一定的規模在丟棄,而不是有一點垃圾就倒一次。

那么在上述的代碼中加上BufferedWriterBufferedReader類來進行緩沖。

代碼示例:

	/**
	 * 寫入和讀取文件
	 * @throws IOException
	 */
	private static void test3() throws IOException {
		//創建要操作的文件路徑和名稱  
        String path ="E:/test/hello.txt";
        String str="你好!";
        FileWriter fw = new FileWriter(path);  
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write(str);  
        bw.close();
        fw.close();  
        
        FileReader fr = new FileReader(path);  
        BufferedReader br=new BufferedReader(fr);
        StringBuffer sb=new StringBuffer();
  		while(br.ready()){
  			sb.append((char)br.read());
  		}
        System.out.println("輸出:"+sb.toString());
        br.close();
        fr.close();
	}

注:需要注意的是關閉的順序,先關閉緩沖,再關閉文件。

字節流

字節流也有兩個抽象類:InputStreamOutputStream類。
其對應子類有FileInputStreamFileOutputStream實現文件讀寫操作。
BufferedInputStreamBufferedOutputStream提供緩沖區功能

字節流也能對文本進行讀取,但是它的主要使用的場景是讀取無法直接獲取文本信息的二進制文件,比如音樂文件、視頻文件、圖片文件等等。
這里我們依舊對文件進行讀取和寫入,不過我們把之前寫入到hello.txt文件的內容加上 '你好' 寫入到新的文件中。由於這里使用的了中文,所以需要設置相應的編碼。

代碼示例:

 /**
	 * 創建一個文件並讀取記錄 
	 * @throws IOException
	 */
	private static void test4() throws IOException {
		String path="E:/test/hello.txt";
		String path2="E:/test/你好.txt";
		String str="你好!";
		//從文件讀取數據
		InputStream input = new FileInputStream(path);
		InputStreamReader reader = new InputStreamReader(input, "UTF-8");
	    StringBuffer sb=new StringBuffer();
		while(reader.ready()){
			sb.append((char)reader.read());
		}
		
		input.close();
		reader.close();
		
		//創建一個文件並向文件中寫數據
		OutputStream output = new FileOutputStream(path2);
		OutputStreamWriter writer = new OutputStreamWriter(output, "UTF-8");
		writer.write(sb+str);
		
		writer.close();
		output.close();
		
		//從文件讀取數據
		InputStream input2 = new FileInputStream(path2);
		InputStreamReader reader2 = new InputStreamReader(input2, "UTF-8");
	    StringBuffer sb2=new StringBuffer();
		while(reader2.ready()){
			sb2.append((char)reader2.read());
		}
		System.out.println("輸出:"+sb2);
		input2.close();
		reader2.close();
	}	

結果:

	輸出:hello world你好!

可以看到結果符合我們的預期。

File

學習IO流中,我們也會接觸File類。
File類中主要是對文件夾的一些操作。比如,文件夾的創建、刪除、查看等等。
這里我們就簡單的介紹下File類的相關使用,還是使用代碼配合注釋來進行說明。

代碼示例:

private static void test5() throws IOException {
		String path="E:/test/test2";
		String path2="E:/test/test3/test3";
		String path3="E:/test/test2/test2.txt";
		File f = new File(path);
		File f2 = new File(path2);
		File f3 = new File(path3);
		//創建文件夾
		System.out.println("="+f.mkdir());
		//創建文件夾和所有父文件夾
		System.out.println("=="+f2.mkdirs());
		//創建一個文本
		System.out.println("==="+f3.createNewFile());
		//獲取名稱
		System.out.println("==="+f3.getName());
		//獲取父級名稱
		System.out.println("==="+f3.getParent());
		//獲取當前路徑
		System.out.println("==="+f3.getPath());
		//判斷是否是目錄
		System.out.println("=="+f2.isDirectory());
		System.out.println("==="+f3.isDirectory());
		//刪除該文件
		System.out.println("==="+f3.delete());	
}	

輸出結果:

=true
==true
===true
===test2.txt
===E:\test\test2
===E:\test\test2\test2.txt
==true
===false
===true

關於File類的相關只是簡單的介紹了下,具體的使用還需要配置實際的場景。需要注意的是,在進行文件創建和刪除的時候,需要先判斷是否存在,否則將拋出異常。

其它

到此,本文就結束了,謝謝閱讀!歡迎留言和點贊,你的支持是我寫作最大的動力!

版權聲明:
作者:虛無境
博客園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm    
個人博客出處:http://www.panchengming.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM