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 用什么方法可以不丢失字节,但又算法上比较高效的?谢谢大家。
解决方案 »
- JAVA电子词典?
- 如何根据月份生成相应的期号?
- 我是菜鸟,各位牛人帮帮忙,一个简单问题。
- 请问如何得到文件自身的路径啊?
- java新手有些问题啊
- 请问SWT表格可以设行高吗?或者可以换行吗?
- 那里有Java的下载网址
- 大虾,请问如何在IE6.0中显示java applet??我装了jdk1.4.0啦,为什么浏览器还是无法显示applet??
- 如何解决jbuilder4执行程序时出现中文输入条的问题?谢谢!
- 安装jpk
- 用Jfilechooser打开文件夹时,能默认吗??
- 一个高中肄业生,没有任何基础,一个月的时间学完《Java ?How To Program》上册可以么?不上机,就是光看书的方式
建议不要使用缓存方式封装这种类型的流,直接使用获得的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();
}
}