首页 > 编程 > Java > 正文

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

2019-11-26 13:57:20
字体:
来源:转载
供稿:网友

读取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		&& (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_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();			}		}	}}

以上这篇读取Java文件到byte数组的三种方法(总结)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表