文档章节

重复制造轮子之——字节数组写入文件

c
 chenming
发布于 2014/04/24 14:43
字数 536
阅读 1100
收藏 2

FilesGuava 中的一个工具类,它主要提供以下功能

Provides utility methods for working with files.

这里我们只关注它的两个方法:

  • byte[] toByteArray(File file) Reads all bytes from a file into a byte array

  • void write(byte[] from,File to) Overwrites a file with the contents of a byte array.

第一个方法将文件中全部内容读入到一个字节数组。在Android设备上应注意读取的文件大小,太大的文件可能引起OOM

第二方法将字节数组的内容写入到文件中(会覆盖原有内容)

经常使用到这两个方法,所以自己也实现了一份,加入自己的工具库

/**
 * 将字节数组写入文件
 * 
 * @param bytes
 * @param to
 * @return
 */
public static void write(byte[] from, File to) {
	if (from == null) {
		throw new NullPointerException("bytes is null");
	}
	if (to == null) {
		throw new NullPointerException("file is null");
	}

	BufferedOutputStream bos = null;

	try {
		bos = new BufferedOutputStream(new FileOutputStream(to));
		bos.write(from);
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		closeQuietly(bos);
	}
}

/**
 * 小文件(不超过1MB)转成字节数组
 * 
 * @param file
 * @return
 * @throws IllegalArgumentException
 *             待转换的文件超过 1MB
 */
public static byte[] toBytes(File file) {
	if (file == null || file.exists() == false) {
		return EMPTY_BYTES;
	}

	final long size = 1 * _1M;
	final long fileLen = file.length();
	if (fileLen > size) {
		throw new IllegalArgumentException("file length exceeds " + size
				+ " B");
	}

	ByteArrayOutputStream baos = new ByteArrayOutputStream((int) fileLen);

	int len = -1;
	byte[] buf = new byte[4 * 1024];
	FileInputStream fis = null;
	try {
		fis = new FileInputStream(file);
		while (-1 != (len = fis.read(buf))) {
			baos.write(buf, 0, len);
		}
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		closeQuietly(fis);
	}

	return baos.toByteArray();
}

/**
 * 关闭流
 * 
 * @param stream
 */
public static void closeQuietly(Closeable stream) {
	if (stream != null) {
		try {
			stream.close();
		} catch (IOException e) {
			// ignore
		}
	}
}

测试代码如下

public void testFile() throws Exception {
	sdcardMounted();

	File testFile = new File(sdcard(), "test.html");
	// guava Files.write(byte[], File)
	Files.write("我是cm".getBytes(), testFile);

	// guava Files.toByteArray(File)
	byte[] bytes = Files.toByteArray(testFile);
	assertEquals("我是cm", new String(bytes));

	// 自己的实现 IOUtils.toBytes(File)
	bytes = IOUtils.toBytes(testFile);
	assertEquals("我是cm", new String(bytes));
}

public void testFile2() throws Exception {
	sdcardMounted();

	File testFile = new File(sdcard(), "test2.html");
	// 自己的实现 IOUtils.write(byte[], File)
	IOUtils.write("我是cm".getBytes(), testFile);

	byte[] bytes = Files.toByteArray(testFile);
	assertEquals("我是cm", new String(bytes));
}

© 著作权归作者所有

共有 人打赏支持
c
粉丝 2
博文 59
码字总数 24719
作品 0
南宁
私信 提问
Java IO 之 FileInputStream & FileOutputStream源码分析

Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket 一、引子 文件,作为常见的数据源。关于操作文件的字节流就是 — FileInputS...

泥沙砖瓦浆木匠
2015/10/09
813
0
IO流

一、IO流 1、概述:IO流用来处理设备之间的数据传输(读写,复制) 2、分类: 按照流向分:输入流(读数据),输出流(写数据); 按照数据类型:字节流,字符流 字节输入流:InputStream(抽象类) ---...

走了丶
2017/08/17
0
0
Java程序员从笨鸟到菜鸟之(六)I/O流操作

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者...

长平狐
2012/11/12
227
0
JavaSE——数据类型流、内存流、打印流

班级编号:VIP17 学员名字:小吴 课程名称:JAVASE 数据类型流 DataOutputStream是数据类型输出流,它能把基本数据类型直接写入到文件里; DataInputStream是数据类型输入输流,它能把基本数...

凯哥学堂
2018/05/07
0
0
java基础学习总结——IO流

一、JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文件里面存放着各种各样的数...

HenrySun
2016/04/04
115
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
2
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
6
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
3
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部