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文件、通过流传输到前端,以及前端如何下载和处理这些文件。下面我们将详细探讨这些关键知识点。 1. **压缩技术**: - **Zip格式**:Zip是广泛使用的...
- 首先,我们需要创建一个`ZipFile`对象,将上传的ZIP文件作为输入流传递给它。 - 使用`ZipFile`的`entries()`方法获取ZIP文件中的所有条目(即文件和目录)。 - 遍历这些条目,对于每个条目,创建一个`ZipEntry`...
流传输技术在这里起到了关键作用,它允许数据以连续的流形式发送,而不是一次性发送整个文件,从而减少了网络拥堵并提高了传输速度。 在网络游戏中,数据对象通常需要被重复发送,因为游戏环境是动态变化的,每个...
邮编合并将多个现有Zip文件的内容合并并流式传输为单个文件,而无需重新压缩其中的数据。 如果您经常使用需要收集并发送给客户端的静态内容,这将很有用。 这样,您可以预压缩这些程序包,并即时对其进行组装,无需...
8. 源码学习价值:作为“经典”标签的源码,它可能是Java社区中流传的成熟代码示例,有助于初学者理解如何在实际项目中使用Java处理ZIP文件。通过阅读和分析这些源码,开发者可以加深对`java.util.zip`包的理解,...
1. **解压文件**:首先,你需要将下载的ZIP文件解压缩到一个指定的文件夹,这样可以访问到里面的各个文件。 2. **安全检查**:在安装任何驱动之前,确保你的杀毒软件已经更新,并进行扫描,以防止潜在的恶意软件。 ...
总的来说,M3U直播源打包.zip文件的使用者需要了解M3U和M3U8文件格式,以及如何在合适的播放器中使用它们来访问和播放在线直播内容。同时,对于内容提供商来说,打包M3U直播源可能是为了方便分发和管理大量的流媒体...
通过实例化`ZipArchive`,开发者可以添加文件到ZIP,设置压缩级别,以及最终保存ZIP文件。对于目录中的每个文件,`readfile()`或`file_put_contents()`可以用来读取文件内容,然后添加到ZIP档案中。 在实际应用中,...
它也可能用于在线视频流传输,因为较小的文件大小意味着更快的加载速度和更少的数据消耗。 7. 开源与封闭:如果“ymdamp4”是一个专有格式,那么其解码算法和技术细节可能不公开,这可能限制了第三方开发者对其进行...
首先,下载这个zip文件,然后将其解压缩。解压后的目录结构应该与Red5服务器的"webapps"目录相匹配,这意味着这些示例应用可以直接作为Web应用程序部署到Red5服务器的相应目录中,以便用户可以通过Red5服务访问和...
这个升级包采用了ZIP压缩格式,ZIP是一种常见的文件压缩标准,能够将多个文件打包成一个单一的文件,便于传输和存储。 描述中提到了升级过程,首先强调了建议使用FAT格式的U盘进行升级。FAT(File Allocation Table...
描述中提到的“一款多功能蓝牙传输软件”,意味着该软件具备多种与蓝牙相关的功能,如文件共享、设备配对、音频流传输等。蓝牙传输是无线技术的一种,允许设备之间在短距离内交换数据,无需物理连接。通常,这样的...
网络上流传的压缩软件格式有很多,偶尔可能会收到 RAR, 7z 或其他比较少见的压缩格式所做成的压缩文件,也许很多人也知道要装另外一套免费的 7-ZIP 压缩软件来对付各种常见、少见的压缩格式,而大部分人可能会安装 ...
标题 "Red5War_0.8.0.zip" 指的是一个包含了 Red5 服务器与 Tomcat 整合所需资源的压缩文件。这个版本号为 0.8.0,意味着这可能是 Red5 项目在该阶段的一个稳定版本。Red5 是一个开源的流媒体服务器,它支持实时传输...
"Constant_Broadcaster.cywrk.Archive01.zip" 是一个压缩文件,通常用来存储多个相关的文件或文件夹,便于传输和保存。从文件名推测,这个压缩包可能与一个名为 "Constant_Broadcaster" 的项目或者应用有关,".cywrk...
由于MIDI文件体积小,便于传输和存储,因此在互联网上广泛流传。 标题“MID音乐包下载.zip”表明这是一个包含MIDI文件的压缩包,可供用户下载。用户可以通过解压缩文件获取一系列MIDI音乐,享受这些音乐带来的愉悦...