读取Java文件到byte数组的三种方法(总结)

网友投稿 208 2023-07-08


读取Java文件到byte数组的三种方法(总结)

读取java文件到byte数组的三种方法(总结)

package zs;

import java.io.BufferedInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.nio.ByteBuffer;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

import java.nio.channels.FileChannel.MapMode;

public class FileUtils {

public byte[] getContent(String filePath) throws IOException {

File file = new File(filePath);

long fileSize = file.length();

if (fileSize > Integer.MAX_VALUE) {

System.out.println("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

XstIAbPut && (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;

}

/**

* the traditional io way

*

* @param filename

* @return

* @throws IOException

*/

public static byte[] toByteArray(String filename) throws IOException {

File f = new File(filename);

if (!f.exists()) {

throw new FileNotFoundException(filename);

}

ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());

BufferedInputStream in = null;

try {

in = new BufferedInputStream(new FileInputStream(f));

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 {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

bos.close();

}

}

/**

* NIO way

*

* @param filename

* @return

* @throws IOException

*/

public static byte[] toByteArray2(String filename) throws IOException {

File f = new File(filename);

if (!f.exists()) {

throw new FileNotFoundException(filename);

}

FileChannel channel = null;

FileInputStream fs = null;

try {

fs = new FileInputStream(f);

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 (IOException e) {

e.printStackTrace();

throw e;

} finally {

try {

channel.close();

} catch (IOException e) {

e.printStackTrace();

}

try {

fs.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* Mapped File way MappedByteBuffer 可以在处理大文件时,提升性能

*

* @param filename

* @return

* @throws IOException

*/

public static byte[] toByteArray3(String filename) throws IOException {

FileChannel fc = null;

try {

fc = new RandomAccessFile(filename, "r").getChannel();

MappedByteBuffer byteBuffer = fc.map(MapMode.READ_http://ONLY, 0,

fc.size()).load();

System.out.println(byteBuffer.isLoaded());

byte[] result = new byte[(int) fc.size()];

if (byteBuffer.remaining() > 0) {

// System.out.println("remain");

byteBuffer.get(result, 0, byteBuffer.remaining());

}

return result;

} catch (IOException e) {

e.printStackTrace();

throw e;

} finally {

try {

fc.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:全面了解java byte数组与文件读写
下一篇:Java利用Zxing生成二维码的简单实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~