首页 > 编程语言 >Java文件与byte数组

Java文件与byte数组

时间:2023-12-21 15:23:57浏览次数:34  
标签:Java java filename IOException 数组 import new byte

读取Java文件到byte数组的三种方式

一、FileUtils.java
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 {

/**
*
* @param filePath
* @return
* @throws IOException
*/
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();
}

}

}

}
文章知识点与官方知识档案匹配,可进一步学习相关知识
————————————————
版权声明:本文为CSDN博主「Tzq@2018」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tttzzzqqq2018/article/details/132613467

/**
* 将字节数组写入文件
* byte[] byteArray 这里是你的字节数组
* @param filename "文件路径/文件名"
* */
public static void byteArrayToFile(byte[] byteArray,String filename)
{

  // 这里是你的字节数组

//byte[] byteArray =null;
FileOutputStream outputStream = null;

try {
  outputStream = new FileOutputStream(filename);//"文件路径/文件名"
  outputStream.write(byteArray);
} catch (IOException e) {
  e.printStackTrace();
} finally {
  if (outputStream != null) {
    try {
      outputStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
}

}

//使用Java的FileOutputStream类将字节数组写入到一个文件中。
//在代码中,首先定义了一个字节数组byteArray。
// 然后,创建了一个FileOutputStream对象,将要写入的文件路径和文件名传递给它。
// 接下来,使用write()方法将字节数组写入到文件中。
// 最后,一定要关闭输出流以释放资源。
// 如果出现任何异常,可以在catch块中捕获并处理它们。

// 作者:lcf
// 链接:https://www.zhihu.com/question/583443292/answer/2888746618
// 来源:知乎
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:Java,java,filename,IOException,数组,import,new,byte
From: https://www.cnblogs.com/qingzhen/p/17919128.html

相关文章

  • 火山引擎ByteHouse基于云原生架构的实时导入探索与实践
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群随着企业降本增效、智能化数据决策需求的增强,传统的商业数据库已经难以满足和响应快速增长的业务诉求。在此背景下,云原生数据库成为大势所趋。云原生数据库基于云平台构建、部署和分发,具有高可用......
  • 《Java架构师的第一性原理》31分布式计算之微服务RPC(Dubbo)
    1 互联网架构,究竟为啥要做服务化互联网架构,究竟为啥要做服务化?2 微服务架构,多“微”才合适?微服务架构,多“微”才合适? 3 离不开的微服务架构,脱不开的RPC细节离不开的微服务架构,脱不开的RPC细节3.1服务化解决的问题1)服务化需要解决的问题:一套序列化、反序列化、网络框......
  • 《Java架构师的第一性原理》30分布式计算之分布式算法
    极客时间 韩健 121.分布式协议与算法实战00 开篇词|想成为分布式高手?那就先把协议和算法烂熟于心吧为什么要单独讲分布式协议和算法呢?在我看来,它其实就是决定分布式系统如何运行的核心规则和关键步骤。如果一个人想真正搞懂分布式技术,开发出一个分布式系统,最先需要掌握的......
  • 《Java架构师的第一性原理》32分布式计算之分布式缓存第3篇LevelDB
    互联网业务,绝大部分场景,会使用缓存服务。但有时候,确实会使用到进程内存缓存/数据库,这个时候,LevelDB就能派上用场了。啥是LevelDB?LevelDB是Google开发的,一个速度非常块的KV存储库(storagelibrary),它支持字符串的key与字符串的value,并且这种映射关系按key排序(orderedmapping)。L......
  • 《Java架构师的第一性原理》32分布式计算之分布式缓存第1篇如何使用Redis搭建玩家排行
    今天我们用Redis搭建一个玩家的排行榜,假设一个服务器存储了10万名玩家的数据,我们想给这个区(这台服务器)上的玩家做个全区的排名,该如何用Redis实现呢?不妨一起来思考下面几个问题:MySQL是如何实现玩家排行榜的?有哪些难题需要解决?如何用Redis模拟10万名玩家数据?Redis里......
  • 《Java架构师的第一性原理》33分布式计算之分布式注册中心、分布式配置中心
    待补充1分布式注册中心2分布式配置中心2.1Apollo2.1.1Apollo是怎样注入到SpringBean的容器里的   99直接读这些牛人的原文apollo不使用MQ如何实现pub/sub场景?13张图彻底搞懂分布式系统服务注册与发现原理为什么@Value可以获取配置中心的值?Spring8:一些......
  • 《Java架构师的第一性原理》32分布式计算之分布式锁(Redis、Zookeeper)
    1 这才是真正的分布式锁技术领域,我觉得了解来龙去脉,了解本质原理,比用什么工具实现更重要:(1)进程多线程如何互斥?(2)一个手机上两个APP访问一个文件如何互斥?(3)分布式环境下多个服务访问一个资源如何互斥?归根结底,是利用一个互斥才能访问的公共资源来实现分布式锁,具体这个公共资源是r......
  • 大学四年自学Java编程,现在拿到28万年薪的offer,还是觉得挺值的
    最近刚拿到美团的Java后端工程师的offer,(底薪、奖金、补贴、年终奖、五险一金)总包加在大概有28万的年薪,实际到手不会有这么多,但是我对于这个待遇还是非常满意的。说来还是非常的感慨,我属于那种从大一到大四一直都泡在图书馆学习的学生,因为家庭条件很一般,然后自己的思想也要比同龄人......
  • 转行自学Java没后悔,我的经历证明,改变永远没有错
    我在北京工作6年,现在年薪42万(仅代表个人收益),目前在搜狐畅游工作,参与过轩辕剑的项目研发,有几个大型项目实战的经历,不过最后这几款项目都失败了。我之所以选择当初学习Java,就一个原因,一个破二本学历,没有好的学校背景,没有深厚的家庭背景,没有好的社会资源,我就只能选择做IT技术,因为这是......
  • class071 子数组最大累加和问题与扩展-下【算法】
    class071子数组最大累加和问题与扩展-下【算法】code1152.乘积最大子数组//乘积最大子数组//给你一个整数数组nums//请你找出数组中乘积最大的非空连续子数组//并返回该子数组所对应的乘积//测试链接:https://leetcode.cn/problems/maximum-product-subarray/因为有......