Java操作文字檔的方法詳解

來源:互聯網
上載者:User

 

 

最初java是不支援對文字檔的處理的,為了彌補這個缺憾而引入了Reader和Writer兩個類,這兩個類都是抽象類別,Writer中 write(char[] ch,int off,int
length),flush()和close()方法為抽象方法,Reader中read(char[] ch,int off,int length)和close()方法是抽象方法。子類應該分別實現他們。
  當我們讀寫文字檔的時候,採用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的類是InputStreamReader,
它是位元組轉換為字元的橋樑。你可以在構造器重指定編碼的方式,如果不指定的話將採用底層作業系統的預設編碼方式,例如GBK等。當使用FileReader讀取檔案
的時候。

其中read()方法返回的是讀取得下個字元。當然你也可以使用read(char[] ch,int off,int length)這和處理二進位檔案的時候類似,不多說了。如果使用
InputStreamReader來讀取檔案的時候
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
這和FileReader並沒有什麼區別,事實上在FileReader中的方法都是從InputStreamReader中繼承過來的。read()方法是比較好費時間的,如果為了提高效率
我們可以使用BufferedReader對Reader進行封裝,這樣可以提高讀取得速度,我們可以一行一行的讀取文本,使用readLine()方法。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
當你明白了如何用Reader來讀取文字檔的時候那麼用Writer寫檔案同樣非常簡單。有一點需要注意,當你寫檔案的時候,為了提高效率,寫入的資料會先
放入緩衝區,然後寫入檔案。因此有時候你需要主動調用flush()方法。

不要忘記用完後關閉流!具體代碼:

public class TxtOprDemo {<br />public static void main(String[] args) throws IOException {</p><p>// 使用FileReader讀取檔案<br />FileReader fr = new FileReader("ming.txt");<br />int ch = 0;<br />// read()方法返回的是讀取得下個字元<br />while ((ch = fr.read()) != -1) {<br />System.out.print((char) ch);<br />}</p><p>// InputStreamReader來讀取檔案,和FileReader並沒有什麼區別<br />InputStreamReader isr = new InputStreamReader(new FileInputStream(<br />"ming.txt"));<br />while ((ch = isr.read()) != -1) {<br />System.out.print((char) ch);<br />}</p><p>// 使用BufferedReader對Reader進行封裝,這樣可以提高讀取得速度<br />BufferedReader br = new BufferedReader(new InputStreamReader(<br />new FileInputStream("ming.txt")));<br />String data = null;<br />// 一行一行的讀取文本,使用readLine()方法<br />while ((data = br.readLine()) != null) {<br />System.out.println(data);<br />}</p><p>FileWriter fw = new FileWriter("hello.txt");<br />String s = "hello world";<br />fw.write(s, 0, s.length());<br />// 當寫檔案的時候,為了提高效率,寫入的資料會先放入緩衝區,然後寫入檔案。因此需要主動調用flush()方法。<br />fw.flush();</p><p>OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(<br />"hello2.txt"));<br />osw.write(s, 0, s.length());<br />// 當寫檔案的時候,為了提高效率,寫入的資料會先放入緩衝區,然後寫入檔案。因此需要主動調用flush()方法。<br />osw.flush();</p><p>PrintWriter pw = new PrintWriter(new OutputStreamWriter(<br />new FileOutputStream("hello3.txt")), true);<br />pw.println(s);</p><p>// 關閉流<br />fr.close();<br />isr.close();<br />br.close();<br />fw.close();<br />osw.close();<br />pw.close();<br />}<br />}

 

 

java中多種方式讀檔案
一、多種方式讀檔案內容。
1、按位元組讀取檔案內容
2、按字元讀取檔案內容
3、按行讀取檔案內容
4、隨機讀取檔案內容

 

public class ReadFromFile {<br />/**<br /> * 以位元組為單位讀取檔案,常用於讀二進位檔案,片、聲音、影像等檔案。<br /> *<br /> * @param fileName<br /> * 檔案的名<br /> */<br />public static void readFileByBytes(String fileName) {<br />File file = new File(fileName);<br />InputStream in = null;<br />try {<br />System.out.println("以位元組為單位讀取檔案內容,一次讀一個位元組:");<br />// 一次讀一個位元組<br />in = new FileInputStream(file);<br />int tempbyte;<br />while ((tempbyte = in.read()) != -1) {<br />System.out.write(tempbyte);<br />}<br />in.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />return;<br />}</p><p>try {<br />System.out.println("以位元組為單位讀取檔案內容,一次讀多個位元組:");<br />// 一次讀多個位元組<br />byte[] tempbytes = new byte[100];<br />int byteread = 0;<br />in = new FileInputStream(fileName);<br />ReadFromFile.showAvailableBytes(in);<br />// 讀入多個位元組到位元組數組中,byteread為一次讀入的位元組數<br />while ((byteread = in.read(tempbytes)) != -1) {<br />System.out.write(tempbytes, 0, byteread);<br />}<br />} catch (Exception e1) {<br />e1.printStackTrace();<br />} finally {<br />if (in != null) {<br />try {<br />in.close();<br />} catch (IOException e1) {<br />}<br />}<br />}<br />}<br />/**<br /> * 以字元為單位讀取檔案,常用於讀文本,數字等類型的檔案<br /> *<br /> * @param fileName<br /> * 檔案名稱<br /> */<br />public static void readFileByChars(String fileName) {<br />File file = new File(fileName);<br />Reader reader = null;<br />try {<br />System.out.println("以字元為單位讀取檔案內容,一次讀一個位元組:");<br />// 一次讀一個字元<br />reader = new InputStreamReader(new FileInputStream(file));<br />int tempchar;<br />while ((tempchar = reader.read()) != -1) {<br />// 對於windows下,rn這兩個字元在一起時,表示一個換行。<br />// 但如果這兩個字元分開顯示時,會換兩次行。<br />// 因此,屏蔽掉r,或者屏蔽n。否則,將會多出很多空行。<br />if (((char) tempchar) != 'r') {<br />System.out.print((char) tempchar);<br />}<br />}<br />reader.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />try {<br />System.out.println("以字元為單位讀取檔案內容,一次讀多個位元組:");<br />// 一次讀多個字元<br />char[] tempchars = new char[30];<br />int charread = 0;<br />reader = new InputStreamReader(new FileInputStream(fileName));<br />// 讀入多個字元到字元數組中,charread為一次讀取字元數<br />while ((charread = reader.read(tempchars)) != -1) {<br />// 同樣屏蔽掉r不顯示<br />if ((charread == tempchars.length)<br />&& (tempchars[tempchars.length - 1] != 'r')) {<br />System.out.print(tempchars);<br />} else {<br />for (int i = 0; i < charread; i++) {<br />if (tempchars[i] == 'r') {<br />continue;<br />} else {<br />System.out.print(tempchars[i]);<br />}<br />}<br />}<br />}<br />} catch (Exception e1) {<br />e1.printStackTrace();<br />} finally {<br />if (reader != null) {<br />try {<br />reader.close();<br />} catch (IOException e1) {<br />}<br />}<br />}<br />}<br />/**<br /> * 以行為單位讀取檔案,常用於讀面向行的格式檔案<br /> *<br /> * @param fileName<br /> * 檔案名稱<br /> */<br />public static void readFileByLines(String fileName) {<br />File file = new File(fileName);<br />BufferedReader reader = null;<br />try {<br />System.out.println("以行為單位讀取檔案內容,一次讀一整行:");<br />reader = new BufferedReader(new FileReader(file));<br />String tempString = null;<br />int line = 1;<br />// 一次讀入一行,直到讀入null為檔案結束<br />while ((tempString = reader.readLine()) != null) {<br />// 顯示行號<br />System.out.println("line " + line + ": " + tempString);<br />line++;<br />}<br />reader.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />} finally {<br />if (reader != null) {<br />try {<br />reader.close();<br />} catch (IOException e1) {<br />}<br />}<br />}<br />}<br />/**<br /> * 隨機讀取檔案內容<br /> *<br /> * @param fileName<br /> * 檔案名稱<br /> */<br />public static void readFileByRandomAccess(String fileName) {<br />RandomAccessFile randomFile = null;<br />try {<br />System.out.println("隨機讀取一段檔案內容:");<br />// 開啟一個隨機訪問檔案流,按唯讀方式<br />randomFile = new RandomAccessFile(fileName, "r");<br />// 檔案長度,位元組數<br />long fileLength = randomFile.length();<br />// 讀檔案的起始位置<br />int beginIndex = (fileLength > 4) ? 4 : 0;<br />// 將讀檔案的開始位置移到beginIndex位置。<br />randomFile.seek(beginIndex);<br />byte[] bytes = new byte[10];<br />int byteread = 0;<br />// 一次讀10個位元組,如果檔案內容不足10個位元組,則讀剩下的位元組。<br />// 將一次讀取的位元組數賦給byteread<br />while ((byteread = randomFile.read(bytes)) != -1) {<br />System.out.write(bytes, 0, byteread);<br />}<br />} catch (IOException e) {<br />e.printStackTrace();<br />} finally {<br />if (randomFile != null) {<br />try {<br />randomFile.close();<br />} catch (IOException e1) {<br />}<br />}<br />}<br />}<br />/**<br /> * 顯示輸入資料流中還剩的位元組數<br /> *<br /> * @param in<br /> */<br />private static void showAvailableBytes(InputStream in) {<br />try {<br />System.out.println("當前位元組輸入資料流中的位元組數為:" + in.available());<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />}<br />public static void main(String[] args) {<br />String fileName = "C:/temp/newTemp.txt";<br />ReadFromFile.readFileByBytes(fileName);<br />ReadFromFile.readFileByChars(fileName);<br />ReadFromFile.readFileByLines(fileName);<br />ReadFromFile.readFileByRandomAccess(fileName);<br />}<br />}

 

 

二、將內容追加到檔案尾部

 

public class AppendToFile {<br />/**<br /> * A方法追加檔案:使用RandomAccessFile<br /> *<br /> * @param fileName<br /> * 檔案名稱<br /> * @param content<br /> * 追加的內容<br /> */<br />public static void appendMethodA(String fileName, String content) {<br />try {<br />// 開啟一個隨機訪問檔案流,按讀寫方式<br />RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");<br />// 檔案長度,位元組數<br />long fileLength = randomFile.length();<br />// 將寫檔案指標移到檔案尾。<br />randomFile.seek(fileLength);<br />randomFile.writeBytes(content);<br />randomFile.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />}<br />/**<br /> * B方法追加檔案:使用FileWriter<br /> *<br /> * @param fileName<br /> * @param content<br /> */<br />public static void appendMethodB(String fileName, String content) {<br />try {<br />// 開啟一個寫檔案器,建構函式中的第二個參數true表示以追加形式寫檔案<br />FileWriter writer = new FileWriter(fileName, true);<br />writer.write(content);<br />writer.close();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />}<br />public static void main(String[] args) {<br />String fileName = "C:/temp/newTemp.txt";<br />String content = "new append!";<br />// 按方法A追加檔案<br />AppendToFile.appendMethodA(fileName, content);<br />AppendToFile.appendMethodA(fileName, "append end. n");<br />// 顯示檔案內容<br />ReadFromFile.readFileByLines(fileName);<br />// 按方法B追加檔案<br />AppendToFile.appendMethodB(fileName, content);<br />AppendToFile.appendMethodB(fileName, "append end. n");<br />// 顯示檔案內容<br />ReadFromFile.readFileByLines(fileName);<br />}<br />}

 

 

三、讀位元組檔案到位元組數組

public class ReadFileToByteArray {<br />// 返迴文件位元組到位元組數組<br />public static byte[] getBytesFromFile(File file) throws IOException {<br />InputStream is = new FileInputStream(file);<br />// 獲得檔案長度<br />long length = file.length();<br />// 不能使用類型為long的數組<br />// 需要為int型<br />// 在轉換成一個int型前必須確保檔案尺寸大於 Integer.MAX_VALUE.<br />if (length > Integer.MAX_VALUE) {<br />// 檔案尺寸若太大<br />}<br />// 建立位元組數組儲存資料<br />byte[] bytes = new byte[(int) length];<br />// 讀取位元組<br />int offset = 0;<br />int numRead = 0;<br />while (offset < bytes.length<br />&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {<br />offset += numRead;<br />}<br />// 確保所有位元組被讀取<br />if (offset < bytes.length) {<br />throw new IOException("Could not completely read file "<br />+ file.getName());<br />}<br />// 關閉輸入資料流,返回位元組<br />is.close();<br />return bytes;<br />}<br />}

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.