一個簡單易用的Java文本按行讀取類TextReader

1 前言

爲了降低耦合並提供強大的功能,Java提供了非常豐富多樣的Stream類,如InputStream, OutputStream, BufferedStream等。強大的功能同樣也是一把雙刃劍,給使用記憶帶來了很多麻煩,不是每個人都是天天使用Java的這些類,並把它們記得非常清楚。相信有很多和筆者一樣的人,每次在使用的時候,都需要查看相應的代碼。爲了解決這個問題,筆者根據常用的功能,編寫了一個簡易的Java類,TextReader 專門用於文本的按行讀取。

2 功能描述

這個類的主要就是按行讀取文件。文件讀取分爲三步,打開,讀取,關閉即可。
另外,爲了方便還提供了一個 readAllLines(file, charset) 函數,方便讀取所有行(其實用 java.nio.Files.readLines() 也可以)。

2.1 打開

打開是在新建的時候完成的,本類提供了2個構造函數,分別是

// 需要寫入的文件名
TextReader(String filename)
// 與上一個相比,增加了字符體,包括 US-ASCII,ISO-8859-1,UTF-8,UTF-16BE,UTF-16LE 和 UTF-16 
TextReader(String filename, String charset)

注意:由於是否是文件尾只有先讀一次才知道,所以在構造函數中有一次預計操作。

2.2 讀取

讀取行只提供了唯一的函數 readLine() 。同時提供了一個變量 EOF 用於判斷是否到文件尾。

2.3 關閉

每次讀取完成記得調用close()方法關閉打開的文件。

3 應用示例

	public static void main(String[] args) throws Exception {
		TextReader tr = new TextReader("D:\\data\\text.txt");
		while (!tr.EOF) {
			System.out.println(tr.readLine());
		}
		tr.close();
	}

4 源代碼

package utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

/**
 * 日期:2020/02/21
 * 作者:郝偉老師
 * 描述:提供了按行讀取一個文本文件的函數,同時支持不同編碼格式。
 * 
 */
public class TextReader {
	public boolean EOF;
	String filename;
	String cs;
	RandomAccessFile raf;
	String seperator;
	BufferedReader reader = null;
	String line = null;

	/**
	 * 從一個文本文件中讀取內容,默認編碼爲UTF8.
	 * 
	 * @param filepath 文件路徑。
	 * @throws IOException
	 */
	public TextReader(String filename) throws IOException {
		initialize(filename, null);
	}

	/**
	 * 從一個文本文件中讀取內容。
	 * 
	 * @param filepath 文件路徑。
	 * @param cs 編碼格式,可以使用StandardCharsets表示。
	 * @throws IOException
	 */
	public TextReader(String filename, String charset) throws IOException {
		initialize(filename, charset);
	}

	/**
	 * 初始化函數。
	 * @param filename 待打開的文件名。
	 * @param charset 文件集,默認爲utf-8
	 * @throws IOException
	 */
	private void initialize(String filename, String charset) throws IOException {
		this.filename = filename;
		this.cs = charset == null || charset.length() == 0 ? "utf-8" : charset;
		this.reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename), cs));
		this.line = reader.readLine();
		this.EOF = line == null; 
	}

	/**
	 * 讀取文件中的一行。
	 * @return
	 * @throws IOException
	 */
	public String readLine() throws IOException {
		String s = line;
		line = reader.readLine();
		EOF = line == null;
		return s;
	}

	/**
	 * 關閉當前文件。
	 * @throws IOException
	 */
	public void close() throws IOException {
		reader.close();
	}

	/**
	* 讀取指定文件的所有內容。
    * @param filename 待打開的文件名。
	* @param charset 文件集,默認爲utf-8
	*/
	public static String readAllLines(String filename, String charset) throws IOException{
		StringBuilder sb = new StringBuilder();
		TextReader tr = new TextReader(filename, charset);
		while (!tr.EOF) {
			sb.append(tr.readLine());
			sb.append("\r\n"); // Linux 可改成 '\n'
		}
		tr.close();
		return sb.toString();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章