站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题高手才进来:关于输入输出流的两种算法

高手才进来:关于输入输出流的两种算法

摘要: 高手才进来:关于输入输出流的两种算法


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 用什么方法可以不丢失字节,但又算法上比较高效的?

谢谢大家。



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


我也遇到过相同问题
期待回答!


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



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


希望有人就我题目的问题,给出回答。




up


有人能回答,分数不是问题


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


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


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



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();
}
}


↑返回目录
前一篇: 高手进来:DataInputStream的用途
后一篇: Java中有现成的计算椭圆周长的方法吗?