java InputStream读取数据问题

//截取自http://bbs.chinaunix.net/thread-3677707-1-1.html

javaioInputStreambyteavailable
首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。

例如以下代码:

Java代码

  1. /**  
  2. * 读取流  
  3. *   
  4. * @param inStream  
  5. * @return 字节数组  
  6. * @throws Exception  
  7. */  
  8. public static byte[] readStream(InputStream inStream) throws Exception {   
  9.     ByteArrayOutputStream outSteam = new ByteArrayOutputStream();   
  10.     byte[] buffer = new byte[1024];   
  11.     int len = -1;   
  12.     while ((len = inStream.read(buffer)) != -1) {   
  13.         outSteam.write(buffer, 0, len);   
  14.     }   
  15.     outSteam.close();   
  16.     inStream.close();   
  17.     return outSteam.toByteArray();   
  18. }  
  19.         /**
  20.          * 读取流
  21.          *
  22.          * @param inStream
  23.          * @return 字节数组
  24.          * @throws Exception
  25.          */
  26.         public static byte[] readStream(InputStream inStream) throws Exception {
  27.                 ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
  28.                 byte[] buffer = new byte[1024];
  29.                 int len = -1;
  30.                 while ((len = inStream.read(buffer)) != -1) {
  31.                         outSteam.write(buffer, 0, len);
  32.                 }
  33.                 outSteam.close();
  34.                 inStream.close();
  35.                 return outSteam.toByteArray();
  36.         }

复制代码

我们来测试一下:

Java代码

  1. public static void main(String[] args) {   
  2.     try {   
  3.         File file = new File(“C:\\ceshi.txt”);   
  4.         FileInputStream fin = new FileInputStream(file);   
  5.         byte[] filebt = readStream(fin);   
  6.         System.out.println(filebt.length);   
  7.     } catch (Exception e) {   
  8.         e.printStackTrace();   
  9.     }      
  10. }  
  11.         public static void main(String[] args) {
  12.                 try {
  13.                         File file = new File(“C:\\ceshi.txt”);
  14.                         FileInputStream fin = new FileInputStream(file);
  15.                         byte[] filebt = readStream(fin);
  16.                         System.out.println(filebt.length);
  17.                 } catch (Exception e) {
  18.                         e.printStackTrace();
  19.                 }       

复制代码

}后台会打印这个文本的字节大小。看起来,这个是没有问题的。

关于InputStream类的available()方法
这个方法的意思是返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。为什么需要这个方法?因为在一些网络应用中,数据流并不是一次性就能传递的,如果我们还是像上面那样去将这个流转换,会出问题的。

This entry was posted in Computer, Java. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s