如何使用Apache Commons-Compress系统库实现将目录(可包含无极目录)压缩为zip格式的压缩文件的应用示例
ccache手册
ccache手册ccache是一个高效的缓存系统,用于加速编译过程。
它通过将编译结果缓存起来,避免重复编译,从而显著提高编译速度。
下面是对ccache手册的800字左右介绍:一、概述ccache是一个基于缓存的编译工具,它能够将编译结果存储在缓存中,以便在下次编译时直接使用,从而加速编译过程。
ccache适用于各种编程语言和编译器,包括C/C++、Java、Python等。
二、安装与配置1.安装ccache:在终端中输入以下命令安装ccache:shellsudo apt-get install ccache2.配置ccache:在终端中输入以下命令配置ccache:shellexport CCACHE_DIR=/path/to/ccache/directory export PATH=/usr/lib/ccache:$PATH其中,CCACHE_DIR指定了ccache缓存目录的路径,PATH 将ccache添加到系统环境变量中。
三、使用方法1.编译代码:使用常规的编译命令编译代码,例如:shellgcc -o myprogram myprogram.c2.使用ccache:在编译命令前添加ccache,例如:shellccache gcc -o myprogram myprogram.c这将使用ccache来缓存编译结果。
如果缓存中存在相同的编译结果,则直接使用缓存结果,否则进行编译并将结果缓存起来。
四、性能优化调整缓存大小:ccache默认使用磁盘空间作为缓存,可以通过调整CCACHE_SIZE环境变量来设置缓存大小。
例如,将缓存大小设置为500MB:shellexport CCACHE_SIZE=500M清理缓存:当缓存占用过多磁盘空间时,可以使用以下命令清理缓存:shellccache -c五、注意事项确保缓存目录具有足够的磁盘空间,以便存储编译结果。
1.在多用户环境中,可能需要设置适当的权限以防止其他用户干扰缓存。
如何使用Apache Commons-Compress系统库实现将目录(可包含无极目录)压缩为zip格式的压缩文件的应用示例
1.1如何使用Apache Commons-Compress系统库实现将目录(可包含无极目录)压缩为zip格式的压缩文件的应用示例1.1.1新建一个J2SE 的Java应用程序项目1、新建一个J2SE 的Java应用程序项目2、设置项目名称为JavaCompress3、创建出名称为JavaCompress的Java应用程序项目1.1.2在所创建出的JavaCompress项目中添加Apache Commons-Compress系统库1、选择项目的属性菜单项目2、选择Java Build Path项目中的libraries卡片页点击其中的“Add External JARs”按钮,并导航到Apache Commons-Compress系统库*.jar包文件所在的目录。
选择Apache Commons-Compress系统库*.jar包文件。
1、新建一个Java应用程序类2、设置类名称为ApacheCommonCompressFolderUtil,程序包名称为com.bluedream.javacompress(1)创建ApacheCommonCompressFolderUtil程序类(2)ApacheCommonCompressFolderUtil程序类的初始代码1、ApacheCommonCompressFolderUtil程序类的代码示例(1)项目局部截图(2)ApacheCommonCompressFolderUtil程序类的代码示例package com.bluedream.javacompress;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import press.archivers.zip.ZipArchiveEntry; import press.archivers.zip.ZipArchiveOutputStream; import press.utils.IOUtils;public class ApacheCommonCompressFolderUtil {/*** 设定文件读写的缓冲区的默认容量为1024(1KB)字节*/public static final int BUFFER_SIZE = 1024;public ApacheCommonCompressFolderUtil(){super();}/**** 将给定的某个目录(包括其中的各个文件)打包到一个指定的*.zip文件中的功能实现方法** @param compressedSourceDirectoryPath 待压缩的原始文件路径名称字符串* @param savedTargetZipFileName 压缩后输出的目标*.zip文件的目录路径和文件名称字符串*/public void doCompressSomeOneDirectoryToZipFile(String compressedSourceDirectoryPath, String savedTargetZipFileName) {OutputStream someOneOutputStream = null;BufferedOutputStream someOneBufferedOutputStream = null;ZipArchiveOutputStream someOneZipArchiveOutputStream = null;File savedTargetZipFileObject = null;File savedTargetZipFileParentDirectoryPath =null;/*** 将压缩后输出的目标*.zip文件的目录路径和文件名称字符串转换为Java File类型的对象*/savedTargetZipFileObject = new File(savedTargetZipFileName);/*** 识别所给定的将压缩后输出的目标*.zip文件的目录路径和文件名称字符串中是否包含有上一级的目录,并识别出该目录是否实际存在;* 如果不存在,则创建出该目录*/savedTargetZipFileParentDirectoryPath = savedTargetZipFileObject.getParentFile();if (!savedTargetZipFileParentDirectoryPath.exists()) {savedTargetZipFileParentDirectoryPath.mkdirs();}/*** 删除有可能是上一次存在后出现的重复的压缩后输出的目标*.zip文件*/savedTargetZipFileObject.delete();/*** 构建出待保存的压缩后输出的目标*.zip文件所对应的输出流对象*/try {someOneOutputStream = new FileOutputStream(savedTargetZipFileObject);someOneBufferedOutputStream = new BufferedOutputStream(someOneOutputStream);someOneZipArchiveOutputStream = new ZipArchiveOutputStream(someOneBufferedOutputStream);/*** 设置对中文压缩的编码为中文GBK编码集*/someOneZipArchiveOutputStream.setEncoding("GBK");doPackSomeOneDirectoryToZipFile(someOneZipArchiveOutputStream, compressedSourceDirectoryPath, "");}catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}finally{if(null!=someOneZipArchiveOutputStream){IOUtils.closeQuietly(someOneZipArchiveOutputStream);}if(null!=someOneBufferedOutputStream){IOUtils.closeQuietly(someOneBufferedOutputStream);}if(null!=someOneOutputStream){IOUtils.closeQuietly(someOneOutputStream);}}}/*** 实现将给定的目录打包为*.zip文件的功能方法* @param someOneZipArchiveOutputStream* @param compressedSourceDirectoryPath* @param compressedSourceDirectoryParentPath* @throws FileNotFoundException* @throws IOException*/public void doPackSomeOneDirectoryToZipFile(ZipArchiveOutputStream someOneZipArchiveOutputStream, String compressedSourceDirectoryPath, String compressedSourceDirectoryParentPath)throws FileNotFoundException,IOException {File compressedSourceDirectoryPathFileObject = null;File[] allFileInCompressedSourceDirectoryPathArray =null;ZipArchiveEntry someOneZipArchiveEntry=null;/*** 将待压缩的原始目录路径字符串转换为Java File类型的对象*/compressedSourceDirectoryPathFileObject =new File(compressedSourceDirectoryPath);/*** 获得待压缩的原始目录路径下的各个文件列表*/allFileInCompressedSourceDirectoryPathArray =compressedSourceDirectoryPathFileObject.listFiles();/*** 如果待压缩的原始目录路径下没有具体文件列表(比如为一个空的目录或者是最后级别的目录),则直接退出处理过程*/if (null== allFileInCompressedSourceDirectoryPathArray||allFileInCompressedSourceDirectoryPathArray.length < 1) { return;}/*** 对所获得待压缩的原始目录路径下的各个文件列表进行迭代*/for (int loopIndex = 0; loopIndex < allFileInCompressedSourceDirectoryPathArray.length; loopIndex++) {/*** 识别其中的某个项目是否是一个文件夹(为下一级目录名称),如果是下一级目录名称,则递归调用*/if (allFileInCompressedSourceDirectoryPathArray[loopIndex].isDirectory()) { doPackSomeOneDirectoryToZipFile(someOneZipArchiveOutputStream,allFileInCompressedSourceDirectoryPathArray[loopIndex].getAbsolutePath(),compressedSourceDirectoryParentPath+allFileInCompressedSourceDirectoryPathArray[loopIndex].getName() + File.separator);}else {/*** 构建出ZipArchiveEntry对象*/someOneZipArchiveEntry=newZipArchiveEntry(compressedSourceDirectoryParentPath+ allFileInCompressedSourceDirectoryPathArray[loopIndex].getName());someOneZipArchiveOutputStream.putArchiveEntry(someOneZipArchiveEntry);IOUtils.copy(newFileInputStream(allFileInCompressedSourceDirectoryPathArray[loopIndex].getAbsolutePath()),someOneZipArchiveOutputStream);someOneZipArchiveOutputStream.closeArchiveEntry();}}}public static void main(String[] args) throws Exception {String compressedSourceDirectoryPath="E:/Tencent/zipTest";String savedTargetZipFileName="E:/pdf/zipTest目录压缩后的结果.zip";ApacheCommonCompressFolderUtil oneApacheCommonCompressUtil =new ApacheCommonCompressFolderUtil();oneApacheCommonCompressUtil.doCompressSomeOneDirectoryToZipFile(compressedSou rceDirectoryPath, savedTargetZipFileName);}}2、准备测试用的待压缩的原始目录本示例所需要的待压缩的原始目录为:E:/Tencent/zipTest,在该目录中包含有下一级子目录和多个文件和中文文件名称的文件,主要测试是否支持中文文件名称的压缩功能。
filesystem库用法
filesystem库用法文件系统库(filesystem library)是C++17新增的标准库之一,用于简化和统一文件和目录的操作。
使用filesystem库的一般步骤如下:1. 包含头文件:`#include <filesystem>`2. 命名空间:`using namespace std::filesystem;`3. 使用库中的功能,例如:- 创建目录:`create_directory(path);`- 删除目录或文件:`remove(path);`- 拷贝或移动目录或文件:`copy(path1, path2);` 或`rename(path1, path2);`- 获取文件大小:`file_size(path);`- 判断路径是否存在:`exists(path);`- 判断是否为目录:`is_directory(path);`- 遍历目录中的文件和子目录:使用迭代器或递归函数等。
以下是一个简单的示例代码,演示了filesystem库的基本用法:```cpp#include <iostream>#include <filesystem>using namespace std::filesystem;int main() {path filePath = "path/to/file.txt";if (exists(filePath)) {if (is_directory(filePath)) {std::cout << "Path is a directory." << std::endl;} else {std::cout << "Path is a file." << std::endl;std::cout << "Size: " << file_size(filePath) << " bytes." << std::endl;}} else {std::cout << "Path does not exist." << std::endl;}return 0;}```上述代码会判断给定的路径是否存在,并输出路径类型(文件还是目录)和文件大小(如果是文件的话)。
Apache-增加C++和SSL模块的支持
Apache-增加C++和SSL模块的支持一、Apache-compile-setupapache的httpd-2.2.15.tar.gz版本配置:# --enable-mods-shared=most1、./configure --enable-ssl --enable-so2、make3、make install二、Apache-module-cpp1、pls view Makefile for cpp first;2、make (replace apxs -c cpphello.c);3、apxs -i -a -n cpphello mod_cpphello.so4、vi httpd.conf (add the following contents)LoadFile /usr/lib/libstdc++-libc6.2-2.so.3LoadModule cpphello_module modules/mod_cpphello.so<Location /cpphello>SetHandler cpphello</Location>5、httpd -k start三、Apache-module-teching1、apxs -g -n hello2、apxs -c mod_hello.c3、apxs -i -a -n hello mod_四、Apache-openssl-usingcd /usr/local/apache2/conf/1、openssl genrsa -des3 -out server.key 10242、openssl req -new -key server.key -out server.csr3、openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt4、chmod 400 server.key5、chmod 400 server.crt6、vi httpd.conf# Secure (SSL/TLS) connectionsInclude conf/extra/httpd-ssl.conf7、./httpd -k start五、httpd.conf增加C++# These paths are good for debian, you should edit the paths as# appropriate for your system.# Must load the standard c++ library in order to use modules which# were originally written in C++.LoadFile /usr/lib/libstdc++-libc6.2-2.so.3# And configure it.LoadModule cpphello_module modules/mod_cpphello.so<Location /cpphello>SetHandler cpphello</Location>六、Makefile#### Makefile -- Build procedure for fast3lpoad Apache module#### This is a C++ module so things have to be handled a little differently.builddir=.top_srcdir=/usr/local/apache2top_builddir=/usr/local/apache2# include /usr/local/apache2/build/special.mk# the used toolsAPXS=/usr/local/apache2/bin/apxsAPACHECTL=/usr/local/apache2/bin/apachectl# Get all of apxs's internal values.APXS_CC=`$(APXS) -q CC`APXS_TARGET=`$(APXS) -q TARGET`APXS_CFLAGS=`$(APXS) -q CFLAGS`APXS_SBINDIR=`$(APXS) -q SBINDIR`APXS_CFLAGS_SHLIB=`$(APXS) -q CFLAGS_SHLIB`APXS_INCLUDEDIR=`$(APXS) -q INCLUDEDIR`APXS_LD_SHLIB=`$(APXS) -q LD_SHLIB`APXS_LIBEXECDIR=`$(APXS) -q LIBEXECDIR`APXS_LDFLAGS_SHLIB=`$(APXS) -q LDFLAGS_SHLIB`APXS_SYSCONFDIR=`$(APXS) -q SYSCONFDIR`APXS_LIBS_SHLIB=`$(APXS) -q LIBS_SHLIB`CURL_LIBS_SHLIB=-lcurl -lnsl -lssl -lcrypto# the default targetall: mod_cpphello.so# compile the shared object file. use g++ instead of letting apxs call# ld so we end up with the right c++ stuff. We do this in two steps,# compile and link.# compilemod_cpphello.o: mod_cpphello.cppg++ -c -fPIC -I$(APXS_INCLUDEDIR) -I. $(APXS_CFLAGS) $(APXS_CFLAGS_SHLIB) -Wall -o $@ $<MyTest.o: MyTest.cpp MyTest.hg++ -c -fPIC -I. -Wall -o $@ $<# linkmod_cpphello.so: mod_cpphello.o MyTest.og++ -fPIC -shared -o $@ $^ $(APXS_LIBS_SHLIB) $(CURL_LIBS_SHLIB)# install the shared object file into Apache allinstall:$(APXS) -i -a -n cpphello mod_cpphello.so# display the apxs variablescheck_apxs_vars:@echo APXS_CC $(APXS_CC);\echo APXS_TARGET $(APXS_TARGET);\echo APXS_CFLAGS $(APXS_CFLAGS);\echo APXS_SBINDIR $(APXS_SBINDIR);\echo APXS_CFLAGS_SHLIB $(APXS_CFLAGS_SHLIB);\echo APXS_INCLUDEDIR $(APXS_INCLUDEDIR);\echo APXS_LD_SHLIB $(APXS_LD_SHLIB);\echo APXS_LIBEXECDIR $(APXS_LIBEXECDIR);\echo APXS_LDFLAGS_SHLIB $(APXS_LDFLAGS_SHLIB);\echo APXS_SYSCONFDIR $(APXS_SYSCONFDIR);\echo APXS_LIBS_SHLIB $(APXS_LIBS_SHLIB)# cleanupclean:-rm -f *.so *.o *~# install and activate shared object by reloading Apache to# force a reload of the shared object filereload: install restart# the general Apache start/restart/stop# proceduresstart:$(APACHECTL) startrestart:$(APACHECTL) restartstop:$(APACHECTL) stop七、mod_cpphello.cpp/*** mod_cpphello.cpp -- Apache sample cpphello module** [Autogenerated via ``apxs -n cpphello -g'']**** To play with this sample module first compile it into a** DSO file and install it into Apache's modules directory** by running:**** $ apxs -c -i mod_cpphello.cpp**** Then activate it in Apache's httpd.conf file for instance** for the URL /cpphello in as follows:**** # httpd.conf** LoadModule cpphello_module modules/mod_cpphello.so** <Location /cpphello>** SetHandler cpphello** </Location>**** Then after restarting Apache via**** $ apachectl restart**** you immediately can request the URL /cpphello and watch for the ** output of this module. This can be achieved for instance via:**** $ lynx -mime_header http://localhost/cpphello**** The output should be similar to the following one:**** HTTP/1.1 200 OK** Date: Tue, 31 Mar 1998 14:42:22 GMT** Server: Apache/1.3.4 (Unix)** Connection: close** Content-Type: text/html**** The sample page from mod_cpphello.cpp*/#include "httpd.h"#include "http_config.h"#include "http_protocol.h"#include "ap_config.h"#include "MyTest.h"/* The sample content handler */static int cpphello_handler(request_rec *r){if (strcmp(r->handler, "cpphello")) {return DECLINED;}r->content_type = "text/html";// if (!r->header_only)// ap_rputs("The sample page from mod_cpphello.cpp\n", r);MyTest mt;ap_rprintf(r, "The cURL ret : %s \n", mt.HttpsTest());return OK;}static void cpphello_register_hooks(apr_pool_t *p){ap_hook_handler(cpphello_handler, NULL, NULL, APR_HOOK_MIDDLE);}/* Dispatch list for API hooks */module AP_MODULE_DECLARE_DA TA cpphello_module = {STANDARD20_MODULE_STUFF,NULL, /* create per-dir config structures */NULL, /* merge per-dir config structures */NULL, /* create per-server config structures */NULL, /* merge per-server config structures */NULL, /* table of config file commands */cpphello_register_hooks /* register hooks */ };八、MyTest.cpp#include "MyTest.h"MyTest::MyTest(){curl=curl_easy_init();}MyTest::~MyTest(){curl_easy_cleanup(curl);curl=NULL;}char* MyTest::HttpsTest(){char* pRet=NULL;if(curl){curl_easy_setopt(curl, CURLOPT_URL, "https:///i-trade/singlelogin.jsp");#ifdef SKIP_PEER_VERIFICA TIONcurl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);#endif#ifdef SKIP_HOSTNAME_VERFICA TIONcurl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);#endifCURLcode res = curl_easy_perform(curl);if(CURLE_OK == res){res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &pRet);}}return pRet;}九、MyTest.h#include <stdio.h>#include <curl/curl.h>#define SKIP_PEER_VERIFICA TIONclass MyTest{public:MyTest();virtual ~MyTest();char* HttpsTest();private:CURL *curl;};十、httpd.conf增加SSL# Secure (SSL/TLS) connectionsInclude conf/extra/httpd-ssl.conf## Note: The following must must be present to support# starting without SSL on platforms with no /dev/random equivalent# but a statically compiled-in mod_ssl.#<IfModule ssl_module>SSLRandomSeed startup builtinSSLRandomSeed connect builtin</IfModule>十一、server.crt-----BEGIN CERTIFICA TE-----MIICeTCCAeICCQCdq6OvBB0bezANBgkqhkiG9w0BAQUFADCBgDELMAkGA1UEBh MCQ0gxEDAOBgNVBAgTB0JlaWppbmcxEDAOBgNVBAcTB0JlaWppbmcxCzAJBgNVBA oTAkpSMQwwCgYDVQQLEwNERVYxEDAOBgNVBAMTB0ZSRUVET00xIDAeBgkqhki G9w0BCQEWEXlvbmdsaWxpdUB0b20uY29tMB4XDTEwMDUyNTA3MzIwNloXDTEzMDIxO DA3MzIwNlowgY AxCzAJBgNVBAYTAkNIMRA wDgYDVQQIEwdCZWlqaW5nMRA wDgYD VQQHEwdCZWlqaW5nMQswCQYDVQQKEwJKUjEMMAoGA1UECxMDREVWMRA wDgYD VQQDEwdGUkVFRE9NMSA wHgYJKoZIhvcNAQkBFhF5b25nbGlsaXV AdG9tLmNvbTCBnzANBgkq hkiG9w0BAQEFAAOBjQA wgYkCgYEAxFqiAK4V7mL+i1yX8RV yvmIZUGXLP2u8SuzH Nz1ZeRWPOC/unnsV oxvUYyC87Z5Bw V yU/pTUG9Ge2edrX354utyNotD3aFO/+rZciR+X5x0C36gcEvZFXyXvB3UAQcWO3DL16PtEPVW2yMSY2ociQxlbDepxnnVifGwC IHTPJKkCA wEAA TANBgkqhkiG9w0BAQUFAAOBgQCbERy3TPIOTU0jQtFmBq+JFv0kiugjluKg58f7ehmoUGRGu8OSrwFmNQvYRI2X6BmlVxonIKc V6nvsQ4T4k3XOChEs Vgh3fS/ffjzyB+wINjtUqVbeEI1r1edXfiIwL90ZckLK1zCTIqH2Xm9e71Pnwfkxl3fPgCcZ/GX8Pdjzng==-----END CERTIFICA TE-----十二、server.csr-----BEGIN CERTIFICA TE REQUEST-----MIIBwTCCASoCAQA wgY AxCzAJBgNVBAYTAkNIMRA wDgYDVQQIEwdCZWlqaW5n MRA wDgYDVQQHEwdCZWlqaW5nMQswCQYDVQQKEwJKUjEMMAoGA1UECxMDREVW MRA wDgYDVQQDEwdGUkVFRE9NMSA w HgYJKoZIhvcNAQkBFhF5b25nbGlsaXV AdG9tLmNvbTC BnzANBgkqhkiG9w0BAQEFAAOBjQA wgYkCgYEAxFqiAK4V7mL+i1yX8RV yvmIZUGX LP2u8SuzHNz1ZeRWPOC/unnsV oxvUYyC87Z5Bw V yU/pTUG9Ge2edrX354utyNotD3aFO/+rZciR+X5x0C36gcEvZFXyXvB3UAQcWO3DL16PtEPVW2yMSY2ociQxlbDepx nnVifGwCIHTPJKkCA wEAAaAAMA0GCSqGSIb3DQEBBQUAA4GBAJMyOPJ05HSqG UaHLiUeAIz0a63b1AfntLQXSFvQQ0EhbGIMBl5aPxiBUfRkKg+R1FqPOmk6OOP9QFD4 Kn5DNmckqFQQL8LphMj899E2DIL0BbPDgPsF7b55scUbbWCkTeIkCP8l3aQYHsuu Bxx5DlGouY+Jm8LXY uTkCQgr3nh3-----END CERTIFICA TE REQUEST-----十三、server.key-----BEGIN RSA PRIV A TE KEY-----Proc-Type: 4,ENCRYPTEDDEK-Info: DES-EDE3-CBC,45D3446F377624A2pK2LfBp0YPMAt0U4YC4W9KDfADSZMW6Nifsbe1mMWJhUyQVOhuggXSD4xGtDgx 1CIVFF+5EA2NK3jsulNLXSr0YOPs5Ib5bl5qxBLInP7qqIEMY1PZl1CSaIkD2MSNnzo+YSjz4LFQ2uhft2ntG7xu4yl0CbRZTqMBW2lQJ2qiu0AZv7fUyCNUMMJrr5WfU5hX+QX/uztdlfkvI+Xu9GCyFFhenCPOfZMXLx1ll5Q44x30tiKPhW+rTRqIuhjMh9mw42jP+ak6/Pl4tii3q7NPo+nasJRZez0GW1adDnI++Xy2rcBFb5WUdj/KXYO8Dm8AHiNU+x2TbnpcR418VmavU5C0zRq4mHhI7lAUNZ6dKke9r3cqFCe8yliMtMCV riBtkgGh/NMTjqRl1/XgjAGzR94lV6LYw A8e/nfYhiWcAzmwh+3l/JPouBoGOOVL+zvLEOXima5L70Z6rxIz7j4c2DAIpohUlb6p0FfQ+K5RR8A VLB9bnUAMw0lQtlyrogK9/Ezx/92YzgdwHgEsAPm+q9IhvhYPa3vNIPPQnY3AMlYdqikc6LLwwASmpiD1cj6c0Wb5NN7LmbE8pc999jbWoPczA vk1NXJd4gXTrW/rFItN3hyr4owtN/VEvMESPDPjatl/q7Uih7V7vu5OHZy9+lVvBXSFF8L4908WLNtEE+0njzHs05o16Y qRBHjVfgc3KgflRdX1fNklJMP/FaPmeHDGMRqMOsBrOpMLwRn/plRfMVEEGUs8y7vxCroYd7 tf+NA5xjgzeeOphNBHdGXEKXcCNWuzde+GsrY vPIDnlUChLBd7eEMA==-----END RSA PRIV A TE KEY-----。
Apache POI使用教程
Apache POI使用教程Apache POI是一个开源的Java库,用于操作Microsoft Office文件,例如Word、Excel和PowerPoint。
它提供了一套Java API,可用于读取、创建和修改这些文件的内容。
本教程将介绍Apache POI的基本用法和示例。
一、安装Apache POI要开始使用Apache POI,首先需要在项目中添加POI的依赖库。
可以通过Maven或手动下载POI的JAR文件来完成。
二、导入POI库在Java代码中导入POI库,以便可以使用其中的功能。
```javaimport org.apache.poi.*;```三、创建Excel文件使用Apache POI可以轻松地创建和编辑Excel文件。
下面是一个简单的示例,演示如何创建一个包含多个工作表和单元格的Excel文件。
```javaimport ermodel.*;import ermodel.*;public class CreateExcelFile {public static void main(String[] args) {Workbook workbook = new XSSFWorkbook();Sheet sheet1 = workbook.createSheet("Sheet1");Sheet sheet2 = workbook.createSheet("Sheet2");// 创建行和单元格Row row1 = sheet1.createRow(0);Cell cell1 = row1.createCell(0);cell1.setCellValue("Hello");// 保存Excel文件try {FileOutputStream outputStream = new FileOutputStream("example.xlsx");workbook.write(outputStream);outputStream.close();System.out.println("Excel file created successfully.");} catch (IOException e) {e.printStackTrace();}}}```四、读取Excel文件使用Apache POI可以方便地读取现有的Excel文件。
common fileupload详解
Commons-fileupload工具的API与开发实例解析(一)文件上传组件的应用与编写在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传邮件附件、个人相片、共享资料等。
对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”即可;但在Web服务器端如何获取浏览器上传的文件,需要进行复杂的编程处理。
为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件。
本章将详细介绍如何使用Apache文件上传组件,以及分析该组件源程序的设计思路和实现方法。
1.1 准备实验环境按下面的步骤为本章的例子程序建立运行环境:(1)在Tomcat 5.5.12的<tomcat的安装目录>\webapps目录中创建一个名为fileupload的子目录,并在fileupload目录中创建一个名为test.html的网页文件,在该文件中写上“这是test.html页面的原始内容!”这几个字符。
(2)在<tomcat的安装目录>\webapps\fileupload目录中创建一个名为WEB-INF 的子目录,在WEB-INF目录中创建一个名为classes的子目录和一个web.xml文件,web.xml文件内容如下:<web-app></web-app>(3)要使用Apache文件上传组件,首先需要安装Apache文件上传组件包。
在<tomcat的安装目录>\webapps\fileupload\WEB-INF目录中创建一个名为lib的子目录,然后从网址/commons/fileupload下载到Apache组件的二进制发行包,在本书的附带带光盘中也提供了该组件的二进制发行包,文件名为commons-fileupload-1.0.zip。
Apache Commons3
js 代码<script ty pe="text/javascript"><!--google_ad_client = "pub-4547838183514670";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as_rimg";google_cpa_choice = "CAAQtYKvjAIaCCp3m2tiP3qxKIvN93MwAA";google_ad_channel = "";//--></script><script ty pe="text/javascript" src="http://pagead2.googlesy /pagead/show_ads.js"></script>Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。
我选了一些比较常用的项目做简单介绍。
文中用了很多网上现成的东西,我只是做了一个汇总整理。
Commons BeanUtils/commons/beanutils/index.html说明:针对Bean的一个工具集。
由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。
使用示例:功能有很多,网站上有详细介绍。
一个比较常用的功能是Bean Copy,也就是copy bean的属性。
如果做分层架构开发的话就会用到,比如从PO(Persistent Object)拷贝数据到VO(Value Object)。
传统方法如下://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);使用BeanUtils后,代码就大大改观了,如下所示://得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//构造Teacher对象Teacher teacher=new Teacher();//赋值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库HibernateDAO= ;HibernateDAO.save(teacher);Commons CLI/commons/cli/index.html说明:这是一个处理命令的工具。
Jakarta Commons 巧用类和组件
Jakarta Commons:巧用类和组件Jakarta Commons是Jakarta的子项目,它创建和维护着许多独立软件包,这些包一般与其他框架或产品无关,其中收集了大量小型、实用的组件,大部分面向服务器端编程。
Commons的包分成两部分:Sandbox,Commons代码库。
Sandbox是一个测试平台,用来检验各种设想、计划。
本文介绍的组件属于Commons代码库,文章将展示各个组件的功能、适用场合,并通过简单的例子介绍其用法。
一、概述可重用性是Jakarta Commons项目的灵魂所在。
这些包在设计阶段就已经考虑了可重用性问题。
其中一些包,例如Commons里面用来记录日志的Logging 包,最初是为其他项目设计的,例如Jakarta Struts项目,当人们发现这些包对于其他项目也非常有用,能够极大地帮助其他项目的开发,他们决定为这些包构造一个"公共"的存放位置,这就是Jakarta Commons项目。
为了真正提高可重用性,每一个包都必须不依赖于其他大型的框架或项目。
因此,Commons项目的包基本上都是独立的,不仅是相对于其他项目的独立,而且相对于Commons内部的大部分其他包独立。
虽然存在一些例外的情况,例如Betwixt包要用到XML API,但绝大部分只使用最基本的API,其主要目的就是要能够通过简单的接口方便地调用。
不过由于崇尚简洁,许多包的文档变得过于简陋,缺乏维护和支持,甚至有一部分还有错误的链接,文档也少得可怜。
大部分的包需要我们自己去找出其用法,甚至有时还需要我们自己去分析其适用场合。
本文将逐一介绍这些包,希望能够帮助你迅速掌握这一积累了许多人心血的免费代码库。
说明:Jakarta Commons和Apache Commons是不同的,后者是Apache Software Foundation的一个顶层项目,前者则是Jakarta项目的一个子项目,同是也是本文要讨论的主角。
使apache解析域名到目录的方法
apache如何将一个域名自动定位到目录有两种解决办法首先,你的拥有一个有泛域名解析的顶级域名,例如:其次,在httpd.conf 中打开mod_rewrite之后,在httpd.conf 的最后,添加以下内容:RewriteEngine onRewriteMap lowercase int:tolowerRewriteMap vhost txt:/usr/local/etc/apache/vhost.mapRewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$RewriteCond ${vhost:%1} ^(/.*)$RewriteRule ^/(.*)$ %1/$1其中的/usr/local/etc/apache 是你的apache 服务器配置文件所在路径,根据实际情况更改。
然后,在这个所在路径的目录下创建一个文件:vhost.map内容为: /usr/local/www/data-dist/domain /usr/local/www/data-dist/bbs /usr/local/www/data-dist/anyname以上部分都是:”域名+空格+绝对路径”的形式。
最后,在你的网站根目录/usr/local/www/data-dist 下,创建对应目录:domain , bbs , anyname 等等,理论上可以无限。
这样,通过浏览器,访问 时,实际上访问的就是/usr/local/www/data-dist/domain目录下的文件。
同理,访问 实际上访问的就是/usr/local/www/data-dist/bbs 目录下的文件。
而且,你可以随时更改vhost.map 来增加、删除、修改你的二级域名和所指向的实际路径,不用重启apache。
第一步:打开apache的配置文件httpd.conf,去掉LoadModule rewrite_modulemodules/mod_rewrite.so前面的#号。
应用Apache Commons-Compress系统库实现将文件压缩为zip格式文件
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
3/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
4/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
5/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
9/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
6/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
7升必读系列资料
杨教授大学堂,版权所有,盗版必究。
8/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1 应用 Apache Commons-Compress 系统库实现将文件压缩为 zip 格式 文件
杨教授大学堂,版权所有,盗版必究。
1/9 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
2/9 页
c++ mkir用法
c++ mkir用法摘要:C++ mkdir用法教程:创建目录、删除目录、重命名目录1.C++ mkdir简介2.C++ mkdir函数用法a.创建目录b.删除目录c.重命名目录3.实例演示4.注意事项5.总结正文:C++ mkdir用法教程:创建目录、删除目录、重命名目录1.C++ mkdir简介C++ mkdir是C++标准库中的一个函数,用于操作目录。
它可以创建目录、删除目录和重命名目录。
目录操作在计算机编程中非常常见,尤其是在文件管理系统、文件传输等领域。
2.C++ mkdir函数用法C++ mkdir函数有以下三种用法:a.创建目录```cpp#include <iostream>#include <string>#include <filesystem>int main() {std::string dir_path = "example_directory";std::error_code ec;bool result = std::filesystem::create_directory(dir_path, ec);if (ec) {std::cerr << "创建目录失败:" << ec.message() << std::endl;return 1;}std::cout << "目录创建成功:" << dir_path << std::endl;return 0;}```b.删除目录```cpp#include <iostream>#include <string>#include <filesystem>int main() {std::string dir_path = "example_directory";std::error_code ec;bool result = std::filesystem::remove(dir_path, ec);if (ec) {std::cerr << "删除目录失败:" << ec.message() << std::endl;return 1;}std::cout << "目录删除成功:" << dir_path << std::endl;return 0;}```c.重命名目录```cpp#include <iostream>#include <string>#include <filesystem>int main() {std::string old_dir_path = "old_directory";std::string new_dir_path = "new_directory";std::error_code ec;bool result = std::filesystem::rename(old_dir_path, new_dir_path, ec);if (ec) {std::cerr << "重命名目录失败:" << ec.message() << std::endl;return 1;}std::cout << "目录重命名成功:" << old_dir_path << " 变为" << new_dir_path << std::endl;return 0;}```3.实例演示请参考上述代码实例,根据实际需求进行修改和调试。
Apache显示目录列表及icons目录的问题
Apache显⽰⽬录列表及icons⽬录的问题今天想部署下开源项⽬pig,发现它的mysql需要5.7.8 +,为了能⽀持多个版本并且可以⽅便切换,所以选择了phpstudy_pro刚开始Apache不⽀持⽬录访问修改配置<VirtualHost _default_:80>DocumentRoot "D:/WWW"FcgidInitialEnv PHPRC "D:/phpstudy_pro/Extensions/php/php7.3.4nts"AddHandler fcgid-script .phpFcgidWrapper "D:/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .php<Directory "D:/WWW">Options Indexes FollowSymLinks ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire all grantedDirectoryIndex index.php index.html</Directory></VirtualHost>关键: Indexes显⽰⽬录添加后发现搜索了下Apache的配置⽬录conf,发现在conf/original/extra/httpd-autoindex.conf,将下⾯的都注释掉#Alias /icons/ "${SRVROOT}/icons/"#<Directory "${SRVROOT}/icons"># Options Indexes MultiViews# AllowOverride None# Require all granted#</Directory>## AddIcon* directives tell the server which icon to show for different# files or filename extensions. These are only displayed for# FancyIndexed directories.#AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip#AddIconByType (TXT,/icons/text.gif) text/*#AddIconByType (IMG,/icons/image2.gif) image/*#AddIconByType (SND,/icons/sound2.gif) audio/*#AddIconByType (VID,/icons/movie.gif) video/*#AddIcon /icons/binary.gif .bin .exe#AddIcon /icons/binhex.gif .hqx#AddIcon /icons/tar.gif .tar#AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv#AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip#AddIcon /icons/a.gif .ps .ai .eps#AddIcon /icons/layout.gif .html .shtml .htm .pdf#AddIcon /icons/text.gif .txt#AddIcon /icons/c.gif .c#AddIcon /icons/p.gif .pl .py#AddIcon /icons/f.gif .for#AddIcon /icons/dvi.gif .dvi#AddIcon /icons/uuencoded.gif .uu#AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl#AddIcon /icons/tex.gif .tex#AddIcon /icons/bomb.gif core#AddIcon /icons/back.gif ..#AddIcon /icons/hand.right.gif README#AddIcon /icons/folder.gif ^^DIRECTORY^^#AddIcon /icons/blank.gif ^^BLANKICON^^注: 对于没有进⾏安全配置的Apache服务器,默认情况可以⽤/icons/的⽅式打开Apache⽬录下的icons⽂件夹,并且会罗列出⽂件列表,这样很不安全。
commons-fileupload教程
parseRequest 方法还有一个重载方法, 该方法集中处理上述所有方法的功能, 其完整语法定 义如下: parseRequest(HttpServletRequest req,int sizeThreshold,long String path) 这两个 parseRequeБайду номын сангаасt 方法都会抛出 FileUploadException 异常。 sizeMax,
3. setRepositoryPath 方法
setRepositoryPath 方法用于设置 setSizeThreshold 方法中提到的临时文件的存放目录, 这 里要求使用绝对路径。其完整语法定义如下: public void setRepositoryPath(String repositoryPath) 如果不设置存放路径,那么临时文件将被储存在"java.io.tmpdir"这个 JVM 环境属性所指定 的目录中,tomcat 5.5.9 将这个属性设置为了“<tomcat 安装目录>/temp/”目录。
的 文 件 很 小 , 例 如 上 传 600 个 字 节 的 文 件 , 显 然 将 其 直 接 保 存 在 内 存 中 更 加 有 效 。 setSizeThreshold 方法用于设置是否使用临时文件保存解析出的数据的那个临界值, 该方法传入 的参数的单位是字节。其完整语法定义如下: public void setSizeThreshold(int sizeThreshold)
1.setSizeMax 方法
setSizeMax 方法用于设置请求消息实体内容的最大允许大小, 以防止客户端故意通过上传特 大的文件来塞满服务器端的存储空间,单位为字节。其完整语法定义如下: public void setSizeMax(long sizeMax) 如果请求消息中的实体内容的大小超过了 setSizeMax 方法的设置值,该方法将会抛出 FileUploadException 异常。
apache的java开源项目简介
Apache 上全部JAVA 开源项目简介最近接触Jakarta-Common-BeanU ls 这个东东比较多,于是对Apache Jakarta Project 产生了产生了兴趣,兴趣,上他们的官方网站上看了下感觉有用的东西好多,上他们的官方网站上看了下感觉有用的东西好多,上他们的官方网站上看了下感觉有用的东西好多,眼花缭乱的,眼花缭乱的,眼花缭乱的,又没有中文网站,又又没有中文网站,又上各大论坛搜了下,上各大论坛搜了下,也没有发现一个集中该也没有发现一个集中该项目的资料,于是决定自己整理翻译一下,于是决定自己整理翻译一下,有助有助于各位网友更好的了解该项目。
如果有什么描述不对不全面的地方,希望各位提出来给大家分享。
分享。
Jakarta 项目是ASF(The Apache So ware Founda on)的一部分。
ASF 是一个非赢利组织,她鼓励基于开放的软件许可下进行合作、励基于开放的软件许可下进行合作、注重实效的开发,注重实效的开发,并提供各个领域的高质量软件,并提供各个领域的高质量软件,她涉她涉及到及到 H p 服务器,编译工具,类库,开发架构,服务器端Java 技术,J2EE 容器,数据库工具,日志工具,XML 解析等等诸多领域。
ASF 提供的java 项目有一部分在Jakarta 中,还有一些成为独立的诸如T omcat 的项目,Jakarta 项目则提供了多种多样开源的java 解决通用方案。
案。
先介绍一下ASF 中和Jakarta 项目并列的java 项目:Ant ————java java 构建工具,使用一个配置文件就可以完成java 的项目的,编译、打包、测试、运行、部署、生成文档等诸多工作。
运行、部署、生成文档等诸多工作。
Avalon ——是一个包括核心框架、工具、组件和容器的面向组件编程(AOP )的完整开发平台。
使用关键设计模式,如反向控制模式(IoC )和分离考虑模(SoC )。
ApacheCommonsConfiguration使用(自动加载修改配置)
ApacheCommonsConfiguration使用(自动加载修改配置)项目开发过程中不免有许多在运行过程中需要经常改动的参数,比如说数据库的连接参数等。
把这些需要经常改动的参数保存在配置文件中,让用户可以修改,这样既增强了项目的适应能力,也减少了我们的维护成本。
这种做法不失为一个很好选择。
不过,这并不是一个很新的技巧,在很早的Windows版本中就有大量的INI文件,还有功能更加强大的注册表。
在课堂上我们已经学习了把Oracle的配置参数保存在属性文件(.properties)中,在运行的过程中读取使用,使用也比较简单,只需要查看一下Sun的JDK帮助文档,找到Properties类,使用该类的load()方法加载.properties文件,并用里面提供的getProperties(key)方法读取属性值就可以了。
但是使用properties文件也有它的不足之处,另外一种选择就是把配置参数保存在XML文件中,使用Apache 提供的Commons Configuration进行读取。
Configuration可以操作如下类型的文件: Properties filesXML documentsWindows INI filesProperty list files (plist)JNDIJDBC DatasourceSystem propertiesApplet parametersServlet parameters今天就给大家举个用Apache Commons Configuration读取XML文件的例子,首先到下载Commons Configuration的jar包,最新版本是commons-configuration-1.5.jar并且还需要同时下载: commons-lang-2.3.jarcommons-collections-3.2.jarcommons-logging-1.1.1.jar这三个包是必须的,我下载的都是最新版本,版本不统一可能会出现问题,可以自己试验一下.我用的开发工具是Eclipse3.2。
maven commons-codec 使用
maven commons-codec 使用Commons-codec是Apache Commons子项目中的一个用于对字符串或二进制数据进行加密和解密处理的Java代码库。
其提供了编码(输出)/解码(输入)、摘要、摘要认证等功能,满足各种用户需求。
一、关于Commons-codec1、什么是Commons-codec?Commons-codec是由Apache提供的一个子项目,它是基于对字符串或二进制数据进行加密和解密处理的Java代码库;2、Commons-codec功能?Commons-codec提供了编码(输出)/解码(输入)、摘要、摘要认证等常见功能;3、Commons-codec的使用范围?Commons-codec的使用范围非常广泛,可以用于多种编码,解码和数据加密解密任务。
二、Commons-codec 实际应用1、对登录注册及验证码的加密Commons-codec可以用于对用户的登录信息,以及用户输入的验证码等信息进行加密存储,以此来提高网站的安全性,避免用户信息被窃取或未经授权访问;2、实现数据签名Commons-codec可以通过摘要算法(如MD5/SHA1/SHA256等)对消息体进行签名,从而实现消息的完整性和可靠性;3、进行文件的压缩处理Commons-codec可以对文本或二进制文件进行压缩处理,以减少文件体积,提高传输效率。
三、Commons-codec使用注意事项1、首先要将Commons-codec添加进项目中,以便在项目使用Commons-codec;2、在使用Commons-codec时要注意密码安全,确保用户和密码被加密或者摘要认证后均不能被显示;3、尽量避免将文件存储在服务器端,而应该将文件以字符流的形式读取出来并写入客户端;4、不要使用未经授权的Commons-codec,除非是官方推荐的版本;5、一定要确保客户端及服务器端都使用同一种Commons-codec,以便对收发的数据进行正确的加解密处理。
java ziparchiveoutputstream 用法
java ziparchiveoutputstream 用法Java中的ZipArchiveOutputStream类是一个用于创建ZIP文件的类,它继承自ZipOutputStream类。
使用ZipArchiveOutputStream可以方便地创建ZIP文件,同时支持ZIP64扩展和多种压缩方法。
以下是使用Java ZipArchiveOutputStream类创建ZIP文件的基本步骤:1. 导入相关类:```javaimport press.archivers.zip.ZipArchiveEntry; importpress.archivers.zip.ZipArchiveOutputStream; ```2. 创建ZipArchiveOutputStream对象:```javaZipArchiveOutputStream zipOutput = new ZipArchiveOutputStream(new FileOutputStream("output.zip"));```3. 创建ZipArchiveEntry对象,并添加到ZipArchiveOutputStream中:```javaZipArchiveEntry entry = new ZipArchiveEntry("file.txt");zipOutput.putArchiveEntry(entry);```4. 将文件内容写入ZipArchiveOutputStream中:```javaFileInputStream input = new FileInputStream("file.txt");byte[] buffer = new byte[1024];int len;while ((len = input.read(buffer)) > 0) {zipOutput.write(buffer, 0, len);}input.close();```5. 关闭ZipArchiveOutputStream:```javazipOutput.close();```完整的示例代码如下:```javaimport press.archivers.zip.ZipArchiveEntry; importpress.archivers.zip.ZipArchiveOutputStream; import java.io.*;public class ZipExample {public static void main(String[] args) throws IOException {// 创建ZipArchiveOutputStream对象ZipArchiveOutputStream zipOutput = new ZipArchiveOutputStream(new FileOutputStream("output.zip"));// 创建ZipArchiveEntry对象,并添加到ZipArchiveOutputStream 中ZipArchiveEntry entry = new ZipArchiveEntry("file.txt");zipOutput.putArchiveEntry(entry);// 将文件内容写入ZipArchiveOutputStream中FileInputStream input = new FileInputStream("file.txt");byte[] buffer = new byte[1024];int len;while ((len = input.read(buffer)) > 0) {zipOutput.write(buffer, 0, len);}input.close();// 关闭ZipArchiveOutputStreamzipOutput.close();}}```。
ApacheCommonsLang3.10使用简介
ApacheCommonsLang3.10使⽤简介=============================================================⾏⽂介绍:1、诞⽣背景2、引⼊⽅案3、简单介绍4 、详情介绍⽂档:===============================================================1、诞⽣背景由于标准的Java库⽆法提供⽤于操纵其核⼼类的⾜够⽅法。
Apache Commons Lang提供了这些额外的⽅法⼯具。
Lang为ng API提供了许多帮助程序实⽤程序,特别是字符串操作⽅法,基本数值⽅法,对象反射,并发,创建和序列化以及系统属性。
此外,它还包含对java.util.Date的基本增强,以及⼀系列专⽤于构建⽅法的实⽤程序,例如hashCode,toString和equals。
2、引⼊⽅案,maven引⼊⽅式<!-- https:///artifact/mons/commons-lang3 --><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>3.10</version></dependency>3、简单介绍ng3 #提供⾼度可重⽤的静态实⽤程序⽅法,主要⽤于为ng类增加值。
ng3.arch #提供类以使⽤os.arch系统属性的值。
ng3.builder #帮助创建⼀致的equals(Object)、toString()、hashCode()和compareTo(Object)⽅法。
pare #提供类以使⽤可⽐较接⼝和⽐较接⼝。
ng3.concurrent #为多线程编程提供⽀持类。
ng3.event #提供⼀些有⽤的基于事件的实⽤程序。
如何利用java解析tar.gz压缩文件中xml文件
如何利⽤java解析tar.gz压缩⽂件中xml⽂件应⽤场景在⼤数据的⼯作中,每天必不可少的就是和数据打交道,我们需要从我们的业务⽅将数据采集过来,然后根据我们的业务逻辑将数据解析并转换成我们所需要的格式!⼤数据分析往往数据量都是⾮常⼤的,⼀天⼏⼗T都是很正常,如果按正常的来采集的话,估计就是采集都要花费不少时间,最常⽤的⽅式就是将数据进⾏压缩之后再进⾏传输,这样的效率是⽐较⾼的,也节省了带宽资源!举⼀个简单的例⼦,我们的逻辑是xml原始⽂件先压缩成⼀个gz⽂件,再将上百个gz⽂件再⼆次压缩成⼀个tar.gz⽂件!⼀个压缩⽂件的⼤⼩⼤概是200M,但是解压出来就差不多20G此篇⽂章就记录⼀下实现功能需求的过程!依赖<dependency><groupId>mons</groupId><artifactId>commons-compress</artifactId><version>1.5</version></dependency>实现代码import lombok.extern.slf4j.Slf4j;import press.archivers.tar.TarArchiveEntry;import press.archivers.tar.TarArchiveInputStream;import press.utils.IOUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.util.zip.GZIPInputStream;@Slf4jpublic class FileUtils {private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);public static void main(String[] args) {deCompressGZipFile("path1", "dir1");}/*** Tar⽂件解压⽅法** @param tarGzFile 要解压的压缩⽂件名称(绝对路径名称)* @param destDir 解压后⽂件放置的路径名(绝对路径名称)当路径不存在,会⾃动创建* @return 解压出的⽂件列表*/public static void deCompressGZipFile(String tarGzFile, String destDir) {// 建⽴输出流,⽤于将从压缩⽂件中读出的⽂件流写⼊到磁盘TarArchiveEntry entry = null;TarArchiveEntry[] subEntries = null;File subEntryFile = null;try (FileInputStream fis = new FileInputStream(tarGzFile);GZIPInputStream gis = new GZIPInputStream(fis);TarArchiveInputStream taris = new TarArchiveInputStream(gis);) {while ((entry = taris.getNextTarEntry()) != null) {StringBuilder entryFileName = new StringBuilder();entryFileName.append(destDir).append(File.separator).append(entry.getName());File entryFile = new File(entryFileName.toString());if (entry.isDirectory()) {if (!entryFile.exists()) {entryFile.mkdir();}subEntries = entry.getDirectoryEntries();for (int i = 0; i < subEntries.length; i++) {try (OutputStream out = new FileOutputStream(subEntryFile)) {subEntryFile = new File(entryFileName + File.separator + subEntries[i].getName());IOUtils.copy(taris, out);} catch (Exception e) {LOGGER.error("deCompressing file failed:" + subEntries[i].getName() + "in" + tarGzFile);}}} else {checkFileExists(entryFile);OutputStream out = new FileOutputStream(entryFile);IOUtils.copy(taris, out);out.close();//如果是gz⽂件进⾏递归解压if (entryFile.getName().endsWith(".gz")) {String namepath = entryFile.getAbsolutePath();compressGZ(namepath);}}}//如果需要刪除之前解压的gz⽂件,在这⾥进⾏File dir = new File("dir1");File[] files = dir.listFiles();if (f.getName().split("\\.").length==3){f.delete();}}} catch (Exception e) {LOGGER.warn("decompress failed", e);}}/*** 解压GZ⽂件* @param pwd*/public static void compressGZ(String pwd){if (!getExtension(pwd).equalsIgnoreCase("gz")) {System.err.println("File name must have extension of \".gz\"");System.exit(1);}GZIPInputStream in = null;try {in = new GZIPInputStream(new FileInputStream(pwd));} catch(FileNotFoundException e) {System.err.println("File not found. " + pwd);System.exit(1);} catch (IOException e) {e.printStackTrace();}String outFileName = getFileName(pwd);FileOutputStream out = null;try {out = new FileOutputStream(outFileName);} catch (FileNotFoundException e) {System.err.println("Could not write to file. " + outFileName);System.exit(1);}try {byte[] buf = new byte[1024];int len;while((len = in.read(buf)) > 0) {out.write(buf, 0, len);}in.close();out.close();} catch (IOException e) {e.printStackTrace();}}/*** Used to extract and return the extension of a given file.* @param f Incoming file to get the extension of* @return <code>String</code> representing the extension of the incoming * file.*/public static String getExtension(String f) {String ext = "";int i = stIndexOf('.');if (i > 0 && i < f.length() - 1) {ext = f.substring(i+1);}return ext;}/*** Used to extract the filename without its extension.* @param f Incoming file to get the filename* @return <code>String</code> representing the filename without its* extension.*/public static String getFileName(String f) {String fname = "";int i = stIndexOf('.');if (i > 0 && i < f.length() - 1) {fname = f.substring(0,i);}return fname;}public static void checkFileExists(File file) {//判断是否是⽬录if (!file.exists()) {file.mkdir();}} else {//判断⽗⽬录是否存在,如果不存在,则创建if (file.getParentFile() != null && !file.getParentFile().exists()) {file.getParentFile().mkdirs();}try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}}}这样就实现了将tar.gz⽂件中的xml原始⽂件全部解压出来!之后就可以将xml⽂件中的数据拿出来做解析和分析了!java解析xml⽂件的⽅式有多种,这⾥使⽤dom4j!!依赖<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency>实现代码import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.List;/*** java DOM4j xml解析*/public class JavaXMLTest {public static void main(String[] args) throws IOException, DocumentException {SAXReader reader = new SAXReader();Document xmlDocument = reader.read(new FileInputStream(new File("2.xml")));//System.out.println(doc==null?"未读取到xml⽂件":"已读取到xml⽂件");//获取根节点Element rootElement = xmlDocument.getRootElement();//获取根节点下的直接⼦节点的个数和名字List<Element> list = rootElement.elements("fileHeader");//System.out.println("根节点下有"+list.size()+"直接⼦节点");//获取根节点下 fileHeader节点得value值for (Element elemet:list) {String reportTime = elemet.attributeValue("reportTime");String startTime = elemet.attributeValue("startTime");String endTime = elemet.attributeValue("endTime");}//获取根节点下所有得⼦节点List<Element> list1 = rootElement.elements("header");//System.out.println("根节点下header有"+list1.size()+"直接⼦节点");//由于只有⼀个节点所以取get(0)Element header = list1.get(0);//获取header节点得value值String id = header.attributeValue("id");//System.out.println("id是"+id);//获取header节点下所有 measure 节点Element measure = header.elements("measure").get(0);//获取measurement节点下 smr节点Element sm = measure.elements("sm").get(0);//获取smr节点的value值String stringValue = sm.getStringValue();//按照空格进⾏拆分String[] objj = stringValue.split(" ");//System.out.println("stringvalue===="+stringValue);//List<Element> smlist = smr.elements("obj");//获取measure节点下所有的 obj 节点List<Element> objlist = measurement.elements("obj");//Map<String,String> map = new HashMap();//遍历所有 obj节点for (Element ob:objectlist) {//System.out.println(objj.length);//获取所有 obj节点下的 v 节点List<Element> vlist = ob.elements("v");//遍历 v 节点for (Element v:vlist) {//System.out.println("v得value值是"+v.getStringValue());//获取v节点的value值String[] vv = v.getStringValue().split(" ");//System.out.println(vv.length);StringBuilder sb = new StringBuilder();for (int i=0;i<objj.length;i++){sb.append(objj[i]+"="+vv[i]);}System.out.println(sb.toString());sb=null;}}}}⾄此,利⽤java就完成了对tar.gz⽂件的解压,并对xml原始⽂件进⾏数据解析这个⽅法对于⼩数据量是可以实现的!但是⼤数据都是基于分布式⽂件系统Hadoop构建的!我们的数据都是存储在hdfs上的,⽽且数据也⾮常⼤,这样解压⽂件写到本地⽂件系统中,再解析其中的数据上传⾄hdfs!同时也是要消耗带宽的!最终在测试的时候是不⾏的!这个⽅案就被否定了!。
Apache BCEL
Apache BCEL 让您深入 JVM 汇编语言进行类操作的细节Dennis M. Sosnoski(dms@), 总裁, Sosnoski Software Solutions, Inc.简介: Apache Byte Code Engineering Library (BCEL)可以深入 Java 类的字节码。
可以用它转换现有的类表示或者构建新的类,因为 BCEL 在单独的 JVM 指令级别上进行操作,所以可以让您对代码有最强大的控制。
不过,这种能力的代价是复杂性。
在本文中,Java 顾问 Dennis Sosnoski 介绍了 BCEL 的基本内容,并引导读者完成一个示例 BCEL 应用程序,这样您就可以自己决定是否值得以这种复杂性来换取这种能力。
标记本文!发布日期: 2004 年 4 月 01 日级别:初级访问情况: 4408 次浏览评论: 0 (查看 | 添加评论 - 登录)平均分 (8个评分)为本文评分在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类。
这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BCEL)。
与 Javassist 所支持的源代码接口不同,BCEL 在实际的 JVM 指令层次上进行操作。
在希望对程序执行的每一步进行控制时,底层方法使 BCEL 很有用,但是当两者都可以胜任时,它也使 BCEL 的使用比 Javassist 要复杂得多。
我将首先讨论 BCEL 基本体系结构,然后本文的大部分内容将讨论用 BCEL 重新构建我的第一个 Javassist 类操作的例子。
最后简要介绍 BCEL 包中提供的一些工具和开发人员用 BCEL 构建的一些应用程序。
BCEL 类访问BCEL 使您能够同样具备 Javassist 提供的分析、编辑和创建 Java 二进制类的所有基本能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
选择 Apache Commons-Compress 系统库*.jar 包文件。
1.1.4 在所创建出的 JavaCompress 项目中添加一个 Java 应用程序类 1、新建一个 Java 应用程序类
杨教授大学堂,版权所有,盗版必究。
8/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
3、下载 Apache Commons-Compress 系统库文件
杨教授大学堂,版权所有,盗版必究。
2/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
Байду номын сангаас
4、Apache Commons-Compress 系统库压缩包中的文件 解 压 缩 Apache Commons-Compress 系 统 库 下 载 后 的 *.zip 文 件 , 其 中 的 commons-compress-1.15.jar 为 Apache Commons-Compress 系统库的*.jar 包文件。
Apache Commons-Compress 系统库对 JDK 自带的 zip 工具类进行了功能完善,解决了 中文文件名的压缩和解压缩的问题。本文通过具体的代码示例为读者介绍如何应用 Apache Commons-Compress 系统库实现解压 zip 格式的压缩文件。 1、下载的 URL 地址 https:///project.html?commons-compress
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(1)ZipArchiveOutputStream 类的定义
(2)ZipArchiveOutputStream 类的构造方法的功能定义 public ZipArchiveOutputStream(OutputStream out)
(3)ZipArchiveOutputStream. putArchiveEntry ()方法 public void putArchiveEntry(ArchiveEntry archiveEntry) throws IOException
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1 如何使用 Apache Commons-Compress 系统库实现将目录(可包含无 极目录)压缩为 zip 格式的压缩文件的应用示例
1.1.1 下载 Apache Commons-Compress 系统库 在 Apache Commons 组件包项目中包含有许多开源的工具类子项目, 它们用于解决开发 人员在平时编程时经常所遇到的通用功能实现的问题,从而减少开发人员的重复劳动。而 其中的 Compress 子项目是 Apache Commons 组件包项目中提供压缩、解压缩文件的类库。 Apache Commons-Compress 系统库可以操作 ar、cpio、Unix dump、tar、zip、gzip、XZ、 Pack200 and bzip2 等格式的文件,功能比较强大。而采用 JDK 自带的如下的 zip 工具类进 行 zip 压缩时会出现文件名中文乱码的问题:java.util.zip.ZipEntry、java.util.zip.ZipFile、 java.util.zip.ZipInputStream、java.util.zip.ZipOutputStream。
(2)ApacheCommonCompressFolderUtil 程序类的初始代码
1.1.5 示例程序中所涉及的 Apache Common Compress 相关的 API 1、ZipArchiveOutputStream 为 zip 格式压缩文件的输出流类
杨教授大学堂,版权所有,盗版必究。 10/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
3、创建出名称为 JavaCompress 的 Java 应用程序项目
杨教授大学堂,版权所有,盗版必究。
6/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1.3 在所创建出的 JavaCompress 项目中添加 Apache Commons-Compress 系统库 1、选择项目的属性菜单项目
而其中的 apidocs 为 Apache Commons-Compress 系统库的离线 API 技术文档页面所在的 目录
杨教授大学堂,版权所有,盗版必究。
3/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
点击并执行其中的 index.html 页面文件,将可以离线浏览 Apache Commons-Compress 系统库的 API 技术文档。
2、选择 Java Build Path 项目中的 libraries 卡片页 点击其中的“Add External JARs”按钮,并导航到 Apache Commons-Compress 系统库 *.jar 包文件所在的目录。
杨教授大学堂,版权所有,盗版必究。
7/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
1/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
2、下载的页面 URL 地址 点击页面中的如下的超链接,将进入系统库下载的页面 /proper/commons-compress/download_compress.cgi
2 、 设 置 类 名 称 为
ApacheCommonCompressFolderUtil , 程 序 包 名 称 为
com.bluedream.javacompress (1)创建 ApacheCommonCompressFolderUtil 程序类
杨教授大学堂,版权所有,盗版必究。
9/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
杨教授大学堂,版权所有,盗版必究。
4/23 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1.2 新建一个 J2SE 的 Java 应用程序项目 1、新建一个 J2SE 的 Java 应用程序项目
2、设置项目名称为 JavaCompress
杨教授大学堂,版权所有,盗版必究。
5/23 页