- 浏览: 298367 次
- 性别:
- 来自: 上海
最新评论
-
再_见孙悟空:
写的不错
Dialog -
a549262189:
支持下,正好在学习这块的内容!
Android Gesture Detector -
dcsff:
受教了
LayoutInflater -
庆_啊:
真厉害。
LayoutInflater -
ghj234:
学习了,哈哈
LayoutInflater
/* * 非面向对象语言要实现保存工作数据(如一个绘图程序保存一幅画面的定义),往往需要一个程序数据格式转换为外部 * 文件格式存储,工作时再反向转换的过程.实现比较麻烦,编程不透明.而java语言是一种面向对象的语言,使用它的 * 对象序列化特性,就可实现将工作对象(画面定义对象数据)直接写入硬盘,需要时再直接再读入内存,不需任何额外操作.实现非常 * 方便.但由于写出对象为java类格式,因此数据冗余度较大.当数据量很大时,往往造成存储文件很大.过多的磁盘操作也导致 * 数据读入花费了更多时间,占有了大量内存.采用gzip压缩存储对象是解决此类问题的有效手段.(在本人实现的一个 * 监控系统中,调入一幅测试画面(10万个组件,压缩前7M,压缩后600K),压缩前对如画面后内存为26M,压缩后读入内存为12M,读入速度也大幅提高.效果十分明显). * java程序开发网络应用程序是它的最大优势,但在某些低速网络情况下(Internet、拨号网络).网络往往造成传输瓶颈, * 影响应用效果,对于实时性要求高的应用影响更大.采用压缩可以有效改善通信效果. * 可见,在java下的对象gzip压缩有着广泛的应用价值.以下是一个简单事例程序. */ public class GzipDataInflaterManager { public static void main(String[] args) { Data testData_ = new Data(); // 未压缩数据对象内容 System.out.println("name=" + testData_.name + " age=" + testData_.age + " height=" + testData_.height); // 1 压缩 byte[] i_ = CompressObject.writeCompressObject(testData_); // 2 可执行保存或网络传输,需要时还原或在对端还原 // 3 解压缩 Data o_ = CompressObject.readCompressObject(i_); // 解压缩后对象内容 System.out.println("name=" + o_.name + " age=" + o_.age + " height=" + o_.height); } } final class CompressObject { // 将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输 public static byte[] writeCompressObject(Data object_) { byte[] data_ = null; try { // 建立字节数组输出流 ByteArrayOutputStream o = new ByteArrayOutputStream(); // 建立gzip压缩输出流 GZIPOutputStream gzout = new GZIPOutputStream(o); // 建立对象序列化输出流 ObjectOutputStream out = new ObjectOutputStream(gzout); out.writeObject(object_); out.flush(); out.close(); gzout.close(); // 返回压缩字节流 data_ = o.toByteArray(); o.close(); } catch (IOException e) { System.out.println(e); } return data_; } // 将压缩字节数组还原为Data类型数据对象 public static Data readCompressObject(byte[] data_) { Data object_ = null; try { // 建立字节数组输入流 ByteArrayInputStream i = new ByteArrayInputStream(data_); // 建立gzip解压输入流 GZIPInputStream gzin = new GZIPInputStream(i); // 建立对象序列化输入流 ObjectInputStream in = new ObjectInputStream(gzin); // 按制定类型还原对象 object_ = (Data) in.readObject(); i.close(); gzin.close(); in.close(); } catch (ClassNotFoundException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } return object_; } } class Data implements Serializable { private static final long serialVersionUID = 1L; String name = "李冰冰"; int age = 25; float height = 160f; }
public class GzipFileInflaterManager { public static void main(String[] args) throws IOException { String zipName = "D:\\new file\\ff.gzip"; String fileName = "D:\\new file\\f1.txt"; String _zipName = "D:\\new file\\ff.gzip"; String _fileName = "D:\\new file\\f11.txt"; gzip(zipName, fileName); ungzip(_zipName, _fileName); } private static void gzip(String zipName, String fileName) throws IOException { FileInputStream fis = new FileInputStream(fileName); FileOutputStream fos = new FileOutputStream(zipName); GZIPOutputStream gos = new GZIPOutputStream(fos); byte[] bytes = new byte[1024]; int size = 0; while ( (size = fis.read(bytes)) != -1 ) { gos.write(bytes, 0, size); } gos.flush(); gos.close(); fos.close(); fis.close(); } private static void ungzip(String zipName, String fileName) throws IOException { FileInputStream fis = new FileInputStream(zipName); GZIPInputStream gis = new GZIPInputStream(fis); FileOutputStream fos = new FileOutputStream(fileName); byte[] bytes = new byte[1024]; int size = 0; while ( (size = gis.read(bytes, 0, bytes.length)) != -1 ) { fos.write(bytes, 0, size); } fos.flush(); gis.close(); fos.close(); fis.close(); } }
public class InflaterManagerImpl{ public static void main(String[] args){ InflaterManager ifm=new InflaterManager(); ifm.inflat("D:\\new file\\tgz.tar"); } } class InflaterManager { public void inflat(String path) { File file = new File(path), tempFile = null; InputStream fis = null; OutputStream fos = null; TarInputStream zis = null; try { fis = new FileInputStream(file); zis = new TarInputStream(fis); TarEntry tarEntry = null; //关键在于这个TarEntry 的理解,实际你的tar包里有多少文件就有多少TarEntry while ((tarEntry = zis.getNextEntry()) != null) { tempFile = new File("D:\\new file\\" + tarEntry.getName()); tempFile.createNewFile(); fos = new FileOutputStream(tempFile); byte[] buf = new byte[1024]; int size = 0; while ((size = zis.read(buf)) != -1) { fos.write(buf, 0, size); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.flush(); fis.close(); zis.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } } }
public class ZipFileInflaterManager { public static void main(String[] args) throws IOException { // String[] filesName = new String[3]; // String zipName = "D:\\new file\\ff.zip"; // filesName[0] = "f1.txt"; // filesName[1] = "f2.txt"; // filesName[2] = "f3.txt"; // zip(zipName, filesName); String[] _filesName = new String[3]; String _zipName = "D:\\new file\\f.zip"; _filesName[0] = "D:\\new file\\f1.txt"; _filesName[1] = "D:\\new file\\f2.txt"; _filesName[2] = "D:\\new file\\f3.txt"; unzip(_zipName, _filesName); } private static void zip(String zipName, String[] filesName) throws IOException { String path = "D:\\new file\\"; FileOutputStream fos = new FileOutputStream(zipName); ZipOutputStream zos = new ZipOutputStream(fos); for (String fileName : filesName) { int size = 0; byte[] bytes = new byte[128]; // 建立要压缩的文件 ZipEntry ze = new ZipEntry(fileName); zos.putNextEntry(ze); // 向要压缩的文件中写入内容 ByteArrayOutputStream baos = new ByteArrayOutputStream(); FileInputStream fis = new FileInputStream(path + fileName); while ((size = fis.read(bytes)) != -1) { baos.write(bytes, 0, size); } zos.write(baos.toByteArray()); // 结束 zos.flush(); fis.close(); } zos.close(); fos.close(); } private static void unzip(String zipName, String[] filesName) throws IOException { int size = 0, i = 0; byte[] bytes = new byte[128]; FileInputStream fis = new FileInputStream(zipName); ZipInputStream zis = new ZipInputStream(fis); // ZipEntry ze = null; // while ((ze = zis.getNextEntry()) != null) { while (zis.getNextEntry() != null) { FileOutputStream fos = new FileOutputStream(filesName[i++]); while ((size = zis.read(bytes)) != -1) { fos.write(bytes, 0, size); } fos.flush(); fos.close(); zis.closeEntry(); } fis.close(); zis.close(); } }
public class FileOperate { private String message; /** * 读取文本文件内容 * @param filePathAndName 带有完整绝对路径的文件名 * @param encoding 文本文件打开的编码方式 * @return 返回文本文件的内容 */ public String readTxt(String filePathAndName, String encoding) throws IOException { encoding = encoding.trim(); StringBuffer str = new StringBuffer(""); String st = ""; try { FileInputStream fs = new FileInputStream(filePathAndName); InputStreamReader isr; if (encoding.equals("")) { isr = new InputStreamReader(fs); } else { isr = new InputStreamReader(fs, encoding); } BufferedReader br = new BufferedReader(isr); try { String data = ""; while ((data = br.readLine()) != null) { str.append(data + " "); } } catch (Exception e) { str.append(e.toString()); } st = str.toString(); } catch (IOException es) { st = ""; } return st; } /** * 新建目录 * @param folderPath 目录 * @return 返回目录创建后的路径 */ public String createFolder(String folderPath) { String txt = folderPath; try { java.io.File myFilePath = new java.io.File(txt); txt = folderPath; if (!myFilePath.exists()) { myFilePath.mkdir(); } } catch (Exception e) { message = "创建目录操作出错"; } return txt; } /** * 多级目录创建 * @param folderPath 准备要在本级目录下创建新目录的目录路径 例如 c:myf * @param paths 无限级目录参数,各级目录以单数线区分 例如 a|b|c * @return 返回创建文件后的路径 例如 c:myfac */ public String createFolders(String folderPath, String paths) { String txts = folderPath; try { String txt; txts = folderPath; StringTokenizer st = new StringTokenizer(paths, "|"); for (int i = 0; st.hasMoreTokens(); i++) { txt = st.nextToken().trim(); if (txts.lastIndexOf("/") != -1) { txts = createFolder(txts + txt); } else { txts = createFolder(txts + txt + "/"); } } } catch (Exception e) { message = "创建目录操作出错!"; } return txts; } /** * 新建文件 * @param filePathAndName 文本文件完整绝对路径及文件名 * @param fileContent 文本文件内容 */ public void createFile(String filePathAndName, String fileContent) { try { String filePath = filePathAndName; filePath = filePath.toString(); File myFilePath = new File(filePath); if (!myFilePath.exists()) { myFilePath.createNewFile(); } FileWriter resultFile = new FileWriter(myFilePath); PrintWriter myFile = new PrintWriter(resultFile); String strContent = fileContent; myFile.println(strContent); myFile.close(); resultFile.close(); } catch (Exception e) { message = "创建文件操作出错"; } } /** * 有编码方式的文件创建 * @param filePathAndName 文本文件完整绝对路径及文件名 * @param fileContent 文本文件内容 * @param encoding 编码方式 例如 GBK 或者 UTF-8 */ public void createFile(String filePathAndName, String fileContent, String encoding) { try { String filePath = filePathAndName; filePath = filePath.toString(); File myFilePath = new File(filePath); if (!myFilePath.exists()) { myFilePath.createNewFile(); } PrintWriter myFile = new PrintWriter(myFilePath, encoding); String strContent = fileContent; myFile.println(strContent); myFile.close(); } catch (Exception e) { message = "创建文件操作出错"; } } /** * 删除文件 * @param filePathAndName 文本文件完整绝对路径及文件名 * @return Boolean 成功删除返回true遭遇异常返回false */ public boolean delFile(String filePathAndName) { boolean bea = false; try { String filePath = filePathAndName; File myDelFile = new File(filePath); if(myDelFile.exists()){ myDelFile.delete(); bea = true; }else{ bea = false; message = (filePathAndName + "删除文件操作出错"); } } catch (Exception e) { message = e.toString(); } return bea; } /** * 删除文件夹 * @param folderPath 文件夹完整绝对路径 */ public void delFolder(String folderPath) { try { delAllFile(folderPath); // 删除完里面所有内容 String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); myFilePath.delete(); // 删除空文件夹 } catch (Exception e) { message = ("删除文件夹操作出错"); } } /** * 删除指定文件夹下所有文件 * @param path 文件夹完整绝对路径 */ public boolean delAllFile(String path) { boolean bea = false; File file = new File(path); if (!file.exists()) { return bea; } if (!file.isDirectory()) { return bea; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件 delFolder(path + "/" + tempList[i]);// 再删除空文件夹 bea = true; } } return bea; } /** * 复制单个文件 * @param oldPathFile 准备复制的文件源 * @param newPathFile 拷贝到新绝对路径带文件名 */ public void copyFile(String oldPathFile, String newPathFile) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPathFile); if (oldfile.exists()) { // 文件存在时 InputStream inStream = new FileInputStream(oldPathFile); // 读入原文件 FileOutputStream fs = new FileOutputStream(newPathFile); byte[] buffer = new byte[1444]; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; // 字节数 文件大小 System.out.println(bytesum); fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { message = ("复制单个文件操作出错"); } } /** * 复制整个文件夹的内容 * @param oldPath 准备拷贝的目录 * @param newPath 指定绝对路径的新目录 */ public void copyFolder(String oldPath, String newPath) { try { new File(newPath).mkdirs(); // 如果文件夹不存在 则建立新文件夹 File a = new File(oldPath); String[] file = a.list(); File temp = null; for (int i = 0; i < file.length; i++) { if (oldPath.endsWith(File.separator)) { temp = new File(oldPath + file[i]); } else { temp = new File(oldPath + File.separator + file[i]); } if (temp.isFile()) { FileInputStream input = new FileInputStream(temp); FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString()); byte[] b = new byte[1024 * 5]; int len; while ((len = input.read(b)) != -1) { output.write(b, 0, len); } output.flush(); output.close(); input.close(); } if (temp.isDirectory()) {// 如果是子文件夹 copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]); } } } catch (Exception e) { message = "复制整个文件夹内容操作出错"; } } /** * 移动文件 */ public void moveFile(String oldPath, String newPath) { copyFile(oldPath, newPath); delFile(oldPath); } /** * 移动目录 */ public void moveFolder(String oldPath, String newPath) { copyFolder(oldPath, newPath); delFolder(oldPath); } public String getMessage() { return this.message; } }
public class InflaterManagerImpl { public static void main(String[] args) throws IOException { ungzip("D:\\newfile\\fe569190-b628-012c-8680-0019e3436cf2.tgz"); } private static void ungzip(String path_tgz) { String path_tar = path_tgz.substring(0, path_tgz.indexOf(".tgz")) + ".tar"; /** * ungzip */ InputStream fis_tgz = null; InputStream gis_tgz = null; FileOutputStream fos_tar = null; File file_tar = null; try { // Input the file which's suffix is tgz fis_tgz = new FileInputStream(path_tgz); gis_tgz = new GZIPInputStream(fis_tgz); // Output the file which's suffix is tar file_tar = new File(path_tar); file_tar.createNewFile(); fos_tar = new FileOutputStream(file_tar); byte[] bytes = new byte[1024]; int size = 0; while ((size = gis_tgz.read(bytes, 0, bytes.length)) != -1) { fos_tar.write(bytes, 0, size); } fos_tar.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos_tar.close(); gis_tgz.close(); fis_tgz.close(); } catch (IOException e) { e.printStackTrace(); } } /** * untar */ InputStream fis_tar = null; TarInputStream tis_tar = null; OutputStream fos_doc = null; try { // Input the file which's suffix is tar fis_tar = new FileInputStream(file_tar); tis_tar = new TarInputStream(fis_tar); TarEntry tarEntry = null; // 关键在于这个TarEntry的理解,实际你的tar包里有多少文件就有多少TarEntry String path_doc = null; while ((tarEntry = tis_tar.getNextEntry()) != null) { if (path_doc == null) { path_doc = path_tgz.substring(0, path_tgz.indexOf(tarEntry.getName().substring(0, tarEntry.getName().length() - 1))); } File tempFile = new File(path_doc + tarEntry.getName()); if (tarEntry.isDirectory()) { tempFile.mkdirs(); } else { tempFile.createNewFile(); fos_doc = new FileOutputStream(tempFile); byte[] buf = new byte[1024]; int size = 0; while ((size = tis_tar.read(buf)) != -1) { fos_doc.write(buf, 0, size); } } } fos_doc.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos_doc.close(); tis_tar.close(); fis_tar.close(); } catch (IOException e) { e.printStackTrace(); } } } }
22 用到了javatar包
发表评论
-
线程过多and高效MIDP编程
2010-05-03 17:42 0见附件 -
XML解析
2010-02-02 23:25 1275下面代码用到了jdom和dom4j两个包 public cl ... -
回车换行符
2010-01-21 13:52 135811 换行符:另起一行,'\n'10,仅仅把一个长行截断成两 ... -
Thread Pool
2010-01-14 15:27 976public class WorkQueue { p ... -
FileConnection
2010-01-12 15:39 15341. 引言 FileConnection API 是一 ... -
Customized Menu for JavaME
2009-10-10 11:36 1097参考文档: http://www.iteye.com/top ... -
自定义repeat()方法
2009-09-23 17:42 1355j2me的Canvas中有一个repeat()回调方法。大部分 ... -
J2ME移植-键值
2009-09-23 15:07 16521. J2ME标准api中Canvas中定义的键值有17(方向 ... -
kxml doc
2009-09-22 14:55 18931. KXmlParser java.lang.Ob ... -
Http线程阻塞分析
2009-08-23 16:48 4373先做一个总结:Http连接线程发生阻塞,会影响其他线程也出现阻 ... -
jar和jad解释
2009-08-20 23:22 1252整理电脑,从F盘挖坟挖出的股东,也贴出来吧 如果是K- ... -
图片在程序内存中的占有量
2009-08-20 17:58 27181. 图片占内存容量计算公式为: 图片所占内存大小 ... -
如何从网络中获取png图片
2009-08-03 19:54 20431. J2ME // 方法1 Connector conn ... -
cmnet和cmwap的访问
2009-07-30 11:06 2364CMWAP(通过WAP网关代理,由WAP网关连接服务器,然后将 ... -
JSR75 FileConnection Optional Package 使用方法
2009-07-29 17:09 1637package forrest.fcop; imp ... -
mobile日志
2009-07-29 16:05 9851.项目中的实际应用 这个demo用到了JSR75 - ... -
DoubleBuffer 实现
2009-07-29 10:22 1291绘制地图的时候会出现图片断裂,屏幕闪烁等绘图效率问题 ... -
System.getProperty(String key)和MIDlet.getAppProperty(String key)
2009-07-13 17:53 20021. System.getProperty(String ... -
WTK的安全特性
2009-07-01 17:28 10851. MIDlet套件签名的背景 ... -
纳米星开发遇到的一些bug
2009-06-30 17:01 10571.Stream和Connection使用后要关闭 ...
相关推荐
在这个数字化迅速发展的时代,文件压缩与解压缩功能已经成为了日常工作和生活中不可或缺的一部分。而解压缩全能王作为一款集多项功能于一身的压缩工具,以其全面性和便捷性成为了用户管理文件的得力助手。本文将深入...
在给定的标题“C++ 压缩解压缩库”中,我们可以推断这是一个针对C++语言的库,专注于文件或数据的压缩与解压缩功能。描述提到这是为VS2012版本编译的,意味着它可能使用了Visual Studio 2012的编译环境,并且库已经...
在IT行业中,文件压缩与解压缩是日常工作中常见的操作,特别是在数据传输、存储优化和软件分发等领域。这里我们主要探讨的是一个简单的工具类,它支持zip、rar、tar等多种格式的压缩和解压缩功能,并且经过实际测试...
在Windows操作系统中,有时我们需要卸载不再使用的软件,如WinZip等解压缩工具。然而,简单地通过控制面板或设置中的“卸载程序”功能往往无法完全移除这些软件,可能会留下右键菜单的快捷方式、注册表残留等问题。...
本篇文章将深入探讨C语言实现的zip解压缩算法源代码,以及与之相关的技术知识点。 首先,我们要了解zip文件格式。Zip是一种广泛使用的文件压缩标准,它能够将多个文件打包成一个单一的压缩文件,便于存储和传输。在...
这样的工具对于网站管理员和开发者来说非常实用,因为它允许他们无需在本地环境中安装解压缩软件,就能直接在服务器上处理文件。然而,使用时需要注意安全问题,如防止恶意文件上传和执行,以及确保解压后的文件路径...
本文将深入探讨“易语言7z解压缩源码”这一主题,包括7z格式、解压缩原理以及易语言在实现解压缩过程中的关键知识点。 7z是一种高效的数据压缩格式,由7-Zip软件创建,它使用了多种压缩算法,如LZMA、PPMd等,以...
《哈夫曼编码压缩解压缩程序的实现及原理》 哈夫曼编码是一种高效的数据压缩方法,它基于字符出现频率构建最优的二叉树结构,从而实现数据的压缩与解压缩。本文将深入探讨哈夫曼编码的原理,并通过一个使用C++编写...
标题中的"C++ zip解压缩"指的是使用C++编程语言来处理ZIP文件格式,这是一种广泛使用的文件打包和压缩格式。ZIP文件可以将多个文件和目录组合到一个单一的档案文件中,并且可以进行压缩以节省存储空间。C++库提供了...
在.NET框架中,C#提供了多种解压缩文件的方法。这里我们将深入探讨两种常见的技术:一种是使用.NET 2.0自带的`System.IO.Compression`命名空间中的`GZipStream`或`DeflateStream`,另一种是利用第三方库如...
本篇文章将深入探讨Linux中的压缩与解压缩技术,包括常用的命令、选项及其应用场景。 1. **gzip命令** - `gzip` 是Linux中最常用的压缩工具,它基于DEFLATE算法,可以有效地减小文件大小。 - 使用 `gzip 文件名` ...
本篇文章将详细介绍如何在UCOS系统中移植ZLIB库以及实现ZIP文件的解压缩。 首先,ZLIB是一个开源的压缩库,它提供了数据的无损压缩和解压缩功能,常用于GIF、PNG等文件格式。移植ZLIB到UCOS涉及到以下几个关键步骤...
在这个"易语言源码易语言GZIP解压缩源码.rar"压缩包中,包含了使用易语言实现GZIP文件解压缩的相关源代码,对于学习易语言以及理解文件压缩技术的开发者来说是一份宝贵的资源。 GZIP是一种广泛使用的数据压缩格式,...
《DFT EDT 压缩解压缩模块详解》 DFT(Design for Testability,可测试性设计)是集成电路设计中的关键部分,旨在提高产品的测试效率和质量。EDT(Embedded DFT Technology)是DFT的一种实现方式,它将测试功能嵌入...
然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...
【标题】:“zip压缩解压缩”这一主题主要涵盖了在计算机编程中如何使用C++语言进行ZIP文件的压缩和解压缩操作。ZIP是一种广泛使用的文件格式,它允许将多个文件打包成一个单一的压缩文件,以节省存储空间和提高传输...
### Linux下的压缩与解压缩详解 #### 一、概述 在Linux系统中,压缩与解压缩功能对于数据管理和传输非常重要。对于初学者来说,掌握基本的压缩与解压缩技巧可以帮助他们更高效地管理文件和目录。本文将详细介绍...
在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...
标题中的“好用的解压缩软件”指的是那些能够高效、便捷地进行文件压缩与解压缩操作的计算机应用程序。这类软件通常具有用户友好的界面和多种压缩格式的支持,以满足不同用户的需求。 描述虽然简洁,但我们可以从中...
标题中的“pb实现压缩与解压缩”指的是使用PowerBuilder(PB)编程语言来实现文件的压缩和解压缩功能。PowerBuilder是一种广泛应用于企业级应用开发的可视化编程工具,尤其擅长数据库应用开发。在这个场景中,开发者...