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的热门框架后,希望你能有一个更清晰的了解。了解热门框架不是一个挑战,但是找到适合你需求的框架是一个挑战!