java压缩文件的问题

JavaScript014

java压缩文件的问题,第1张

有三种方式实现java压缩:

1、jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,出现乱码问题,实现代码如下:

/**

* 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件

* @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;

* 如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件

* @param zipFile 最后压缩的文件路径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip

*/

public File doZip(String sourceDir, String zipFilePath) throws IOException {

File file = new File(sourceDir)

File zipFile = new File(zipFilePath)

ZipOutputStream zos = null

try {

// 创建写出流操作

OutputStream os = new FileOutputStream(zipFile)

BufferedOutputStream bos = new BufferedOutputStream(os)

zos = new ZipOutputStream(bos)

String basePath = null

// 获取目录

if(file.isDirectory()) {

basePath = file.getPath()

}else {

basePath = file.getParent()

}

zipFile(file, basePath, zos)

}finally {

if(zos != null) {

zos.closeEntry()

zos.close()

}

}

return zipFile

}

/**

* @param source 源文件

* @param basePath

* @param zos

*/

private void zipFile(File source, String basePath, ZipOutputStream zos)

throws IOException {

File[] files = null

if (source.isDirectory()) {

files = source.listFiles()

} else {

files = new File[1]

files[0] = source

}

InputStream is = null

String pathName

byte[] buf = new byte[1024]

int length = 0

try{

for(File file : files) {

if(file.isDirectory()) {

pathName = file.getPath().substring(basePath.length() + 1) + "/"

zos.putNextEntry(new ZipEntry(pathName))

zipFile(file, basePath, zos)

}else {

pathName = file.getPath().substring(basePath.length() + 1)

is = new FileInputStream(file)

BufferedInputStream bis = new BufferedInputStream(is)

zos.putNextEntry(new ZipEntry(pathName))

while ((length = bis.read(buf)) >0) {

zos.write(buf, 0, length)

}

}

}

}finally {

if(is != null) {

is.close()

}

}

}

2、使用org.apache.tools.zip.ZipOutputStream,代码如下,

package net.szh.zip

import java.io.BufferedInputStream

import java.io.File

import java.io.FileInputStream

import java.io.FileOutputStream

import java.util.zip.CRC32

import java.util.zip.CheckedOutputStream

import org.apache.tools.zip.ZipEntry

import org.apache.tools.zip.ZipOutputStream

public class ZipCompressor {

static final int BUFFER = 8192

private File zipFile

public ZipCompressor(String pathName) {

zipFile = new File(pathName)

}

public void compress(String srcPathName) {

File file = new File(srcPathName)

if (!file.exists())

throw new RuntimeException(srcPathName + "不存在!")

try {

FileOutputStream fileOutputStream = new FileOutputStream(zipFile)

CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,

new CRC32())

ZipOutputStream out = new ZipOutputStream(cos)

String basedir = ""

compress(file, out, basedir)

out.close()

} catch (Exception e) {

throw new RuntimeException(e)

}

}

private void compress(File file, ZipOutputStream out, String basedir) {

/* 判断是目录还是文件 */

if (file.isDirectory()) {

System.out.println("压缩:" + basedir + file.getName())

this.compressDirectory(file, out, basedir)

} else {

System.out.println("压缩:" + basedir + file.getName())

this.compressFile(file, out, basedir)

}

}

/** 压缩一个目录 */

private void compressDirectory(File dir, ZipOutputStream out, String basedir) {

if (!dir.exists())

return

File[] files = dir.listFiles()

for (int i = 0i <files.lengthi++) {

/* 递归 */

compress(files[i], out, basedir + dir.getName() + "/")

}

}

/** 压缩一个文件 */

private void compressFile(File file, ZipOutputStream out, String basedir) {

if (!file.exists()) {

return

}

try {

BufferedInputStream bis = new BufferedInputStream(

new FileInputStream(file))

ZipEntry entry = new ZipEntry(basedir + file.getName())

out.putNextEntry(entry)

int count

byte data[] = new byte[BUFFER]

while ((count = bis.read(data, 0, BUFFER)) != -1) {

out.write(data, 0, count)

}

bis.close()

} catch (Exception e) {

throw new RuntimeException(e)

}

}

}

3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。

package net.szh.zip

import java.io.File

import org.apache.tools.ant.Project

import org.apache.tools.ant.taskdefs.Zip

import org.apache.tools.ant.types.FileSet

public class ZipCompressorByAnt {

private File zipFile

public ZipCompressorByAnt(String pathName) {

zipFile = new File(pathName)

}

public void compress(String srcPathName) {

File srcdir = new File(srcPathName)

if (!srcdir.exists())

throw new RuntimeException(srcPathName + "不存在!")

Project prj = new Project()

Zip zip = new Zip()

zip.setProject(prj)

zip.setDestFile(zipFile)

FileSet fileSet = new FileSet()

fileSet.setProject(prj)

fileSet.setDir(srcdir)

//fileSet.setIncludes("**/*.java")包括哪些文件或文件夹 eg:zip.setIncludes("*.java")

//fileSet.setExcludes(...)排除哪些文件或文件夹

zip.addFileset(fileSet)

zip.execute()

}

}

测试一下

package net.szh.zip

public class TestZip {

public static void main(String[] args) {

ZipCompressor zc = new ZipCompressor("E:\\szhzip.zip")

zc.compress("E:\\test")

ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip")

zca.compress("E:\\test")

}

}

1.整体思路:

js调用java

首先将js代码注入到webview的页面中,然后通过修改window.location.href来向java传递参数,java端通过监听页面url的改变来识别js端传递的参数.然后再经解析数据实现java方法的调用.

java调用js

java通过webView.loadUrl("JavaScript:"+jsCode)来实现js代码的调用

2. java调用js的实现

java调用js的方法,相当简单:

String jsCode = "(function(){ /*js code here*/ })()"

webview.loadUrl("javascript:" + jsCode)

注意:要把js代码用自执行函数包裹起来

利用这种方法可以把任意代码注入到页面中

注意: 当页面刚加载时就需要把 2.1中的js代码注入到页面中,但是有时会出现页面加载完成,但是注入的代码没有执行的现象,应该是因为js没有及时加载而页面先加载完成。要解决这个问题就需要在页面加载完成时触发一个事件比如jsBridgeReady,js端通过监听jsBridgeReady事件来调用java方法。那么总体流程如下:

加载页面->注入js代码->页面加载完成->触发js注入完成事件

代码:

在BridgeWebClient中添加逻辑: 1,加载页面时注入js代码: 2,加载完成后触发加载完成事件

@Override

public void onLoadResource(WebView view, String url) {

// 注入桥接代码

// 这里通过读取js文件获得js代码

if (mFileName != null) {

view.loadUrl(mBridge.createBaseJs(mContext, mFileName))

}

super.onLoadResource(view, url)

}

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url)

// 触发注入完成事件,用于解决 注入的代码没有及时加载成功导致无法调用的问题

view.loadUrl("(function(){if(window.UAPPJSBridgeReady){window.UAPPJSBridgeReady()}})()")

}

如果你也想从文件读取js代码,记得把读取的代码压缩一下,把注释和换行删除,不然很可能会报错

js端调用java注入的代码:

//判断代码是否注入完成

if(window.UAPPJSBridge){

//调用注入的方法

window.UAPPJSBridge.wxshare(message,success,error)

}else{

//监听注入完成的事件

window.onBridgeLoaded=function(){

if(window.UAPPJSBridge){

window.UAPPJSBridge.wxshare(message,success,error)

}

}

}

框架1:Spring框架

该框架排名第一,因为它具有开发复杂Web应用程序的出色能力,而且,这些应用程序因性能突出而广受赞誉。它使Java开发人员能够轻松地创建企业级应用程序。

Web应用程序开发人员可以证明Spring框架的能力。这就是Spring成为Java开发人员最爱的原因。下面的数据可以证明这一点。以下是开发者(选择Java作为首选的三种编程语言之一)对Java框架的看法:

在开发人员的选择中,Spring MVC和Spring Boot远远领先于其他Java技术。对于开发人员来说,这里的一大优势是他们可以不受其他模块约束而专注于一个模块,因为Spring利用了控制反转(IoC)。

这个框架的其他一些优点是一个全面的配置模型,支持传统数据库和现代数据库(如NoSQL),并通过支持面向方面编程来支持内聚开发。它提供了一些模块,如Spring MVC、Spring Core、Spring Boost、SpringTransaction等。

框架2:Hibernate框架

作为一个对象关系映射(ORM)数据库,它改变了我们以前查看数据库的方式。尽管它不是一个全栈框架,但它可以极其轻松地为多个数据库转换数据。

它支持多个数据库的能力使它很容易扩展,无论应用程序的大小或用户的数量如何。它速度快、功能强大、易于扩展、修改和配置。

框架3:Struts框架

该框架帮助自定义软件开发人员创建易于维护的企业级应用程序。这个框架的USP是它的插件。它们是JAR包,这意味着它们是可移植的。

Hibernate插件和Spring插件分别可以用于对象关系映射和依赖注入。使用此Java框架开发应用程序可以减少处理时间,因为它提供了组织良好的Java、JSP和Action类。

框架4:Play

使用该框架的顶尖公司包括LinkedIn、三星、卫报、Verizon等。这只能说明它的可信度。该框架提供了速度、可伸缩性和性能。

它的用户界面非常简单,使移动应用程序开发人员可以快速理解它。它主要用于开发需要统一内容创建的应用程序。

框架5:Google Web Toolkit

这个框架用于客户端开发,类似JavaScript。它是一个开源的Java框架,这意味着它是免费的。谷歌广泛使用了这个框架,谷歌产品如AdSense、谷歌钱包、AdWords都是使用它编写的。

借助GWT代码,可以轻松地开发和调试Ajax应用程序。Java开发人员更喜欢使用这个框架来编写复杂的应用程序。书签、跨浏览器可移植性、历史记录和管理是它的一些特性。

阅读完分享的Java的热门框架后,希望你能有一个更清晰的了解。了解热门框架不是一个挑战,但是找到适合你需求的框架是一个挑战!