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 用什么方法可以不丢失字节,但又算法上比较高效的?谢谢大家。
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 用什么方法可以不丢失字节,但又算法上比较高效的?谢谢大家。
建议不要使用缓存方式封装这种类型的流,直接使用获得的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.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();
}
}