package net;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.net.URLConnection;public class TURLConnection 
{  
public static void main(String args[]) throws Exception
{
URL url=new URL("http://www.sina.com.cn");
URLConnection urlCon=url.openConnection();

/*
 * 方法1,一次过读取所有信息
 */
BufferedInputStream bis=new BufferedInputStream(urlCon.getInputStream());
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\aa.htm"));

byte b[]=new byte[bis.available()];
bis.read(b);
bos.write(b);
bos.flush();

bis.close();
bos.close();
/*
 * 方法2,一个个字节地读取
 */
// InputStream is=urlCon.getInputStream();
// FileOutputStream fos=new FileOutputStream("C:\\bb.htm");
// int tmp=0;
// while((tmp=is.read())!=-1)
// {
// fos.write(tmp);
// }
// fos.flush();
// fos.close();
// is.close();
}
}
方法1的这种一次过把输入流的所有数据都赋值给一个byte数组的算法,我在本地的输出输出操作中,用过很多次都没问题,例如把C盘的一个文件复制到D盘,就用这种算法。但是,如果用于网络方面的输入流读取,就出问题了,常常会丢失很多字节码。如果用方法2,就肯定没问题,但是方法2一个个字节地读,很低效。
问题1 为什么用方法1来读取网络上的输入流,会出现字节丢失?问题2 用什么方法可以不丢失字节,但又算法上比较高效的?谢谢大家。

解决方案 »

  1.   

    如果你的JDK在1.4以上,可以通过nio来提高效率,效果是很明显的
      

  2.   

    nio是什么东东  pliner(pliner)  能解释下吗??
      

  3.   

    我blog里面有一篇nio的专题文章,你可以去看看
      

  4.   

    BufferedInputStream(如文件拷贝等)在本地系统使用时不会遇到阻塞,而对于网络资源,会由于网络关系等影响因素,产生阻塞,此时的available是不可用的,会在流的中途就中断了,所以会丢失数据。
    建议不要使用缓存方式封装这种类型的流,直接使用获得的InputStream,如果不想一个字一个字的读,可以修饰一下一行一行的读取。
      

  5.   

    补充一下:
    建议使用nio包的东东来处理,nio提供了非阻塞性的新特性。
    使用原IO的话不要使用available就可以了。
    上面写错了一点,用不用缓存方式都不是关键,在这里表示抱歉,误导了,现在突然想起来。
      

  6.   

    用以下两个放下解决网络上的速度问题
    InputStream
    public void read(byte b[], int off, int len) throws IOException
    OutputStream
    public void write(byte b[], int off, int len) throws IOException
      

  7.   

    import java.io.*;
    import java.net.*;public class TURLConnection 
    {  
        public static void main(String args[]) throws Exception
        {
       URL url=new URL("http://www.sina.com.cn");
       URLConnection urlCon=url.openConnection();
           InputStreamReader isr=new InputStreamReader(urlCon.getInputStream());
           BufferedReader br=new BufferedReader(isr);
           BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\a.htm"));
           PrintWriter out=new PrintWriter(bw);
           String s=null;
           while((s=br.readLine())!=null)
           {
           out.println(s);
           }
           isr.close();
           br.close();
           bw.close();
           out.close();
       }
    }