package ;
import .*;
import ;
import ;
import ;
public final class FileReaderUtils {
/**
* 小文件读取,一次buffer缓冲,将全部文件内容读出,若不能一次读出则throw IOException,不执行数据读取操作。
*
* @param fileFullName 文件读取全路径名称
* @return
*/
public static byte[] readOnce(String fileFullName) throws IOException {
// open the file
File file = new File(fileFullName);
return readOnce(file);
}
/**
* 小文件读取,一次buffer缓冲,将全部文件内容读出,若不能一次读出则throw IOException,不执行数据读取操作。
*
* @param file
* @return
*/
public static byte[] readOnce(File file) throws IOException {
//check the file is Exists
checkFileExists(file);
// check the file is too long, if the file length is too long ,returned. because the byte array can not buffered.
// byte array bufferSize=,and must between 0 and Integer_MAX_VALUE
if (() > Integer.MAX_VALUE) {
("file is too big ,not to read !");
throw new IOException(() + " is too big ,not to read ");
}
int _bufferSize = (int) ();
//定义buffer缓冲区大小
byte[] buffer = new byte[_bufferSize];
FileInputStream in = null;
try {
in = new FileInputStream(file);
int len = 0;
if ((len = ()) <= ) {
(buffer, 0, len);
}
} finally {
closeInputStream(in);
}
return buffer;
}
public static byte[] readByByteArrayOutputStream(File file) throws IOException {
checkFileExists(file);
// 传统IO方式
//1、定义一个Byte字节数组输出流,设置大小为文件大小
//2、将打开的文件输入流转换为Buffer输入流,循环 读取buffer输入流到buffer[]缓冲,并将buffer缓冲数据输入到目标输出流。
//3、将目标输出流转换为字节数组。
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) ());
BufferedInputStream bin = null;
try {
bin = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
while ((buffer) > 0) {
(buffer);
}
return ();
} finally {
closeInputStream(bin);
closeOutputStream(bos);
}
}
public static byte[] readByNIO(File file) throws IOException {
checkFileExists(file);
//1、定义一个File管道,打开文件输入流,并获取该输入流管道。
//2、定义一个ByteBuffer,并分配指定大小的内存空间
//3、while循环读取管道数据到byteBuffer,直到管道数据全部读取
//4、将byteBuffer转换为字节数组返回
FileChannel fileChannel = null;
FileInputStream in = null;
try {
in = new FileInputStream(file);
fileChannel = ();
ByteBuffer buffer = ((int) ());
while ((buffer) > 0) {
}
return ();
} finally {
closeChannel(fileChannel);
closeInputStream(in);
}
}
public static byte[] readRandomAccess(File file) throws IOException {
//1、使用RandomAccessFile打开文件管道
//2、创建MappedByteBuffer,并使用NIO管道进行数据映射,加载数据到物理内存
//3、读取数据到byte数组中。
FileChannel channel = new RandomAccessFile(file, "r").getChannel();
int fileSize = (int) ();
try {
//load(): 将此缓冲区的内容加载到物理内存中。此方法尽最大努力确保当它返回时,缓冲区的内容驻留在物理内存中。调用此方法可能会导致出现一些页面错误和I/O操作。
MappedByteBuffer buffer = (.READ_ONLY, 0, fileSize).load();
//remaining() 返回当前位置和限制之间的元素数。此缓冲区中剩余的元素数
byte[] result = new byte[fileSize];
if (() > 0) {
(result, 0, fileSize);
}
();
return result;
} finally {
closeChannel(channel);
}
}
private static void checkFileExists(File file) throws FileNotFoundException {
if (file == null || !()) {
("file is not null or exist !");
throw new FileNotFoundException(());
}
}
private static void closeChannel(FileChannel channel) {
try {
();
} catch (IOException e) {
();
}
}
private static void closeOutputStream(OutputStream bos) {
try {
();
} catch (IOException e) {
();
}
}
private static void closeInputStream(InputStream in) {
try {
();
} catch (IOException e) {
();
}
}
}