1、FileInputStream
/**
*
* <p>Title: getContent</p>
* <p>Description:根据文件路径读取文件转出byte[] </p>
* @param filePath文件路径
* @return 字节数组
* @throws IOException
*/
public static byte[] getContent(String filePath) throws IOException {
File file = new File(filePath);
long fileSize = file.length();
if (fileSize > Integer.MAX_VALUE) {
logger.info("file too big...");
return null;
}
FileInputStream fi = new FileInputStream(file);
byte[] buffer = new byte[(int) fileSize];
int offset = 0;
int numRead = 0;
while (offset < buffer.length
&& (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
offset += numRead;
}
// 确保所有数据均被读取
if (offset != buffer.length) {
throw new IOException("Could not completely read file "
+ file.getName());
}
fi.close();
return buffer;
}
2、ByteArrayOutputStream和BufferedInputStream传统的IO
/**
*
* <p>Title: toByteArray</p>
* <p>Description: 传统的IO流方式</p>
* @param filename
* @return
* @throws IOException
*/
public static byte[] toByteArray(String filename) throws IOException {
File file = new File(filename);
if (!file.exists()) {
throw new FileNotFoundException(filename);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
int buf_size = 1024;
byte[] buffer = new byte[buf_size];
int len = 0;
while (-1 != (len = in.read(buffer, 0, buf_size))) {
bos.write(buffer, 0, len);
}
return bos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
try {
bos.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
bos.close();
}
}
3、NIO
/**
*
* <p>Title: toByteArrayNIO</p>
* <p>Description: NIO way</p>
* @param filename
* @return
* @throws IOException
*/
public static byte[] toByteArrayNIO(String filename) throws IOException {
File file = new File(filename);
if (!file.exists()) {
throw new FileNotFoundException(filename);
}
FileChannel channel = null;
FileInputStream fs = null;
try {
fs = new FileInputStream(file);
channel = fs.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
while (channel.read(byteBuffer) > 0) {
// do nothing
// System.out.println("reading");
}
return byteBuffer.array();
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4、RandomAccessFile和MappedByteBuffer读取大文件
/**
*
* <p>Title: toByteArrayMapped</p>
* <p>Description: 读取大文件</p>
* @param filename
* @return
* @throws IOException
*/
public static byte[] toByteArrayMapped(String filename) throws IOException {
FileChannel fc = null;
RandomAccessFile rf=new RandomAccessFile(filename, "r");
try {
// fc = new RandomAccessFile(filename, "r").getChannel();
fc = rf.getChannel();
MappedByteBuffer mappedByteBuffer = fc.map(MapMode.READ_ONLY, 0, fc.size()).load();
logger.info("{}", mappedByteBuffer.isLoaded());
byte[] result = new byte[(int) fc.size()];
if (mappedByteBuffer.remaining() > 0) {
// System.out.println("remain");
mappedByteBuffer.get(result, 0, mappedByteBuffer.remaining());
}
return result;
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
try {
rf.close();
fc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}