通过httpClient请求文件流(普通文件和压缩文件)示例

前言:通过浏览器请求文件流进行文件下载这里就不说了,网上有很多例子,这里主要是记录一下工作中的另一个场景,一个服务器通过HTTPClient向另一个服务请求文件流,在内存中进行业务逻辑处理,并不需要下载到本地,当然,如果你想要下载本地也是可以的,把文件流写到本地磁盘就可以了,也可以写到文件系统中。废话不多说。

一,服务器传输的是普通的文件流,没有经过压缩

服务器:

@RequestMapping(value = "/getCommonFile", method = RequestMethod.POST)
    public void getFile(HttpServletResponse response) {
        BufferedInputStream buffInputStream = null;
        OutputStream outputStream = null;
        try {
            buffInputStream = new BufferedInputStream(new FileInputStream(new File("D:\\testFile\\test.txt")));
            outputStream = response.getOutputStream();
            byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些
            int len = 0;
            while((len = buffInputStream.read(buff)) > 0) {
                //把文件流写入到response的输出流中,供请求端请求
                outputStream.write(buff, 0, len);
                outputStream.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(buffInputStream != null) {
                    buffInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端:

public void getCommonFile() throws IOException {
        //从服务器请求文件流,具体代码就不贴了
        CloseableHttpResponse response = HttpSender.toPost(FILE_URL, null);
        InputStream inputStream = response.getEntity().getContent();
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些
        int len = 0;
        while((len = inputStream.read(buff)) > 0) {
            //把从服务端读取的文件流保存到ByteArrayOutputSteam中
            byteArray.write(buff, 0, len);
            byteArray.flush();
        }
        inputStream.close();
        response.close();

        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(new ByteArrayInputStream(byteArray.toByteArray()), "utf-8"));
        String line = null;
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

二,服务器传输的是压缩的文件流(直接读取的压缩文件)

@RequestMapping(value = "/getZipFile", method = RequestMethod.POST)
    public void getZipFile(HttpServletResponse response) {
        BufferedInputStream buffInputStream = null;
        OutputStream outputStream = null;
        try {
            buffInputStream = new BufferedInputStream(new FileInputStream(new File("D:\\testFile\\test.gz")));
            outputStream = response.getOutputStream();
            byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些
            int len = 0;
            while((len = buffInputStream.read(buff)) > 0) {
                //把文件流写入到response的输出流中,供请求端请求
                outputStream.write(buff, 0, len);
                outputStream.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(buffInputStream != null) {
                    buffInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端:

public void getZipFile() throws IOException {
        //从服务器请求文件流,具体代码就不贴了
        CloseableHttpResponse response = HttpSender.toPost(FILE_URL, null);
        InputStream inputStream = response.getEntity().getContent();
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些
        int len = 0;
        while((len = inputStream.read(buff)) > 0) {
            //把从服务端读取的文件流保存到ByteArrayOutputSteam中
            byteArray.write(buff, 0, len);
            byteArray.flush();
        }
        inputStream.close();
        response.close();

        //GZIPInputstream解压文件,然后读取文件
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(new GZIPInputStream(
                        new ByteArrayInputStream(byteArray.toByteArray())), "utf-8"));
        String line = null;
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }

三,服务器传输的是压缩的文件流(直接读取的普通文件,然后在内存中将文件流进行压缩)

@RequestMapping(value = "/getCommontToZipFile", method = RequestMethod.POST)
    public void getCommontToZipFile(HttpServletRequest request, HttpServletResponse response) {
        BufferedInputStream buffInputStream = null;
        OutputStream outputStream = null;
        GZIPOutputStream zipOut = null;
        try {
            outputStream = response.getOutputStream();
            buffInputStream = new BufferedInputStream(new FileInputStream(new File("D:\\testFile\\test.txt")));
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            //压缩文件
            zipOut = new GZIPOutputStream(byteArrayOutputStream);
            byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些
            int len = 0;
            while((len = buffInputStream.read(buff)) > 0) {
                //把文件流写入到byteArrayOutputStream里面
                zipOut.write(buff, 0, len);
                zipOut.flush();
            }
            outputStream.write(byteArrayOutputStream.toByteArray());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(buffInputStream != null) {
                    buffInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(zipOut != null) {
                    zipOut.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端:

和第二种情况的客户端代码一样,就 不贴代码了

四,把多个压缩文件流 写在一个byteArray中

服务端:

@RequestMapping(value = "/getMultiZipFile", method = RequestMethod.POST)
    public void getMultiZipFile(HttpServletRequest request, HttpServletResponse response) {
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        List<File> files = new ArrayList<File>();
        File file = new File("D:\\testFile\\test1.gz");
        files.add(file);
        file = new File("D:\\testFile\\test2.gz");
        files.add(file);

        for(File file1 : files) {
            readDetailDataToByteArray(byteArray, file1);
        }
    }

    public static void readDetailDataToByteArray(ByteArrayOutputStream byteArray, File file) {
        BufferedInputStream bufferedInputStream = null;
        try {
            bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
            byte[] b = new byte[1024*1024];
            int j;
            while ((j = bufferedInputStream.read(b)) > 0) {
                byteArray.write(b, 0, j);
                byteArray.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
            } catch (Exception e) {

            }
        }
    }

客户端:

和第二种情况的客户端代码一样,就 不贴代码了

public void getZipFile() throws IOException {    //从服务器请求文件流,具体代码就不贴了CloseableHttpResponse response = HttpSender.toPost(FILE_URL, null);    InputStream inputStream = response.getEntity().getContent();    ByteArrayOutputStream byteArray = new ByteArrayOutputStream();    byte[] buff = new byte[1024*1024]; //如果是稍微大的文件,这里配置的大一些int len = 0;    while((len = inputStream.read(buff)) > 0) {        //把从服务端读取的文件流保存到ByteArrayOutputSteam中byteArray.write(buff, 0, len);        byteArray.flush();    }    inputStream.close();    response.close();

//GZIPInputstream解压文件,然后读取文件BufferedReader bufferedReader = new BufferedReader(            new InputStreamReader(new GZIPInputStream(                    new ByteArrayInputStream(byteArray.toByteArray())), "utf-8"));    String line = null;    while((line = bufferedReader.readLine()) != null) {        System.out.println(line);    }}

原文地址:https://www.cnblogs.com/jianyong-long/p/9693061.html

时间: 2024-10-30 05:20:18

通过httpClient请求文件流(普通文件和压缩文件)示例的相关文章

C# IO操作(四)大文件拷贝(文件流的使用)、文件编码

     大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一次性加载到内存中:事实上,内存也不允许这么干),所以在C#中出现了内存流这个东西.先看下面的内容,File类中的常用读取文件方法会将文件内容一次性全部加载到内存中: 1 string sPath = @"C:\Users\Chens-PC\Desktop\Nginx.txt"; 2 //F

unity使用文件流操作streamingassets下的文件

背景: 1.Unity第一次启动时将streamingassets下的首包资源拷贝到persistentDataPath目录下. 2.Unity-android平台上的的这种操作只能使用www去加载streamingassets下的文件,导致速度问题. 备注: 1.此方案需要您对安卓有一点点的了解. 解决方案: 1.在打包的时候,将streamingassets下的文件目录做一个记录,每一个打包进去的相对streamingassets路径下的文件都记录在一个files.txt里面,比如strea

使用HttpClient以文件流的方式上传文件(非multipartFormData方式)

@Test public void testAdd() throws IOException { HttpPost post = new HttpPost("http://localhost:8182/api/media/add?app=test&access_token=1234&fileName=测试一下.jpg&ContentType=image/jpeg"); HttpEntity entity = new FileEntity(new File(&qu

C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器,它能够长期保留信息,能读能写,可以刷新重写,方便携带,因而得到广泛使用. 文件(file)是程序设计中一个重要的概念.所谓“文件”,一般指存储在外部介质上数据的集合.一批数据是以文件的形式存放在外部介质(如磁盘.光盘和U盘)上的.操 作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部

对数据文件的操作和文件流

一直到现在,我还是用键盘对程序进行输入,但是实际情况中大部分是对文件进行读取和输出,今天就学习一下对文件的输入输出  . 根据文件对数据的组织形式 , 可分为ascll文件和二进制文件    "ascll"文件 又称 文本文件或字符文件  .     文件流 不是若干个文件组成的流  而是以  文件流输入输出  若要对文件进行输入输出  ,  若要对文件进行输入输出  . 就必须通过文件流 来实现  . 现有  三个 用于文件操作的文件类  . ifstream 类 他是从istrea

C++文件流类与文件流对象具体介绍

文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件流是由若干个文件组成的流.文件流本身不是文件,而只是以文件为输入输出对象的流.若要对磁盘文件输入输出,就必须通过文件流来实现. 在C++的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作.在 图13.2(详情请查看:与C++输入输出有关的类和对象)中可以看到除了标准输入输出流类istr

文件寄生——寻找宿主的不归路(NTFS文件流实际应用)

咱们今天来研究下NTFS文件流: NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序 NTFS文件流生成步骤:1.我们在任意一个NTFS分区下打开CMD命令提示符,输入echo mstlab>>mst.txt:test.txt,则在当前目录下会生成一个名为mst.txt的文件,但文件的大小为0字节,打开后也

文件流(二)

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO; namespace 文件流{public partial class Form1 : Form { public

如何使用Java代码获取文件、文件流或字符串的编码方式

今天通过网络资源研究了一下如何使用Java代码获取文件.文件流或字符串的编码方式,现将代码与大家分享: package com.ghj.packageoftool; import info.monitorenter.cpdetector.io.ASCIIDetector; import info.monitorenter.cpdetector.io.ByteOrderMarkDetector; import info.monitorenter.cpdetector.io.CodepageDete