源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-09-16 18:42 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:读取Java文件到byte数组的三种方法(总结)
[b]读取Java文件到byte数组的三种方法(总结)[/b]
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数组的三种方法(总结)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部