从inputStream中读取指定长度的字节

Java 中如何从InputStream中读取指定长度的字节呢?

代码如下:

Java代码  

  1. /*** 
  2.      * 从输入流获取字节数组,当文件很大时,报java.lang.OutOfMemoryError: Java heap space 
  3.      *  
  4.      * @since 2014-02-19 
  5.      * @param br_right 
  6.      * @param length2 
  7.      * @return 
  8.      * @throws IOException 
  9.      */  
  10.     public static byte[] readBytesFromInputStream(InputStream br_right,  
  11.             int length2) throws IOException {  
  12.         int readSize;  
  13.         byte[] bytes = null;  
  14.         bytes = new byte[length2];  
  15.   
  16.         long length_tmp = length2;  
  17.         long index = 0;// start from zero  
  18.         while ((readSize = br_right.read(bytes, (int) index, (int) length_tmp)) != -1) {  
  19.             length_tmp -= readSize;  
  20.             if (length_tmp == 0) {  
  21.                 break;  
  22.             }  
  23.             index = index + readSize;  
  24.         }  
  25.         return bytes;  
  26.     }  
  27. /*** 
  28.      * 读取指定长度的字节 
  29.      * @since 2014-02-27 
  30.      * @param ins 
  31.      * @param sumLeng : 要读取的字节数 
  32.      * @return 
  33.      * @throws IOException 
  34.      */  
  35.     public static byte[]readBytesFromGzipInputStream(GZIPInputStream ins,long sumLeng) throws IOException{  
  36.         byte[] fileNameBytes = new byte[(int) sumLeng];  
  37.         int fileNameReadLength=0;  
  38.         int hasReadLength=0;//已经读取的字节数  
  39.         while((fileNameReadLength=ins.read(fileNameBytes,hasReadLength,(int)sumLeng-hasReadLength))>0){  
  40.             hasReadLength=hasReadLength+fileNameReadLength;  
  41.         }  
  42.         return fileNameBytes;  
  43.     }  
  44. /*** 
  45.      * read char array from inputstream according to specified length. 
  46.      *  
  47.      * @param file 
  48.      * @param ins 
  49.      * @param length2 
  50.      *            :要读取的字符总数 
  51.      * @throws IOException 
  52.      */  
  53.     public static char[] getCharsFromInputStream(BufferedReader br_right,  
  54.             int length2) throws IOException {  
  55.         int readSize;  
  56.         char[] chars = null;  
  57.         chars = new char[length2];  
  58.   
  59.         long length_tmp = length2;  
  60.         long index = 0;// start from zero  
  61.         while ((readSize = br_right.read(chars, (int) index, (int) length_tmp)) != -1) {  
  62.             length_tmp -= readSize;  
  63.             if (length_tmp == 0) {  
  64.                 break;  
  65.             }  
  66.             index = index + readSize;// 写入字符数组的offset(偏移量)  
  67.         }  
  68.         return chars;  
  69.     }  
  70.   
  71. /*** 
  72.      * 从文件中读取指定长度的字符(注意:不是字节) 
  73.      *  
  74.      * @param file 
  75.      * @param length2 
  76.      * @return 
  77.      * @throws IOException 
  78.      */  
  79.     public static char[] getCharsFromFile(File file, int length2)  
  80.             throws IOException {  
  81.         FileInputStream fin = new FileInputStream(file);  
  82.         InputStreamReader inr = new InputStreamReader(fin);  
  83.         BufferedReader br = new BufferedReader(inr);  
  84.         return getCharsFromInputStream(br, length2);  
  85.     }  
  86. private static byte[] readDataFromLength(HttpURLConnection huc,  
  87.             int contentLength) throws Exception {  
  88.   
  89.         InputStream in = huc.getInputStream();  
  90.         BufferedInputStream bis = new BufferedInputStream(in);  
  91.   
  92.         // 数据字节数组  
  93.         byte[] receData = new byte[contentLength];  
  94.   
  95.         // 已读取的长度  
  96.         int readAlreadyLength = 0;  
  97.   
  98.         // while ((readAlreadyLength+= bis.read(receData, readAlreadyLength,  
  99.         // contentLength-readAlreadyLength))< contentLength) {  
  100.         // System.out.println("right");  
  101.         // }  
  102.         while ((readAlreadyLength = readAlreadyLength  
  103.                 + bis.read(receData, readAlreadyLength, contentLength  
  104.                         - readAlreadyLength)) < contentLength) {  
  105.         }  
  106.         // System.out.println("readLength=" + readLength);  
  107.         return receData;  
  108.     }  

 

 

参考我的另外一篇博客:http://hw1287789687.iteye.com/blog/2019425

时间: 2024-12-01 01:28:26

从inputStream中读取指定长度的字节的相关文章

写入指定长度的字节到文件

使用Java ,如何把指定长度的字节写入文件呢,或者说如何从inputStream 中读取指定长度的字节写入outputStream中呢? Java代码   /***       * write inputstream into file according to specified length.       *        * @param file       * @param ins       *            : not closed       * @param leng

如何从mdb中读取指定条件的一列数据,然后添加一个字段后写入sql server

问题描述 请教各位,我需要读取局域网的一个mdb文件(此文件的数据是会不断的增加的),目前不知道如何把mdb里查询到符合条件的那行数据写入sqlserver,谢谢. 解决方案 解决方案二:你学习了查询数据,现在想学习一下如何插入数据.这不应该上论坛吧?!解决方案三:最近经常有帖子问"怎么在代码中连接数据库啊?"之类的问题.这就够可以的了.没想到有出现了"会从Jet查询一条记录,怎么Insert到SQLServer数据库"的问题!为了学习某个必须的编程功能,你可以去买

InputStream中read()与read(byte[] b)

http://blog.csdn.net/snihcel/article/details/7893097 read()与read(byte[] b)这两个方法在抽象类InputStream中前者是作为抽象方法存在的,后者不是,JDK API中是这样描述两者的:  1:read() : 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值.如果因为已经到达流末尾而没有可用的字节,则返回-1.在输入数据可用.检测到流末尾或者抛出异常前,此方法一直阻塞.  2:read(byte[] b

byte-关于 I/O 中 读取/写入时,使用 int型 的问题

问题描述 关于 I/O 中 读取/写入时,使用 int型 的问题 . 为什么读取/写入单个字节/字符,返回值/输入值都是 int型,为什么不用 byte/char,如下方法: . InputStream: abstract int read() 从输入流中读取数据的下一个字节. 从输入流中读取数据的下一个字节.返回 0 到 255 范围内的 int 字节值.如果因为已经到达流末尾而没有可用的字节,则返回值 -1. . OutputStream: abstract void write(int b

PHP中读取文件的几个方法总结(推荐)_php技巧

1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到哪种情况. fread() 返回所读取的字符串,如果出错返回 FALSE. <?php $filename = "/usr/loca

PHP中读取文件的8种方法和代码实例_php实例

整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到哪种情况. fread() 返回所读取的字符串,如果出错返回 FALSE. 复制代码

java中InputStream中read()与read(byte[] b) 用法介绍

这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() :  从输入流中读取数据的下一个字节,返回0到255范围内的int字节值.如果因为已经到达流末尾而没有可用的字节,则返回-1.在输入数据可用.检测到流末尾或者抛出异常前,此方法一直阻塞. read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中.以整数形式返回实际读取的字节数.在输入数据可用.检测到文件末尾或者抛出异常前,此方法一直阻塞. 如

解决方案-截取指定长度的富文本内容可能会出现页面被凌乱的问题

问题描述 截取指定长度的富文本内容可能会出现页面被凌乱的问题 5C freemaker页面中截取指定长度的字符串,超出长度的部分用-替代 <#if topic.title?length lt 35> ${topic.title}<#else> ${topic.title?substring(035)}... </#if> 如果数据库中topic.title的内容不是纯文本,而是富文本(含有很多html标签的文本)内容,按指定 长度截取的话,就有可能会破坏富文本的html

java中如何让setText方法读取指定标签数据的时候特意空出一点点空间

问题描述 java中如何让setText方法读取指定标签数据的时候特意空出一点点空间 如何让setText方法读取指定标签数据的时候特意空出一点点空间java当中 解决方案 http://zhidao.baidu.com/link?url=znfx-j9HEz7fJS4EcXcc-gX096uqEKQMTQo4vBNrc9bhRAlFHGGxkAP8cPTOkATWxy3DqxQwhBwFAscWkNPxe_,用空字符串占位置看看可不可以也就是字符串前面有空格,后面有空格. 解决方案二: 使用全