道阻且長,行則將至。埋頭苦幹,不鳴則已,一鳴驚人!加油,騷年!
目錄及資源索引
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);
}
}
}
上述程序編譯後,運行結果如下:
運行後,什麼結果都沒有,不過這是因爲我們沒有加打印,此時沒有結果就是最好的結果,我們去看文件夾中的內容:
不過此時上述代碼還是不完整的,不知道你有沒有發現,我們在打開文件,使用完畢之後,沒有關閉文件的相關操作,此時操作肯定是有漏洞的,參考我們之前的經驗,應該在 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();
}
}
}
此時編譯運行一下,結果如下:
我們可以很清楚的看到,拋出異常錯誤,解決方法就是:必須對其進行捕獲或聲明以便拋出,也就是我們必須要再加上一層 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);
}
}
}
}
此時運行結果如下,會發現沒有任何輸出,同樣的,沒有輸出就是最好的結果
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
{
}
}
}
上述代碼,編譯運行後的結果如下:
會發現下邊有好多空的,此時我們沒有轉換爲字符串,而是直接打印數組中的結果,因此沒有屏蔽結尾的換行等字符,因此就會出現這種結果。
3 總結
- 對於比較大的文件的讀寫,先創建一個數組,數組小於文件大小,使用一個循環,然後用循環寫入另外一個文件,什麼時候停呢?條件爲假的時候,什麼時候爲假?讀完之後,read返回 -1 。
- 簡單瞭解了字節流、字符流的使用方法,特性等;
- 還需繼續努力呀!
如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,留個讚唄,您的點贊就是對我最大的鼓勵,謝謝您嘞!