Java处理文件需要用到IO流来进行操作,本文提供了以字节、字符、行、随机读取四种方式;
以字节的方式以String返回文件所有内容;
以行进行读取,通过dealLine函数,在子类中延时进行处理,设计模式中的模板方法模式;
以字符和随机读取,均为设计返回,可自行更改。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
/**
* 文件工具类
* 如需一次性返回文件所有内容,直接使用readFileByBytes(fileName)方法,如文件内容过多可能会出现内存溢出异常
* 如需进行行处理,需继承此类,并在子类中实现dealLine(line, context)方法
*/
public abstract class FileReadUtil {
private static final Logger LOG = LoggerFactory.getLogger(FileReadUtil.class);
/**
* 以字节为单位读取文件内容,一次读多个字节
* @param fileName
* @return
*/
public static String readFileByBytes(String fileName) {
File file = new File(fileName);
InputStream in = null;
StringBuffer sb = new StringBuffer();
//判断文件是否存在
if (file.isFile() && file.exists()) {
// 一次读多个字节
byte[] tempbytes = new byte[1024];
int byteread = 0;
try {
in = new FileInputStream(file);
// 读入多个字节到字节数组中,byteread为一次读入的字节数
while ((byteread = in.read(tempbytes)) != -1) {
String str = new String(tempbytes, 0, byteread);
sb.append(str);
}
return sb.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
LOG.info("找不到指定的文件,请确认文件路径是否正确");
}
return null;
}
/**
* 以字符为单位读取文件,常用于读文本,数字等类型的文件
*/
public static void readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
try {
// 一次读多个字符
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
// 读入多个字符到字符数组中,charread为一次读取字符数
while ((charread = reader.read(tempchars)) != -1) {
// 同样屏蔽掉\r不显示
if ((charread == tempchars.length)
&& (tempchars[tempchars.length - 1] != '\r')) {
System.out.print(tempchars);
} else {
for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r') {
continue;
} else {
System.out.print(tempchars[i]);
}
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 文件行处理方法
* @param line
* @param context
*/
public abstract void dealLine(int line, String context);
/**
* 以行为单位读取文件,常用于读面向行的格式化文件
*/
public void readFileByLines(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
dealLine(line, tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 随机读取文件内容
*/
public static void readFileByRandomAccess(String fileName) {
RandomAccessFile randomFile = null;
try {
// 打开一个随机访问文件流,按只读方式
randomFile = new RandomAccessFile(fileName, "r");
// 文件长度,字节数
long fileLength = randomFile.length();
// 读文件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
// 将读文件的开始位置移到beginIndex位置。
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
// 一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
// 将一次读取的字节数赋给byteread
while ((byteread = randomFile.read(bytes)) != -1) {
System.out.write(bytes, 0, byteread);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (randomFile != null) {
try {
randomFile.close();
} catch (IOException e1) {
}
}
}
}
}