在實際工作中, 我們需要讀取一些報表之類的數據文件, 這些文件一般可以是.dat .txt 格式的 , 那麼如何讀取呢?
下面案例以 .txt 爲例.
package wxy.IO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
/**
* @author wxy e-mail:[email protected]
* @date 創建時間:2017年5月22日 下午3:59:26
* @version 1.0
* @company: xxx科技公司
* @description: InputStreamReader 是字節流向字符流轉換的橋樑\ 這個類是按照格式pattern解析
* txt格式文件中的數據. ps: 其實讀取其他數據格式文件也是類似的, 比如要讀取.dat文件.
* */
public class ReadTXT {
/**
* 在這裏進行測-
* @param args
*/
public static void main(String[] args) {
File file = new File(
"E:/wxy-workspace/space01/wxy/resources/222.txt");
//注意: 這裏的file路徑自己可以爲了測試, 隨便變化的, 寫一個測試文件全路徑即可
List<List<Object>> arr = parseTxt(file, "\\.");
System.out.println(arr);
}
/**
* 注意, 此類進行解析, 是按照gbk默認編碼進行解析, 因爲InputStreamReader的轉換編碼就是GBK
* @param file
* 爲解析文件的路徑
* @param pattern
* 解析格式 注意pattern的輸入,是否是轉義字符來解析的, 如果是, 注意正確的輸入,因爲split()方法支持正則表達式
* @return
*/
public static List<List<Object>> parseTxt(File file, String pattern) {
String fileName = file.getName(); // testFile.txt
if (! StringUtils.isNotEmpty(fileName)) {
System.out.println("輸入參數file錯誤, 必須精確到文件名.txt後綴全路徑才行");
return null;
}
// System.out.println(fileName);
// 獲取後綴名 如果後綴名沒有 . 則返回""
String houZhui = fileName.lastIndexOf(".") == -1 ? "" : fileName
.substring(fileName.lastIndexOf(".") + 1) ;
List<List<Object>> listRows = null;//用於返回使用
if ("txt".equals(houZhui)) {
BufferedReader bf = null;
String temp = null;
try {
//注意:inputStreamReader是一個字節流向字符流轉換的橋樑
// bf = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
FileInputStream fis = new FileInputStream(new File(file, ""));
/** 注意: 我這裏吧GBK編碼格式寫死了, 具體工作中, 需要看txt文件的編碼格式, 如果是windows系統默認, 那就是
* GBK, 如果是其他的, 那可以改成utf-8,
* */
bf = new BufferedReader(new InputStreamReader(fis, "GBK"));//從這一句可以看出, 這裏可以指定
//InputStreamReader的編碼格式.
listRows = new ArrayList<List<Object>>();//用於返回使用
while ((temp = bf.readLine()) != null) {
if (temp.replaceAll(" ", "").length() > 0) {
String[] arr = temp.split(pattern);
List<Object> row = new ArrayList<Object>();
for (String string : arr) {//循環遍歷上面的數組
row.add(string);
}
listRows.add(row);
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("txt文件讀取失敗");
}finally{
//在返回之前關閉流
if (bf != null) {
try {
bf.close();
} catch (IOException e2) {
//添加日誌文件吧
}
}
}
}else{
System.out.println("發生異常: 文件的後綴名不是以.txt結尾的");
return null;
}
return listRows;
}
}