文档章节

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

c
 chenming
发布于 2014/04/24 14:43
字数 536
阅读 1068
收藏 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
223
0
JavaSE——数据类型流、内存流、打印流

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

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

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

HenrySun
2016/04/04
115
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的字符串字面量类型

转发TypeScript基础入门之高级类型的字符串字面量类型 高级类型 字符串字面量类型 字符串字面量类型允许你指定字符串必须的固定值。 在实际应用中,字符串字面量类型可以与联合类型,类型保护...

durban
24分钟前
2
0
iOS权限授权添加

<!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问相册</string> <!-- 相册写入 --> <key>NSPhotoLibraryAddUsageDescription</key> <string>App......

RainOrz
28分钟前
1
0
支配树(Dominator Tree)

MAT中的支配树 在使用MAT分析项目的内存泄漏问题时,其中有一个支配树(Dominator)视图。如果我们把Java对象之间的引用关系看做一张有向图(可以存在环)的话,对象的支配树体现了对象之间的...

akane_oimo
30分钟前
1
0
xshell官网下载及安装(免费版本)

百度搜索xshell,点击xshell官网下载链接,如图 然后点击下图的按钮 点击Latest Products,可以下载最新版本,选择要下载的版本,点击下载 选择上面红框里面的,并填写内容,submit之后会有邮...

曾大大胖
34分钟前
2
0
Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

兼容SDK 18以上的系统,直接调用系统分享功能,分享文本、图片、文件到第三方APP,如:微信、QQ、微博等 因为偷懒,可直达微信、朋友圈、QQ、QQ空间、微博的分享仅写了图片分享的,其他的文本...

她叫我小渝
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部