java byte下载_java io 下载文件 字节流io典型应用

该博客介绍了如何使用Java的IO流从URL下载文件,通过HttpURLConnection建立连接,设置超时和User-Agent,获取输入流并转换为字节数组,最后利用FileOutputStream将内容写入本地文件。文章还详细解释了字节流操作的核心步骤,并提供了相关的代码示例。
摘要由CSDN通过智能技术生成

public String downLoadFromUrl(String urlStr) {

try {

String fileName = getRandomString(20)+".jpg";

String savePath = "/data/back";

// fileName = urlStr.substring(urlStr.lastIndexOf("/")+1);

URL url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

//设置超时间为3秒

conn.setConnectTimeout(3*1000);

//防止屏蔽程序抓取而返回403错误

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

//得到输入流

InputStream inputStream = conn.getInputStream();

//获取自己数组

byte[] getData = readInputStream(inputStream);

//文件保存位置

File saveDir = new File(savePath);

if(!saveDir.exists()){

saveDir.mkdir();

}

File file = new File(saveDir+File.separator+fileName);

FileOutputStream fos = new FileOutputStream(file);

fos.write(getData);

if(fos!=null){

fos.close();

}

if(inputStream!=null){

inputStream.close();

}

System.out.println("info:"+url+" download success");

String localFile = saveDir+File.separator+fileName;

File fileLocal = new File(localFile);

String retUrl = upload(fileLocal);

fileLocal.delete();

return retUrl;

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

public static byte[] readInputStream(InputStream inputStream) throws IOException {

byte[] buffer = new byte[1024];

int len = 0;

ByteArrayOutputStream bos = new ByteArrayOutputStream();

while((len = inputStream.read(buffer)) != -1) {

bos.write(buffer, 0, len);

}

bos.close();

return bos.toByteArray();

}

//得到输入流

InputStream inputStream = conn.getInputStream();

得到返回字节流

public static byte[] readInputStream(InputStream inputStream) throws IOException {

byte[] buffer = new byte[1024];

int len = 0;

ByteArrayOutputStream bos = new ByteArrayOutputStream();

while((len = inputStream.read(buffer)) != -1) {

bos.write(buffer, 0, len);

}

bos.close();

return bos.toByteArray();

}

读取InputStream,将字节流灌入byte数组,通过ByteArrayOutputStream向Byte数组写入数据,这里的ByteArrayOutputStream无非是起一个合并每次读取byte[]的嫁接功能,也可以不用,自己拼接,只要将InputStream全部压入byte[]即可

File file = new File(saveDir+File.separator+fileName);

FileOutputStream fos = new FileOutputStream(file);

fos.write(getData);

通过FileOutputSteam在本地文件中写入数据

核心:

InputStream-byte[]-OutputStream(FileOutputStream)

byte[]为中介

参考:http://blog.csdn.net/qq_25184739/article/details/51205186

2.输出字节流OutputStream

ae00295bf3ee275c6b9025339407d207.png

IO中输出字节流的继承图可见上图,可以看出:

1.OutputStream是所有的输出字节流的父类,它是一个抽象类。

2.ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据。

3.ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。

8dd7f688f6633362603e2495587f1c9d.png

outputStream中的三个基本的写方法abstract void write(int?b):往输出流中写入一个字节。void write(byte[]?b):往输出流中写入数组b中的所有字节。void write(byte[]?b, int?off, int?len):往输出流中写入数组b中从偏移量off开始的len个字节的数据。

其它方法void flush():刷新输出流,强制缓冲区中的输出字节被写出。void close():关闭输出流,释放和这个流相关的系统资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值