`
sharewind
  • 浏览: 156685 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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

阅读更多

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 {

	/**
	 * 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();
			}
		}
	}
}
 
分享到:
评论
1 楼 jiiming 2014-05-26  
在第一个方法里面,第39行返回的时候,流是否需要关闭一下?

相关推荐

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

    本文将介绍三种读取Java文件到byte数组的方法,供开发者参考。 ### 方法一:传统IO方式 这种方法是最常见的读取文件的方式,使用`FileInputStream`、`BufferedInputStream`和`ByteArrayOutputStream`组合实现。 `...

    java中两个byte数组实现合并的示例

    在Java编程语言中,有时我们需要将两个或多个字节数组(`byte`数组)合并成一个新的单一数组。这种情况在处理二进制数据、文件读写或者与硬件交互时尤其常见。本文将深入探讨如何在Java中实现两个`byte`数组的合并,...

    Java byte数组与其他类型转换

    本文将深入探讨如何在Java中将byte数组与其他基本类型(如short、int、long)进行转换,这些转换在处理二进制数据、网络通信或序列化等方面至关重要。 首先,我们来看byte数组与short之间的转换。在Java中,byte...

    Java将图片转换为byte数组例子总结

    ### Java将图片转换为byte数组及反向转换的知识点总结 #### 一、知识点概述 在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,...

    float转byte数组测试小工具

    本工具“float转byte数组测试小工具”专注于将浮点数(float)转换为字节数组,这是一种在计算机内存中表示和传输数值的常用方式。在Java、C++、C#等编程语言中,这种转换尤其重要,因为它们使用不同的数据结构来...

    手机移动开发将byte数组写入文件的JAVA代码

    ### 手机移动开发将byte数组写入文件的JAVA代码详解 #### 一、知识点概述 在移动开发领域,特别是Android或J2ME等平台上,经常需要处理数据的读写操作,比如将从网络获取的数据保存到本地文件系统中。本篇文章主要...

    拼接byte数组

    在文件读取和网络通信中,我们可能会遇到分块的数据,比如在处理大文件时,可能会先读取一部分数据到`byte`数组,然后再读取另一部分,最后需要将这些部分合并。`read_struct`这样的命名可能暗示我们在处理结构化的...

    字节数组流byte文件

    标题“字节数组流byte文件”中涉及的概念是字节数组流(byte array stream),这是一种在计算机程序中处理二进制数据的方式。字节数组流通常用于在内存中传输和接收字节数据,尤其在处理文件、图片、PDF、Excel或...

    java基本类型与byte数组互相转换

    ### Java基本类型与Byte数组互相转换 在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等...

    java中把对象转化为byte数组的方法.pdf

    Java 是一种 popular 的编程语言,它提供了多种方式来将对象转换为 byte 数组和将 byte 数组转换回对象。这种转换对于数据存储、网络传输和序列化非常重要。本文将介绍 Java 中将对象转换为 byte 数组的方法和将 ...

    byte数组转化为hex

    在Java编程中,将字节数组转换为16进制字符串是一项常见的任务,尤其是...了解这些概念对于处理二进制数据至关重要,特别是在网络编程、文件读写和数据序列化等场景中。希望以上内容能帮助你更好地理解和应用这些知识。

    基于java中byte数组与int类型的转换(两种方法)

    在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能...

    取指定字节数组中的子数组 一个很好类例子

    在实际项目中,这种从字节数组中提取子数组的操作非常常见,特别是在处理网络协议、文件读写、序列化或反序列化数据时。每个类都可能根据其职责和上下文,以不同的方式利用这些基本的数组操作。不过,由于没有具体的...

    浅谈java的byte数组的不同写法

    在Java中,有几种不同的方式来初始化和表示byte数组,如下所述: 1. **二进制表示**: 我们可以用二进制数来初始化byte数组。例如,`byte[] aa = {00010110, 01010010, 10111000};` 这里每个数字都是一个8位的二...

    Java byte数组操纵方式代码实例解析

    "Java byte数组操纵方式代码实例解析" 本文主要介绍了Java byte数组操纵方式代码实例解析,通过示例代码详细介绍了Java byte数组的操纵方式,涵盖了字节数组的基本概念、字节数组的操作方法、ByteArrayInputStream...

    android bitmap通过byte数组以流的形式创建

    1. **读取字节数组**:首先,你需要获取到图片的byte数组。这可能来自于网络请求、文件读取或者本地存储。 ```java byte[] imageData = ... // 获取到的字节数组 ``` 2. **设置BitmapFactory.Options**:为了高效...

    Java 图片与byte数组互相转换实例

    在Java编程中,处理图像数据时,有时需要将图片转换为byte数组,或者将byte数组恢复为图片。这在文件传输、数据库存储或网络通信等场景中非常常见。本文将详细讲解如何在Java中实现图片与byte数组之间的转换。 首先...

    php字符串与byte字节数组转化类.zip

    介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...

    java中把对象转化为byte数组的方法.doc

    通过上述介绍,我们可以了解到Java中对象与byte数组之间的相互转换是实现对象序列化的一种常见方式。掌握了这一技能后,可以在多种应用场景中灵活运用,比如在网络传输数据、保存对象状态等方面。同时,也需要注意...

    全面了解java byte数组与文件读写

    `byte`数组是Java中存储二进制数据的基本方式,非常适合处理文件,因为文件本质上都是由二进制数据构成的。 首先,我们来看第一个获取文件内容的方法,通过`FileInputStream`类实现。这段代码首先创建了一个`File`...

Global site tag (gtag.js) - Google Analytics