Java4Android自學記錄(22-2):java中的I/O

道阻且長,行則將至。埋頭苦幹,不鳴則已,一鳴驚人!加油,騷年!

目錄及資源索引

  Java4Android自學過程目錄及資源索引

1 大文件的讀寫方法

  實際中使用 read 方法可以把讀取到的數據放到 buffer 中;目前字節流,數組長度都是固定的,不過無論長度爲多少,我們在寫/讀的時候,都有個盡頭。這樣我們就可以一點一點讀取,需要用到循環來讀取,類似之前學的 C++ 的環形緩衝區。

  字節換算方法再次熟悉如下:

1G = 1024M = 1024 * 1024 K = 1024 * 1024 * 1024 B

  循環思路:每讀取一次,都會返回讀到多少個字節;最後一次,讀取數據已經讀完了,那 read 方法會返回一個什麼值?當數據讀取完之後,會返回 -1 ;

  那麼此時我們就可以定義一個循環,當返回值爲 -1 時,就停止,否則就一直執行。

  話不多說,上代碼

import java.io.*;	// 導入類

class Test 
{
	public static void main(String args[])
	{
		// 聲明輸入流引用
		FileInputStream fis = null;
		
		// 聲明輸出流的引用
		FileOutputStream fos = null;
		
		try
		{
			// 生成代表輸入流的對象
			fis = new FileInputStream("from.txt");
			
			// 生成代表輸出流的對象
			fos = new FileOutputStream("to.txt");
			
			// 生成一個字節數組
			byte [] buffer = new byte[1024];
			while(true)
			{
				// 調用輸入流對象的read方法,讀取數據
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
					break;	// 如果讀取完畢,就跳出
				}
				
				// 讀出來多少數據,就寫進去多少數據
				fos.write(buffer, 0, temp);				
				
			}
			
			// 把數組內的數據,還原爲字符
			// String s = new String(buffer);
			
			// 將會去除掉這個字符串的首尾空格和空字符
			// s = s.trim();
			
			// System.out.println(s);
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
		
	}
}

  上述程序編譯後,運行結果如下:
image-20200530122337884

  運行後,什麼結果都沒有,不過這是因爲我們沒有加打印,此時沒有結果就是最好的結果,我們去看文件夾中的內容:
image-20200530122437465

  不過此時上述代碼還是不完整的,不知道你有沒有發現,我們在打開文件,使用完畢之後,沒有關閉文件的相關操作,此時操作肯定是有漏洞的,參考我們之前的經驗,應該在 finally 中,加上關閉文件的操作,這樣的好處是,總是能執行到關閉文件這一步操作,修改後的代碼如下:

import java.io.*;	// 導入類

class Test 
{
	public static void main(String args[])
	{
		// 聲明輸入流引用
		FileInputStream fis = null;
		
		// 聲明輸出流的引用
		FileOutputStream fos = null;
		
		try
		{
			// 生成代表輸入流的對象
			fis = new FileInputStream("from.txt");
			
			// 生成代表輸出流的對象
			fos = new FileOutputStream("to.txt");
			
			// 生成一個字節數組
			byte [] buffer = new byte[1024];
			while(true)
			{
				// 調用輸入流對象的read方法,讀取數據
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
					break;	// 如果讀取完畢,就跳出
				}
				
				// 讀出來多少數據,就寫進去多少數據
				fos.write(buffer, 0, temp);				
				
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
		finally
		{
			fis.close();
			fos.close();
		}
	}
}

  此時編譯運行一下,結果如下:
image-20200530122913138

  我們可以很清楚的看到,拋出異常錯誤,解決方法就是:必須對其進行捕獲或聲明以便拋出,也就是我們必須要再加上一層 try…catch… 語句,如下:

import java.io.*;	// 導入類

class Test 
{
	public static void main(String args[])
	{
		// 聲明輸入流引用
		FileInputStream fis = null;
		
		// 聲明輸出流的引用
		FileOutputStream fos = null;
		
		try
		{
			// 生成代表輸入流的對象
			fis = new FileInputStream("from.txt");
			
			// 生成代表輸出流的對象
			fos = new FileOutputStream("to.txt");
			
			// 生成一個字節數組
			byte [] buffer = new byte[1024];
			while(true)
			{
				// 調用輸入流對象的read方法,讀取數據
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
					break;	// 如果讀取完畢,就跳出
				}
				
				// 讀出來多少數據,就寫進去多少數據
				fos.write(buffer, 0, temp);				
				
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
		finally
		{
			try
			{
				fis.close();
				fos.close();
			}
			catch(Exception e)
			{
				System.out.println(e);
			}			
		}
	}
}

  此時運行結果如下,會發現沒有任何輸出,同樣的,沒有輸出就是最好的結果
image-20200530123228227

2 字符流的使用方法

  根據字面意思,就是在讀寫文件時,以字符爲基礎;

  字符流的基本格式如下:

// 字符輸入流:Reader	FileReader
int read(char [] c, int off, int len)

// 字符輸出流:Writer	FileWriter
int write(char [] c, int off, int len)

  下面以實際代碼爲例,如下:

import java.io.*;

public class TestChar
{
	public static void main(String args[])
	{
		FileReader fr = null;
		FileWriter fw = null;
		
		try
		{
			fr = new FileReader("from.txt");
			fw = new FileWriter("to.txt");
			
			// 字符流 生成char類型的
			char [] buffer = new char[100];	
			int temp = fr.read(buffer, 0, buffer.length);
			
			for(int i = 0; i < buffer.length; i++)
			{
				System.out.println(buffer[i]);
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
		finally
		{
			
		}
	}
}

  上述代碼,編譯運行後的結果如下:
image-20200530123746830

  會發現下邊有好多空的,此時我們沒有轉換爲字符串,而是直接打印數組中的結果,因此沒有屏蔽結尾的換行等字符,因此就會出現這種結果。

3 總結

  1. 對於比較大的文件的讀寫,先創建一個數組,數組小於文件大小,使用一個循環,然後用循環寫入另外一個文件,什麼時候停呢?條件爲假的時候,什麼時候爲假?讀完之後,read返回 -1 。
  2. 簡單瞭解了字節流、字符流的使用方法,特性等;
  3. 還需繼續努力呀!

如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,留個讚唄,您的點贊就是對我最大的鼓勵,謝謝您嘞!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章