1. 关于java解压缩文件(rar或者zip),压缩的文件是按文件的原目录来压缩的,并不是在同一个文件夹中。
NTFS是WinNT以上版本支持的一种提供安全性、可靠性的高级文件系统。在Windows2000和WindowsXP中,NTFS还可以提供诸如文件和文件夹权限、加密、磁盘配额和压缩这样的高级功能。
一、加密文件或文件夹
步骤一:打开Windows资源管理器。
步骤二:右键单击要加密的文件或文件夹,然后单击“属性”。
步骤三:在“常规”选项卡上,单击“高级”。选中“加密内容以便保护数据”复选框
在加密过程中还要注意以下五点:
1.要打开“Windows 资源管理器”,请单击“开始→程序→附件”,然后单击“Windows 资源管理器”。
2.只可以加密NTFS分区卷上的文件和文件夹,FAT分区卷上的文件和文件夹无效。
3.被压缩的文件或文件夹也可以加密。如果要加密一个压缩文件或文件夹,则该文件或文件夹将会被解压。
4.无法加密标记为“系统”属性的文件,并且位于systemroot目录结构中的文件也无法加密。
5.在加密文件夹时,系统将询问是否要同时加密它的子文件夹。如果选择是,那它的子文件夹也会被加密,以后所有添加进文件夹中的文件和子文件夹都将在添加时自动加密。
二、解密文件或文件夹
步骤一:打开Windows资源管理器。
步骤二:右键单击加密文件或文件夹,然后单击“属性”。
步骤三:在“常规”选项卡上,单击“高级”。
步骤四:清除“加密内容以便保护数据”复选框。
同样,我们在使用解密过程中要注意以下问题:
1.要打开“Windows资源管理器”,请单击“开始→程序→附件”,然后单击“Windows资源管理器”。
2.在对文件夹解密时,系统将询问是否要同时将文件夹内的所有文件和子文件夹解密。如果选择仅解密文件夹,则在要解密文件夹中的加密文件和子文件夹仍保持加密。但是,在已解密文件夹内创立的新文件和文件夹将不会被自动加密。
以上就是使用文件加、解密的方法!而在使用过程中我们也许会遇到以下一些问题,在此作以下说明:
1.高级按钮不能用
原因:加密文件系统(EFS)只能处理NTFS文件系统卷上的文件和文件夹。如果试图加密的文件或文件夹在FAT或FAT32卷上,则高级按钮不会出现在该文件或文件夹的属性中。
解决方案:
将卷转换成带转换实用程序的NTFS卷。
打开命令提示符。键入:
Convert [drive]/fs:ntfs
(drive 是目标驱动器的驱动器号)
2.当打开加密文件时,显示“拒绝访问”消息
原因:加密文件系统(EFS)使用公钥证书对文件加密,与该证书相关的私钥在本计算机上不可用。
解决方案:
查找合适的证书的私钥,并使用证书管理单元将私钥导入计算机并在本机上使用。
3.用户基于NTFS对文件加密,重装系统后加密文件无法被访问的问题的解决方案(注意:重装Win2000/XP前一定要备份加密用户的证书):
步骤一:以加密用户登录计算机。
步骤二:单击“开始→运行”,键入“mmc”,然后单击“确定”。
步骤三:在“控制台”菜单上,单击“添加/删除管理单元”,然后单击“添加”。
步骤四:在“单独管理单元”下,单击“证书”,然后单击“添加”。
步骤五:单击“我的用户账户”,然后单击“完成”(如图2,如果你加密用户不是管理员就不会出现这个窗口,直接到下一步) 。
步骤六:单击“关闭”,然后单击“确定”。
步骤七:双击“证书——当前用户”,双击“个人”,然后双击“证书”。
步骤八:单击“预期目的”栏中显示“加密文件”字样的证书。
步骤九:右键单击该证书,指向“所有任务”,然后单击“导出”。
步骤十:按照证书导出向导的指示将证书及相关的私钥以PFX文件格式导出(注意:推荐使用“导出私钥”方式导出,这样可以保证证书受密码保护,以防别人盗用。另外,证书只能保存到你有读写权限的目录下)。
4.保存好证书
注意将PFX文件保存好。以后重装系统之后无论在哪个用户下只要双击这个证书文件,导入这个私人证书就可以访问NTFS系统下由该证书的原用户加密的文件夹(注意:使用备份恢复功能备份的NTFS分区上的加密文件夹是不能恢复到非NTFS分区的)。
最后要提一下,这个证书还可以实现下述用途:
(1)给予不同用户访问加密文件夹的权限
将我的证书按“导出私钥”方式导出,将该证书发给需要访问这个文件夹的本机其他用户。然后由他登录,导入该证书,实现对这个文件夹的访问。
(2)在其也WinXP机器上对用“备份恢复”程序备份的以前的加密文件夹的恢复访问权限
将加密文件夹用“备份恢复”程序备份,然后把生成的Backup.bkf连同这个证书拷贝到另外一台WinXP机器上,用“备份恢复”程序将它恢复出来(注意:只能恢复到NTFS分区)。然后导入证书,即可访问恢复出来的文件了。
WindowsXP中的文件加密功能及其使用
作者:lvvl 来源:赛迪网安全社区
Windows XP文件加密功能强大并且简单易用,因而许多用户都使用它来保护自己的重要文件。但由于大部分用户对该功能了解不足,在使用过程中经常出现问题,在本刊“电脑医院”中我们也频繁地收到读者的求助信,为此,CHIP在这里将特意为您详细介绍有关该功能的使用技巧。
微软在Windows2000中内建了文件加密功能,该功能后来被移植到WinXP中。使用该功能,我们只需简单地单击几下鼠标就可以将指定的文件或者文件夹进行加密,而且在加密后我们依然可以和没加密前一样方便地访问和使用它们,非常方便。而且加密后即使黑客侵入系统,完全掌握了文件的存取权,依然无法读取这些文件与文件夹。
但简单强大的文件加密功能也给许多用户带来了困扰。由于使用简单,许多用户都乐于使用它来保护自己的重要文件,但大部分用户由于缺乏对该功能的真正了解,在使用时泄密、无法解密等问题频繁发生,恰恰被加密的文件往往是重要的文件,影响非常大。为此,笔者特意整理了有关该功能的一些相关知识和使用技巧与您分享。
加密和解密文件与文件夹
Windows2000系列和WinXP专业版及Windows2003的用户都可使用内建的文件加密功能,但前提是准备加密的文件与文件夹所在的磁盘必须采用NTFS文件系统。同时要注意,由于加密解密功能在启动时还不能够起作用,因此系统文件或在系统目录中的文件是不能被加密的,如果操作系统安装目录中的文件被加密了,系统就无法启动。另外,NTFS文件系统还提供一种压缩后用户可以和没压缩前一样方便访问文件与文件夹的文件压缩功能,但该功能不能与文件加密功能同时使用,使用ZIP、RAR等其他压缩软件压缩的文件不在此限。
加密时,只需使用鼠标右键单击要加密的文件或者文件夹,然后选择“属性”,在“属性”对话框的“常规”选项卡上单击“高级”按钮,在“高级属性”对话框上选中“加密内容以保护数据”复选框并确认即可对文件进行加密,如果加密的是文件夹,系统将进一步弹出“确认属性更改”对话框要求您确认是加密选中的文件夹,还是加密选中的文件夹、子文件夹以及其中的文件。而解密的步骤与加密相反,您只需在“高级属性”对话框中清除“加密内容以保护数据”复选框上的选中标记即可(如图1),而在解密文件夹时将同样弹出“确认属性更改”对话框要求您确认解密操作应用的范围。
图1
加密后,用户可以像使用普通文件一样直接打开和编辑,又或者执行复制、粘贴等操作,而且用户在加密文件夹内创建的新文件或从其他文件夹拷贝过来的文件都将自动被加密。被加密的文件和文件夹的名称将默认显示为淡绿色,如您的电脑上被加密的文件和文件夹的名称不是彩色显示,您可以单击“我的电脑|工具|文件夹选项”,然后在“文件夹选项”对话框中单击“查看”选项卡,选中“以彩色显示加密或压缩的NTFS文件”复选框即可。
赋予或撤销其他用户的权限
如果需要,您可赋予其他用户对加密文件的完全访问权限,但要明白,Windows所采用的是基于密钥的加密方案,并且是在用户第一次使用该功能时才为用户创建用于加密的密钥,因此您准备赋予权限的用户也必须曾经使用过系统的加密功能,否则将无法成功赋予对方权限。Windows内建的文件加密功能只允许赋予其他用户访问加密文件的完全权限,而不允许将加密文件夹的权限赋予给其他用户。
要赋予或撤销其他用户对加密文件的访问权限,可用鼠标右键单击已加密的文件,选择“属性”,在“属性”对话框的“常规”选项卡上单击“高级”按钮,在“高级属性”对话框中单击“详细信息”按钮,即可通过“添加”和“删除”按钮添加或删除其他可以访问该文件的用户。
备份密钥
有许多读者在系统发生故障或重新安装系统以后,无法再访问之前他们加密过的文件与文件夹而向本刊“电脑医院”求助。但此时为时已晚,Windows内建的加密功能与用户的账户关系非常密切,同时用于解密的用户密钥也存储在系统内,任何导致用户账户改变的操作和故障都有可能带来灾难,要避免这种情况的发生,您必须未雨绸缪,在使用加密功能后马上备份加密密钥。
备份密钥的操作并不复杂,您只需单击“开始|运行”,键入“certmgr.msc”打开证书管理器,在左边窗口中依次单击控制台,打开“证书-当前用户”下的“个人”中的“证书”,然后在右边窗口中用鼠标右键单击“预期目的”是“加密文件系统”的证书,指向“所有任务|导出”,系统将打开“证书导出向导”指引您进行操作,向导将询问您是否需要导出私钥,您应该选择“导出私钥”,并按照向导的要求输入密码保护导出的私钥,然后选择存储导出后文件的位置即可完成。
建议您将导出的证书存储在系统盘以外的其他磁盘上,以避免在使用磁盘镜像之类的软件恢复系统时将备份的证书覆盖掉。备份后,当加密文件的账户出现问题或重新安装了系统后需要访问或解密以前加密的文件时,您只需要使用鼠标右键单击备份的证书,选择“安装PFX”,系统将弹出“证书导入向导”指引您的操作,您只需要键入当初导出证书时输入用于保护备份证书的密码,然后选择让向导“根据证书类型,自动选择证书存储区”即可完成,完成后就可以访问以前的加密文件了。
指定恢复代理
如果您同时使用多个账户或者与其他用户共用一台电脑,担心更换账户或者其他账户加密的文件出问题,那么您可以考虑指定一个文件故障恢复代理,恢复代理可以解密系统内所有通过内建加密功能加密的文件,一般用于网络管理员在网络上处理文件故障,并能使管理员在职员离职后解密职员加密的工作资料。在Win2000中,默认Administrator为恢复代理,而在WinXP上,如果需要恢复代理则必须自行指定。但需要注意,恢复代理只能够解密指定恢复代理后被加密的文件,所以您应该在所有人开始使用加密功能前先指定恢复代理。
如果您所使用的电脑是企业网络中的,那么您需要联系管理员查询是否已经制定了故障恢复策略,而如果您只是在使用一台单独的电脑,那么您可以按照下面的步骤指定恢复代理。首先,您需要使用准备指定为恢复代理的用户账户登录,申请一份故障恢复证书,该用户必须是管理员或者拥有管理员权限的管理组成员。对于企业网络上的电脑,登录后可以通过上面介绍过的“证书管理器”,在“使用任务”中的“申请新证书”中向服务器申请。而在个人电脑上,您必须单击“开始|附件|命令提示符”,在命令行窗口中键入“cipher /r:c:\efs.txt”(efs.txt可以是任一文件),命令行窗口将提示您输入保护证书的密码并生成我们需要的证书。生成的证书一个是PFX文件,一个是CER文件,先使用鼠标右键单击PFX文件,选择“安装PFX”,通过弹出的“证书导入向导”选择“根据证书类型,自动选择证书存储区” 导入证书。
接下来再单击“开始|运行”,键入“gpedit.msc”打开组策略编辑器,在左边控制台上依次单击“本地计算机策略|计算机配置|Windows 设置|安全设置|公钥策略|加密文件系统”,然后在右边窗口中用鼠标右键单击选择“添加数据恢复代理”(如图2),然后在弹出的“添加数据恢复代理向导”中浏览并选择刚才生成的证书中的CER文件,在键入保护证书的密码后,向导将导入证书,完成指定恢复代理的工作。完成后,在以后需要的时候,只需使用被指定为恢复代理的账户登录,就可以解密系统内所有在指定恢复代理后被加密的文件。
图2
禁止加密功能
在多用户共用电脑的环境下,我们往往通过将其他用户指定为普通用户权限,限制他们使用某些功能,但由于普通用户账户默认允许使用加密功能,因此在一些多用户共用的电脑上经常会带来一些困扰。如果担心电脑上其他用户乱加密磁盘上的文件,您可以设置特定的文件夹禁止被加密,也可以完全禁止文件加密功能。
如果您希望将某个文件夹设置为禁止加密,可以编辑一个文本文件,内容包括“[Encryption]”和“Disable=1”两行,然后命名为“Desktop.ini”,将其放到不希望被加密的文件夹中即可。当其他用户试图加密该文件夹时,系统将提示用户该文件夹加密功能被禁止。但需要注意,您只能使用这种方法禁止其他用户加密该文件夹,文件夹中的子文件夹将不受保护。
如果需要,您也可以完全禁止文件加密功能,在Win2000中,只需使用Administrator登录并运行“secpol.msc”打开策略编辑器,用鼠标右键单击左边控制台上的“安全设置|公钥策略|加密文件系统”,选择“属性”,在属性对话框上清除“允许用户使用文件加密系统(EFS)来加密文件”复选框上的选中标记,然后重新启动电脑即可。而在WinXP上虽然也有相应的选项,但实际上并不能够起作用,您需要通过编辑注册表来禁止文件加密功能。首先单击“开始|运行”,键入“regedit.exe”打开注册表编辑器,依次单击 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows NT\CurrentVersion\EFS”,再用鼠标右键单击建立一个“DWORD”值,双击新建的值并赋值为“1”,关闭注册表后重新启动电脑。这样,当其他用户试图使用文件加密功能时,系统将提示加密功能已被禁止(如图3)。
图3
防止泄密
由于对文件加密功能缺乏了解,许多读者对该功能是否能够真正发挥作用抱有怀疑态度,而另外一些用户却又因为过分地放心而导致泄密事件频繁发生。首先,对于该功能的加密效果您大可放心,不必因为在您使用加密文件时不需要输入密码而怀疑加密效果,在加密后能够透明地使用恰恰正是该功能的优点。虽然有一些第三方软件曾经成功地破解使用该功能加密的文件,但这种软件暂时对于Windows XP是无效的,而且即使在其他版本的Windows 操作系统上,也是可以避免的。
但您需要小心由于自己的失误引起加密失效,也需要了解该功能的特点。Windows XP内建的文件加密功能与用户的账户是联系在一起的,换言之,如果您的Windows账户没有保护好,密码被其他人获得,那么对方也就可以像您一样登录系统访问加密的文件。另外,当已加密的文件被拷贝或者移动到非NTFS文件系统磁盘上时,文件将被解密。在文件通过网络传输时,也是以明文方式进行传输的。这些您都需要清楚,避免错误操作引起泄密。而最主要的是加密后的文件并不是绝对安全的,虽然可以确保不被读取,但却无法避免被删除。
此外,在加密文件的过程中,系统将把原来的文件存储到缓冲区,然后在加密后将原文件删除。这些被删除掉的文件在系统上并不是不可能恢复的,通过磁盘文件恢复工具很有可能被恢复过来而造成泄密,此时您需要考虑通过其他磁盘安全工具,或者使用系统内建的“cipher”命令对磁盘上的已删除文件进行清除,具体的步骤是,单击“开始|附件|命令提示符”,在命令行窗口中键入“cipher /w C:\foldername”即可清除C盘foldername文件夹中已删除文件残留的碎片,如果不输入文件夹名称则将对整个磁盘进行清理。
疑难排解
当您的Windows登录账户变更而无法访问已加密的文件时,由于用户的账户名称或者密码变更时将无法与原来的加密证书联系上,因而您需要考虑是否在使用其他账户时更改了当前账户的名称或者密码?又或者是管理员进行了这样的操作?如果的确如此,您可以尝试将自己的账户名称和密码更改成原来的,问题应该能够解决。但需要注意,根据微软的说法,改回账户名称与密码的方法在管理员账户上可能无效,而且如果您的账户并不是改变而是被删除后重建,也就是说是一个全新的账户,那么您只能够求助于恢复代理或者导入备份的证书。
如果您已经重新格式化了硬盘、重新安装了系统又或者使用尚未加密文件时的系统盘镜像恢复了系统而导致无法访问加密文件,那么您只能够通过导入自己的证书或者恢复代理的方法来解决问题,这时基本上已经没有其他方法可以帮助您取回文件。另外,Windows XP SP1版后使用了新的加密算法,如果您加密时使用的是Windows XP SP1版本,那么当您尝试挽救数据时也应该使用该版本,或者未来的更新版本,否则在其他版本上乱试,加密文件可能会损毁。
系统安全 深入理解加密文件系统EFS
微软在NTFS4.0及后续版本的文件系统中,捆绑了两个功能强大的工具:压缩文件系统和加密文件系统。这个选项在文件夹的属性-高级里面。是一个单选框。压缩文件系统在这里就不多提了,不过有一点,可能有心的朋友注意得到,就是这两个选项不可以同时选。这个原因很简单,因为不论是加密文件还是压缩文件,我们都是在改变文件,我们通过改变他们的读码框架来加密或者压缩文件。这里可能有人要问,WinRAR为什么可以及加密文件又压缩文件。其实WinRAR加密的方法是在基于WinRAR这个文件压缩系统,而不是基于文件本身。我们还是言归正传。
这里面要提到的一点叫做加密方式。相信有些朋友对Alice和Bob这两个名字非常熟悉,这两个名字最早用于IBM出版的一本图书中,用来解释对称加密和非对称加密。对称加密,简单一点说就是加密所使用的密码和解密所使用的密码是同一个密码。非对称呢,加密使用的和解密是不同的密码。这个不同的密码,一个被称为私钥,另一个就是公钥。从名字上面可以看出来,私钥,是无论如何不会公开的,公钥,则是发布出去的。
详细解释一下,熟悉非对称加密的朋友可以跳过这一段。e.g.Alice要发送一份敏感数据给BOB,显然需要加密。非对称加密,使用两个不同的密码加密和解密。就是说,如果alice的公钥和私钥为一组密码,分别是alice的公钥和alice的私钥。那么,用alice公钥加密的东西只有使用alice的私钥可以解密,对应的,如果使用alice公钥加密的东西,只有alice的私钥可以解开。那么对于bob也是一样。如果我们采用对称加密的方法,也就是加密和解密的过程使用的是一个密码,那么这个密码是无论如何不能被第三方截获的。互联网络,可以截获;电话,可以监听;甚至当面交换,都可以被窃听。所以这是对称加密的一个重大缺陷。如果采用非对称加密,alice和bob都不公开自己的私钥,然后他们在交换信息前,互相交换公钥。这样,alice使用bob的公钥加密alice要给bob的文件,这个使用bob公钥加密过的文件,仅有bob的私钥可以解开。而bob从来没有公开过他的私钥,所以,我们看到,这样的加密,是安全的。这个信息加密解密,交换公钥的过程,就是非对称加密。
解释过非对称加密,我们也可以简单的比较出两者在安全性上的优越性。不过非对称加密一个重要的缺陷,就是运算时间很长,对称加密在工作效率上可能是非对称加密的100-1000倍。所以微软也是在看到这一点后,在EFS中集成了两者的优点。EFS使用了对称加密和非对称加密结合的工作方式,即先生成一个字符串作为密钥采用对称加密方法加密文件,然后,再使用非对称加密加密这个密钥。这个密钥具体位数我记不得了,大约在70位。这里出现一个问题,实际在操作系统中,公钥和私钥是怎么获得的?为什么管理员可以解开所有用户的加密文件?
依照微软的白皮书中解释,加密文件系统中的用户证书的获得,有两种途径,一个是从CA(CertificationAuthority)获得,另一种是在企业级CA失效的时候由本机为自己颁发一个数字证书。这里需要解释的是证书和密钥的关系,证书是密钥的载体,在证书中包含了密钥。这里可能又有人要问,用户的私钥是存放在什么地方?用户的私钥是通过另外一种验证机制实现的,这个在系统层面,日后我会写文章加以阐释。除了这两个密钥,还有一个用于直接加密文件的密钥,这个根据用户自己的SID计算出来的,微软没有公开这方面的信息,还请有心人共同尝试理解其中的工作原理。管理员之所以可以管理所有用户的加密文件,是为了保证系统的稳定,如果每一个用户的文件都只有创建者可以修改,那么计算机可能因此陷入混乱的状态。
近日听闻有些软件可以破解微软的EFS,我本为之兴奋,结果下载后研究了一下,这种软件的工作原理是备份出管理员的帐户信息,通过ERA(紧急恢复代理)实现加密文件的恢复。事实上,如果用户不慎在重新安装系统的时候忘记备份出相应的密钥,那么这个加密过的文件可能永远打不开。这一点不难理解,因为每一次安装操作系统,操作系统会随即生成一个SID号,当然,如果用户的人品足够好,还是可能生成一样的SID号的(开个玩笑)。关于备份管理员账号和密码,可以通过Windows2000及后续版本中内建的忘记密码向导来帮助备份密码。希望可以给大家一些帮助。
2. 求JAVA解压缩文件目录的源代码
packagecom.io2.homework;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipOutputStream;
/*压缩文件夹*/
publicclassMyMultipleFileZip
{
="F:/MyZip.zip";
privateStringsourceFilePath;
privateZipOutputStreamzos;
privateFileInputStreamfis;
publicMyMultipleFileZip(StringsourceFilePath)
{
try
{
this.sourceFilePath=sourceFilePath;
zos=newZipOutputStream(newFileOutputStream(currentZipFilePath));
//设定文件压缩级别
zos.setLevel(9);
}catch(FileNotFoundExceptione)
{
e.printStackTrace();
}
}
//在当前条目中写入具体内容
publicvoidwriteToEntryZip(StringfilePath)
{
try
{
fis=newFileInputStream(filePath);
}catch(FileNotFoundExceptione1)
{
e1.printStackTrace();
}
byte[]buff=newbyte[1024];
intlen=0;
try
{
while((len=fis.read(buff))!=-1)
{
zos.write(buff,0,len);
}
}catch(IOExceptione)
{
e.printStackTrace();
}finally
{
if(fis!=null)
try
{
fis.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
}
//添加文件条目
publicvoidaddFileEntryZip(StringfileName)
{
try
{
zos.putNextEntry(newZipEntry(fileName));
}catch(IOExceptione)
{
e.printStackTrace();
}
}
(StringdirectoryName)
{
try
{
zos.putNextEntry(newZipEntry(directoryName+"/"));
}catch(IOExceptione)
{
e.printStackTrace();
}
}
//遍历文件夹
publicvoidlistMyDirectory(StringfilePath)
{
Filef=newFile(filePath);
File[]files=f.listFiles();
if(files!=null)
{
for(FilecurrentFile:files)
{
//设置条目名称(此步骤非常关键)
StringentryName=currentFile.getAbsolutePath().split(":")[1].substring(1);
//获取文件物理路径
StringabsolutePath=currentFile.getAbsolutePath();
if(currentFile.isDirectory())
{
addDirectoryEntryZip(entryName);
//进行递归调用
listMyDirectory(absolutePath);
}
else
{
addFileEntryZip(entryName);
writeToEntryZip(absolutePath);
}
}
}
}
//主要流程
publicvoidmainWorkFlow()
{
listMyDirectory(this.sourceFilePath);
if(zos!=null)
try
{
zos.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)
{
newMyMultipleFileZip("F:/fountainDirectory").mainWorkFlow();
}
}
3. java压缩文件怎么解压
后缀名为.jar的文件不要解压,直接在java中运行就好了
4. java中怎么解压rar文件 到指定文件目录中
1.代码如下:
[java] view plain
<span style="font-size:18px;background-color: rgb(204, 204, 204);">package cn.gov.csrc.base.util;
import java.io.BufferedInputStream;
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.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 将文件夹下面的文件
* 打包成zip压缩文件
*
* @author admin
*
*/
public final class FileToZip {
private FileToZip(){}
/**
* 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
* @param sourceFilePath :待压缩的文件路径
* @param zipFilePath :压缩后存放路径
* @param fileName :压缩后文件的名称
* @return
*/
public static boolean fileToZip(String sourceFilePath,String zipFilePath,String fileName){
boolean flag = false;
File sourceFile = new File(sourceFilePath);
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;
if(sourceFile.exists() == false){
System.out.println("待压缩的文件目录:"+sourceFilePath+"不存在.");
}else{
try {
File zipFile = new File(zipFilePath + "/" + fileName +".zip");
if(zipFile.exists()){
System.out.println(zipFilePath + "目录下存在名字为:" + fileName +".zip" +"打包文件.");
}else{
File[] sourceFiles = sourceFile.listFiles();
if(null == sourceFiles || sourceFiles.length<1){
System.out.println("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩.");
}else{
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
byte[] bufs = new byte[1024*10];
for(int i=0;i<sourceFiles.length;i++){
//创建ZIP实体,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
zos.putNextEntry(zipEntry);
//读取待压缩的文件并写进压缩包里
fis = new FileInputStream(sourceFiles[i]);
bis = new BufferedInputStream(fis, 1024*10);
int read = 0;
while((read=bis.read(bufs, 0, 1024*10)) != -1){
zos.write(bufs,0,read);
}
}
flag = true;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally{
//关闭流
try {
if(null != bis) bis.close();
if(null != zos) zos.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
return flag;
}
public static void main(String[] args){
String sourceFilePath = "D:\\TestFile";
String zipFilePath = "D:\\tmp";
String fileName = "12700153file";
boolean flag = FileToZip.fileToZip(sourceFilePath, zipFilePath, fileName);
if(flag){
System.out.println("文件打包成功!");
}else{
System.out.println("文件打包失败!");
}
}
}
</span>
2.结果如下:
文件打包成功!
3.到D:/tmp下查看,你会发现生成了一个zip压缩包.
5. java解压zip文件
不好意思搞反了,这样就更简单了。
用这个构造方法ZipInputStream(InputStream in);接收传过来的流,然后用这个类的getNextEntry()方法解压缩文件,最后调用read(byte[] b, int off, int len)方法将数据写入byte数组。
ZipInputStream zin = new ZipInputStream(in);
ZipEntry entry = null;
while((entry=zin.getNextEntry())!=null){
if(entry.isDirectory()||entry.getName().equals("..\\"))
continue;
BufferedInputStream bin = new BufferedInputStream(zin);
byte[] buf = new byte[];
bin.read(buf,0,1);
}
6. java中将一个文件夹下所有的文件压缩成一个文件,然后,解压到指定目录.
import java.io.*;
import java.util.zip.*;
public class CompressD {
// 缓冲
static byte[] buffer = new byte[2048];
public static void main(String[] args) throws Exception {
// 来源
File inputDir = new File("C:\\CompressTest\\");
// 目标
FileOutputStream fos = new FileOutputStream("C:\\CompressTest.zip");
// 过滤
ZipOutputStream zos = new ZipOutputStream(fos);
// 压缩
zip(inputDir.listFiles(), "", zos);
// 关闭
zos.close();
}
private static void zip(File[] files, String baseFolder, ZipOutputStream zos)
throws Exception {
// 输入
FileInputStream fis = null;
// 条目
ZipEntry entry = null;
// 数目
int count = 0;
for (File file : files) {
if (file.isDirectory()) {
// 递归
zip(file.listFiles(), file.getName() + File.separator, zos);
continue;
}
entry = new ZipEntry(baseFolder + file.getName());
// 加入
zos.putNextEntry(entry);
fis = new FileInputStream(file);
// 读取
while ((count = fis.read(buffer, 0, buffer.length)) != -1)
// 写入
zos.write(buffer, 0, count);
}
}
}
7. java 解压文件
给你找了一个 你参考一下吧:
package com.da.unzip;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class Unzip {
public static void main(String[] args) throws Exception {
Unzip unzip = new Unzip();
String zippath = "C:\\unzip\\";// /解压到的目标文件路径
String zipDir = "C:\\data\\";// 要解压的压缩文件的存放路径
File file = new File(zipDir);
List list = unzip.getSubFiles(file);
for (Object obj : list) {
String realname = ((File)obj).getName();
System.out.println(realname);
int end = realname.lastIndexOf(".");
System.out.println("要解压缩的文件名.........."+zipDir+realname);
System.out.println("解压到的目录" +zippath+realname.substring(0, end));
unzip.testReadZip(zippath,zipDir+realname);
}
}
/*
* 解压缩功能. 将zippath目录文件解压到unzipPath目录下. @throws Exception
*/
public void ReadZip(String zippath, String unzipPath) throws Exception {
ZipFile zfile = new ZipFile(unzipPath);// 生成一个zip文件对象
System.out.println(zfile.getName());// 获取要解压的zip的文件名全路径
Enumeration zList = zfile.entries();// 返回枚举对象
ZipEntry ze = null;// 用于表示 ZIP 文件条目
byte[] buf = new byte[1024];// 声明字节数组
/**
* 循环获取zip文件中的每一个文件
*/
while (zList.hasMoreElements()) {
// 从ZipFile中得到一个ZipEntry
ze = (ZipEntry) zList.nextElement();
if (ze.isDirectory())// 如果为目录条目,则返回 true,执行下列语句
{
System.out.println("Dir: " + ze.getName() + " skipped..");
continue;
}
int begin = zfile.getName().lastIndexOf("\\") + 1;
int end = zfile.getName().lastIndexOf(".");
String zipRealName = zfile.getName().substring(begin, end);
System.out.println("解压缩开始Extracting:"+ze.getName()+"\t"+ze.getSize()+"\t"+ze.getCompressedSize());
// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中,并加上缓冲
OutputStream os = new BufferedOutputStream(
new FileOutputStream(getRealFileName(zippath + "\\"
+ zipRealName, ze.getName())));
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
String fileName = getRealFileName(zippath, ze.getName()).getName();
System.out.println("解压出的文件名称:" + fileName);
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024)) != -1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
// System.out.println("解压缩结束Extracted: "+ze.getName());
}
zfile.close();
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
*
* @param zippath
* 指定根目录
* @param absFileName
* 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
*/
private File getRealFileName(String zippath, String absFileName) {
String[] dirs = absFileName.split("/", absFileName.length());
File ret = new File(zippath);// 创建文件对象
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret = new File(ret, dirs[i]);
}
}
if (!ret.exists()) {// 检测文件是否存在
ret.mkdirs();// 创建此抽象路径名指定的目录
}
ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
// 路径名字符串创建一个新 File 实例
return ret;
}
}
8. java中怎么用cmd命令解压zip文件
对于zip文件,java有自带类库java.util.zip;可是要想解压rar文件只能靠第三方类库,我试过两个:com.github.junrar和de.innosystec.unrar,前者解压时可能会出现crcError,后者pom配置时报错;利用cmd命令调用winRAR进行解压,无疑方便快捷很多。
调用cmd命令
public static boolean exe(String cmd) {
Runtime runtime = Runtime.getRuntime(); try {
Process p = runtime.exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));
String line = reader.readLine(); while(line!=null) {
logger.info(line);
line = reader.readLine();
}
reader.close(); if(p.waitFor()!=0) { return false;
}
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace();
} return true;
}
首先利用runtime.exec()执行指令,得到process,从process.getInputStream()中获取回显字符并打印,打印回显时可能会出现中文乱码,这个和操作系统编码有关,我这里是GBK编码,所以在new inputstreamReader时加入了编码参数”GBK“
命令行字符串
如果需要调用cmd命令,如cd等,可写”cmd c cd 目录”。对于直接调用exe执行,则可以写成”exe文件绝对路径 参数”,在命令行字符串中,含有空格的路径或者字符串应该再加上引号,即””exe文件绝对路径” ”参数”“
winRAR调用
我这里安装目录是C:/Program Files/WinRAR,将D:1.rar 解压到D:,则写成””C:/Program Files/WinRAR/unRar.exe” x -y D:/1.rar D:/”,x代表绝对路径解压,-y表示全部确定;压缩的命令如下:“”C:/Program Files/WinRAR/rar.exe” a -ep1 D:2.rar D:源目录”,a表示添加文件到压缩文件,-ep1表示排除基本目录,如D:winrar ar这个目录,如果没有-ep1那么压缩包中会出现winrar目录路径,而加了之后就只将当前目录打包,只有rar目录
9. java怎么用Gzip实现文件的压缩和解压缩的
代码:
10. java新人,在学习解压缩文件时,解压文件后,里面的文件变文件夹
file.mkdirs();只有目录才要创建文件夹,如果这个file本应该是文件,你却创建了一个同名文件夹,那自然不能再创建这个文件了(即后面的file.createNewFile();无法创建文件).
另外,对于文件其实是不需要createNewFile的,因为如果你真要解压文件,你要打开对应文件流,并且创一个输出流,输出到目标文件中(这个文件会自动创建的),但你的代码里面没看到这个步骤,给你个完整的解压示例.
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Enumeration;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipFile;
publicclassTest
{
publicstaticvoinZipFiles(StringzipPath,StringdescDir)throwsIOException
{
unZipFiles(newFile(zipPath),descDir);
}
publicstaticvoinZipFiles(FilezipFile,StringdescDir)throwsIOException
{
FilepathFile=newFile(descDir);
if(!pathFile.exists())
{
pathFile.mkdirs();
}
ZipFilezip=newZipFile(zipFile);
for(Enumerationentries=zip.entries();entries.hasMoreElements();)
{
ZipEntryentry=(ZipEntry)entries.nextElement();
StringzipEntryName=entry.getName();
InputStreamin=zip.getInputStream(entry);
StringoutPath=(descDir+zipEntryName).replaceAll("\*","/");
//获取当前file的父路径,这才是文件夹
Filefile=newFile(outPath.substring(0,outPath.lastIndexOf('/')));
//判断路径是否存在,不存在则创建文件路径
if(!file.exists())
{
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if(newFile(outPath).isDirectory())
{
continue;
}
//输出文件路径信息
System.out.println(outPath);
OutputStreamout=newFileOutputStream(outPath);
byte[]buf1=newbyte[1024];
intlen;
while((len=in.read(buf1))>0)
{
out.write(buf1,0,len);
}
in.close();
out.close();
}
System.out.println("******************解压完毕********************");
}
publicstaticvoidmain(String[]args)throwsException
{
unZipFiles(newFile("d:/test.zip"),"e:/");
}
}