`
y806839048
  • 浏览: 1120901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

zip的文件流传输压缩

阅读更多

 

zip的文件传输压缩,本质是写在流中,然后流传输,但是不同的文件类型结构不一,要用这种文件的专门的写流,和解析流的工具去处理,这样

得出的流才具备结构,才可用这种结构的解析工具解析

 

生产文件本系统是  win系统默认是GBK (解决见附件或文章:String与byte[]字节数组中文转换乱码问题

)  文件中有中文会乱码  linux就不会

 

 zip这种复杂结构的文件,是将流写到这种类型的文件对象中,这种zip的流也不会直接转化过来,需要遍历成员,将成员一个一个遍成流,可立即用,可累计

 普通的图片等但类型文件,直接变成流即可

 

方式一:

   @Test

    public void  zip() {

        File file = new File("C:\\Users\\yy\\tst\\20271104.zip");

        byte[] b = null;

        try {

            OutputStream oo = new FileOutputStream(new File("C:\\Users\\yy\\tst\\20271109.zip"));

            ByteArrayOutputStream bos = new ByteArrayOutputStream();

            ZipInputStream zin=   new ZipInputStream(new FileInputStream(file));

            ZipOutputStream zip = new ZipOutputStream(oo);

            ZipEntry entry;

            while ((entry = zin.getNextEntry()) != null) {

                ZipEntry cacheEntry = new ZipEntry(entry.getName());

                if(entry.getSize()==-1l){

                    cacheEntry.setSize(0l);

                }else{

                    cacheEntry.setSize(entry.getSize());

                }

 

                zip.putNextEntry(cacheEntry);

                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                byte[] buf = new byte[1024];

                int num;

                while ((num = zin.read(buf, 0, buf.length)) != -1) {

                    baos.write(buf, 0, num);

                }

                String s = new String(baos.toByteArray(), "UTF-8");

                System.out.println(s);

                zip.write(baos.toByteArray());//zip流生成zip

                zip.closeEntry();

            }

//            b = bos.toByteArray();  传递zip流

//            process(b);

            zip.close();

            bos.close();

        } catch (Exception ex) {

            ex.printStackTrace();

 

        }

    }

 

     private void process (byte[] a) {

        try (ByteArrayInputStream bis = new ByteArrayInputStream(a);

             ZipInputStream zip = new ZipInputStream(bis)) {

            ZipEntry entry;

            while ((entry = zip.getNextEntry()) != null) {

                String fileName = entry.getName();

                try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {

                    byte[] buf = new byte[1024];

                    int num;

                    while ((num = zip.read(buf, 0, buf.length)) != -1) {

                        baos.write(buf, 0, num);

                    }

                    String s = new String(baos.toByteArray(), "UTF-8");

                    System.out.println(s);

//     processText(baos.toByteArray(), 0, fileName);

                }

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

 

 

 

 

 

 

方式二:

paramzip=sftp.getFileStringZip(loccaldirect+"20271019"+".zip");

 

 

===把zip中所有的文件一个放在map中

 

 public   Map<String,String> getFileStringZip(String path) {

        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理

        File imgFile = new File(path);

        Map<String,String> mapparam = new HashMap<String,String>();

        try {

        ZipInputStream zip = new ZipInputStream(new FileInputStream(imgFile));

        ZipEntry zipEntry=null;

        while((zipEntry=zip.getNextEntry())!=null){//通过zip.getNextEntry()来得到ZipEntry对象。

            String fileName_zip=zipEntry.getName();//得到文件名称

            ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

            byte[] byte_s=new byte[1024];

            int num=-1;

            while((num=zip.read(byte_s,0,byte_s.length))>-1){//通过read方法来读取文件内容

                byteArrayOutputStream.write(byte_s,0,num);

            }

 

            byte[] byte_s_=byteArrayOutputStream.toByteArray();

            String fileNeirong=new String(byte_s,"UTF-8");//将字节数组转化为字符串,UTF-8格式(容许中文)

//            s.replaceAll("[\u0000]", "");

            mapparam.put(fileName_zip,fileNeirong.replaceAll("[\u0000]", ""));

            System.out.println(fileNeirong);

        }}catch (Exception e){

            e.printStackTrace();

        }

 

        return mapparam;

 

    }

 

 

 

 

====遍历map中所有的文件   文本就可读,其他就是下载

 

 public static void readTxt(JSONObject  myJson) throws IOException{

 

 

        //1.读取文件

//             File file = new File("d:/new4.txt");

//               InputStreamReader read = new InputStreamReader(new FileInputStream(file),"utf-8");//考虑到编码格式

//                BufferedReader bu = new BufferedReader(read);

//                //2.拼接字符串

                String lineText = null;

//                String insert = "INSERT INTO [report].[dbo].[process] ([bgid]) VALUES ('";

//                String insert2 = "');";

        for (Map.Entry<String, Object> entry : myJson.entrySet()) {

            System.out.println(entry.getKey() + ":" + entry.getValue());

            String key = entry.getKey();

            String value = entry.getValue()+"";

            Reader reader = new StringReader(value);

            BufferedReader bu = new BufferedReader(reader);

            //3.边读边写

            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\yy\\tst1\\"+key)));

            BufferedWriter wr = new BufferedWriter(out);

 

            while((lineText = bu.readLine()) != null){

                System.out.println(lineText);

                wr.write(lineText+"\r\n");

            }

            reader.close();

            wr.close();

        }

 

 

    }

 

 

 注意工具类中用byteArrayOutputStream转成字节码,不能用byte_s,byte_s只是缓存块,byteArrayOutputStream是累计值

 

  while((num=zip.read(byte_s,0,byte_s.length))>-1){//通过read方法来读取文件内容

                byteArrayOutputStream.write(byte_s,0,num);

            }

 

            byte[] byte_s_=byteArrayOutputStream.toByteArray();

    String fileNeirong1=new String(byte_s_,"UTF-8");

 

 

 

 

对于流无论read,write操作的对象都是左边的对象(参数中的都是缓存区)

 

 

 

 public   Map<String,String> getFileStringZip(String path) {

        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理

        File imgFile = new File(path);

        Map<String,String> mapparam = new HashMap<String,String>();

        try {

        ZipInputStream zip = new ZipInputStream(new FileInputStream(imgFile));

        ZipEntry zipEntry=null;

        while((zipEntry=zip.getNextEntry())!=null){//通过zip.getNextEntry()来得到ZipEntry对象。

            String fileName_zip=zipEntry.getName();//得到文件名称

            ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

            byte[] byte_s=new byte[1024];

            int num=-1;

            while((num=zip.read(byte_s,0,byte_s.length))>-1){//通过read方法来读取文件内容

                byteArrayOutputStream.write(byte_s,0,num);

            }

 

            byte[] byte_s_=byteArrayOutputStream.toByteArray();

//            String fileNeirong=new String(byte_s,"GBK");//将字节数组转化为字符串,UTF-8格式(容许中文)

            String fileNeirong=new String(byte_s,"UTF-8");//将字节数组转化为字符串,UTF-8格式(容许中文)

            String fileNeirong1=new String(byte_s_,"UTF-8");

//            String fileNeirong1 = new String(fileNeirong.getBytes("GBK"),"ISO8859-1");

//            s.replaceAll("[\u0000]", "");

            mapparam.put(fileName_zip,fileNeirong1.replaceAll("[\u0000]", ""));

//            System.out.println("byte_s========"+fileNeirong);

            System.out.println("byteArrayOutputStream======"+fileNeirong1);

//            System.out.println(fileNeirong1);

        }}catch (Exception e){

            e.printStackTrace();

        }

 

        return mapparam;

 

    }

 

 

分享到:
评论

相关推荐

    导出zip前后端完整方法

    本主题聚焦于"导出zip前后端完整方法",这涉及到后端生成zip文件、通过流传输到前端,以及前端如何下载和处理这些文件。下面我们将详细探讨这些关键知识点。 1. **压缩技术**: - **Zip格式**:Zip是广泛使用的...

    apache zip + jspsmartupload.jar 实现文件上传并自动解压

    - 首先,我们需要创建一个`ZipFile`对象,将上传的ZIP文件作为输入流传递给它。 - 使用`ZipFile`的`entries()`方法获取ZIP文件中的所有条目(即文件和目录)。 - 遍历这些条目,对于每个条目,创建一个`ZipEntry`...

    网络游戏-通过网络呈现用流传输的可重复的数据对象.zip

    流传输技术在这里起到了关键作用,它允许数据以连续的流形式发送,而不是一次性发送整个文件,从而减少了网络拥堵并提高了传输速度。 在网络游戏中,数据对象通常需要被重复发送,因为游戏环境是动态变化的,每个...

    PHPZipMerge:即时合并和流式传输多个Zip文件

    邮编合并将多个现有Zip文件的内容合并并流式传输为单个文件,而无需重新压缩其中的数据。 如果您经常使用需要收集并发送给客户端的静态内容,这将很有用。 这样,您可以预压缩这些程序包,并即时对其进行组装,无需...

    java源码:Java zip压缩包查看程序源码.rar

    8. 源码学习价值:作为“经典”标签的源码,它可能是Java社区中流传的成熟代码示例,有助于初学者理解如何在实际项目中使用Java处理ZIP文件。通过阅读和分析这些源码,开发者可以加深对`java.util.zip`包的理解,...

    VBCABLE_Driver_Pack43_cable_zip_

    1. **解压文件**:首先,你需要将下载的ZIP文件解压缩到一个指定的文件夹,这样可以访问到里面的各个文件。 2. **安全检查**:在安装任何驱动之前,确保你的杀毒软件已经更新,并进行扫描,以防止潜在的恶意软件。 ...

    M3U直播源打包.zip

    总的来说,M3U直播源打包.zip文件的使用者需要了解M3U和M3U8文件格式,以及如何在合适的播放器中使用它们来访问和播放在线直播内容。同时,对于内容提供商来说,打包M3U直播源可能是为了方便分发和管理大量的流媒体...

    PHP实例开发源码—php目录下载器.zip

    通过实例化`ZipArchive`,开发者可以添加文件到ZIP,设置压缩级别,以及最终保存ZIP文件。对于目录中的每个文件,`readfile()`或`file_put_contents()`可以用来读取文件内容,然后添加到ZIP档案中。 在实际应用中,...

    ymdamp4.zip迷你的埃视频文件,可以实现一种纪录的播放,都是非常有用的技术呢

    它也可能用于在线视频流传输,因为较小的文件大小意味着更快的加载速度和更少的数据消耗。 7. 开源与封闭:如果“ymdamp4”是一个专有格式,那么其解码算法和技术细节可能不公开,这可能限制了第三方开发者对其进行...

    red5-1.0.0-webapps-demos.zip

    首先,下载这个zip文件,然后将其解压缩。解压后的目录结构应该与Red5服务器的"webapps"目录相匹配,这意味着这些示例应用可以直接作为Web应用程序部署到Red5服务器的相应目录中,以便用户可以通过Red5服务访问和...

    海康威视DS-7804HW-SNH萤石云程序升级包.zip

    这个升级包采用了ZIP压缩格式,ZIP是一种常见的文件压缩标准,能够将多个文件打包成一个单一的文件,便于传输和存储。 描述中提到了升级过程,首先强调了建议使用FAT格式的U盘进行升级。FAT(File Allocation Table...

    千月蓝牙10.0.479.1.zip

    描述中提到的“一款多功能蓝牙传输软件”,意味着该软件具备多种与蓝牙相关的功能,如文件共享、设备配对、音频流传输等。蓝牙传输是无线技术的一种,允许设备之间在短距离内交换数据,无需物理连接。通常,这样的...

    解压缩软件 Bandizip v6.22 中文特别版下载地址

    网络上流传的压缩软件格式有很多,偶尔可能会收到 RAR, 7z 或其他比较少见的压缩格式所做成的压缩文件,也许很多人也知道要装另外一套免费的 7-ZIP 压缩软件来对付各种常见、少见的压缩格式,而大部分人可能会安装 ...

    Red5War_0.8.0.zip

    标题 "Red5War_0.8.0.zip" 指的是一个包含了 Red5 服务器与 Tomcat 整合所需资源的压缩文件。这个版本号为 0.8.0,意味着这可能是 Red5 项目在该阶段的一个稳定版本。Red5 是一个开源的流媒体服务器,它支持实时传输...

    Constant_Broadcaster.cywrk.Archive01.zip

    "Constant_Broadcaster.cywrk.Archive01.zip" 是一个压缩文件,通常用来存储多个相关的文件或文件夹,便于传输和保存。从文件名推测,这个压缩包可能与一个名为 "Constant_Broadcaster" 的项目或者应用有关,".cywrk...

    MID音乐包下载.zip

    由于MIDI文件体积小,便于传输和存储,因此在互联网上广泛流传。 标题“MID音乐包下载.zip”表明这是一个包含MIDI文件的压缩包,可供用户下载。用户可以通过解压缩文件获取一系列MIDI音乐,享受这些音乐带来的愉悦...

Global site tag (gtag.js) - Google Analytics