File转byte数组,对比

1、BIO方式

    /**
     * 将文件转换成byte数组
     * @param filePath
     * @return
     */
    public static byte[] File2byteBIO(File tradeFile){
        byte[] buffer = null;
        try(FileInputStream fis = new FileInputStream(tradeFile);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();){
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1){
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return buffer;
    }

2、BIO-Buffered

    public static byte[] File2byteBuffered(File tradeFile){
    	byte[] buffer = null;
    	try(FileInputStream fis = new FileInputStream(tradeFile);
        		ByteArrayOutputStream bos = new ByteArrayOutputStream();
        		BufferedOutputStream bb = new BufferedOutputStream(bos); ){
    		byte[] b = new byte[1024];
    		int n;
    		while ((n = fis.read(b)) != -1){
    			bb.write(b, 0, n);
    		}
    		fis.close();
    		bos.close();
    		buffer = bos.toByteArray();
    	}catch (FileNotFoundException e){
    		e.printStackTrace();
    	}catch (IOException e){
    		e.printStackTrace();
    	}
    	return buffer;
    }

3、NIO-拼接数组方式

    public static byte[] File2byteNIO(File tradeFile){
            byte[] retval = null;  
            try(FileInputStream fileInputStream = new FileInputStream(tradeFile);) {  
                FileChannel inChannel = fileInputStream.getChannel();  
                ByteBuffer buf = ByteBuffer.allocate(1024);  
                int byteRead = inChannel.read(buf);  
                int readLength = 0;  
                while (byteRead != -1){  
                    buf.flip();  
                    byte[] tempval = null;  
                    //以下代码划重点!!!!!!!!  
                    if (retval == null){  
                        retval = new byte[byteRead];  
                    }else{  
                        tempval = retval;  
                        readLength = tempval.length;  
                        retval = new byte[readLength+byteRead];  
                        System.arraycopy(tempval, 0, retval, 0, tempval.length);  
                    }  
                    int i = readLength;  
                    while (buf.hasRemaining()){  
                        byte b = buf.get();  
                        retval[i] = b;  
                        i++;  
                    }  
                    buf.clear();  
                    byteRead = inChannel.read(buf);  
                }  
                  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            return retval;  
    }

4、NIO2

    public static byte[] File2byteNIO2(File tradeFile){
    	byte[] retval = null;  
    	try(FileInputStream fileInputStream = new FileInputStream(tradeFile);) {  
    		FileChannel inChannel = fileInputStream.getChannel();  
    		ByteBuffer buf = ByteBuffer.allocateDirect((int)inChannel.size()); //文件太大的话这里必然报错 
    		inChannel.read(buf);  
    		retval = new byte[(int)inChannel.size()];
    		buf.get(retval, 0, buf.remaining());
    	} catch (FileNotFoundException e) {  
    		e.printStackTrace();  
    	} catch (IOException e) {  
    		e.printStackTrace();  
    	}  
    	return retval;  
    }

文件大小:7M 

方式   10次平均耗时
BIO平均:223ms
BIO-Buffered平均:206ms
NIO-拼接数组方式耗时:5467ms
NIO2平均:214ms

总结:拼接数组导致数据频繁的复制移动,影响性能,其他都差不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值