博文

使用 java.util.zip包压缩和解压缩数据(2014-03-27 10:21:00)

摘要: 许多资料来源中都含有多余数据或对存储信息无用的数据。这常常造成客户机 和服务器应用程序间或电脑间浩如烟海的数据传输。很明显,数据存储和信息传 输问题解决办法是,安装辅助存储装置并扩展现有的通信设备。然而,要做到这 一点,就需要增加组织的运行费用。减轻部分数据存储和信息传输的方法之一是, 以更有效的代码表示数据。本文简要介绍数据压缩和解压缩,以及如何有效地、方便地从JavaTM应用程序内部使用 java.util.zip包压缩和解压缩数据。 虽然 WinZip、gzip和Java ARchive(或 jar)等工具可以用来压缩和解压缩数据,这些工具仍被用作独立 的应用程序。从 Java 应用程序中可以调用这些工具,但并非是简捷有效的解决 方法。在希望迅速地(如在传输到远程机器之前)压缩和解压缩数据的情况下, 尤其如此。本文将: 简要综述数据压缩 描述java.util.zip包 介绍如何使用这些包压缩和解压缩数据 介绍如何压缩和解压缩已序列化的对象以节省磁盘空间 介绍如何迅速压缩和解压缩数据,以提高客户/服务器应用程序的性能 概述数据压缩 文件冗余最单一的类型是字符的重复。例如,下列字符串: BBBBHHDDXXXXKKKKWWZZZZ 可以更简洁地对本字符串进行编码,方法是以重复字符和代表其重复次数的数 字代替每个重复字符串。因此,上述字符串可以编码为: 4B2H2D4X4K2W4Z 这里的" 4B "表示4个B,而2H表示2个H,等等。以这种方法压缩字符串的编码 方式叫做运行长度编码。 另一个例子,是矩形图像存储。因为是单色位图图像,所以按图表1所示存储。 图表1∶带运行长度编码信息的位图 第二种方法是将图像存为图解元文件∶ 矩形11、3、20、5 它表示,该矩形起始坐标是(11, 3),宽度是 20 像素,长度是 5 像素。 矩形图像可以通过计算相等字节的方式,以运行长度编码进行压缩,如下: 0, 40 0, 40 0,10 1,20 0,10 0,10 1,1 0,18 1,1 0,10 ......

阅读全文(21773) | 评论:17

简单说说JavaBean的使用(2014-03-27 10:19:00)

摘要: 一:JavaBean定义 JavaBean是一种可重复使用、跨平台的软件组件。JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如NetBean中的那些可视化图形界面 , ;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是最后一种JavaBean。 二:Jsp与JavaBean搭配使用的特点 1.使得Html与Java程序分离,这样便于维护代码。如果把所有的程序代码都写成jsp到网页中,会使得代码繁杂,难以维护。 2.可以降低开发jsp网页人员对Java编程能力的要求。 3.jsp侧重生成动态网页,事务处理由JavaBean来完成,这样可以充分利用JavaBean组件的可重用性特点,提高开发网站的效率。 三:一个标准的JavaBean有以下几个特性: -JavaBean是一个公共的(public)类。 -JavaBean有一个不带参数的构造方法。 -JavaBean通过setXXX方法设置属性,通过getXXX方法获得属性。 四:声明JavaBean对象 标签用来声明JavaBean对象,的具体讲解请查看之前的博客jsp:useBean的用法。   (转自 www.gztarena.com) ......

阅读全文(19369) | 评论:24

JAVA并发编程学习笔记之CAS操作 分享(2014-03-27 10:18:00)

摘要: CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。 我们常常做这样的操作 if(a==b) { a++; } 试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问题的原因是在多线程环境下,a的值处于一种不定的状态。采用锁可以解决此类问题,但CAS也可以解决,而且可以不加锁。 int expect = a; if(a.compareAndSet(expect,a+1)) { doSomeThing1(); } else { doSomeThing2(); } 这样如果a的值被改变了a++就不会被执行。 按照上面的写法,a!=expect之后,a++就不会被执行,如果我们还是想执行a++操作怎么办,没关系,可以采用while循环 while(true) { int expect = a; if (a.compareAndSet(expect, a + 1)) { doSomeThing1(); return; } else { doSomeThing2(); } } 采用上面的写法,在没有锁的情况下实现了a++操作,这实际上是一种非阻塞算法。 应用 java.util.concurrent.atomic包中几乎大部分类都采用了CAS操作,以AtomicInteger为例,看看它几个主要方法的实现: public final int getAndSet(int newValue) { for (;;) { int current = get(); if (compareAndSet(current, newValue)) return current; } } getAndSet方法JDK文档中的解释是:以原子方式设置为给定值,并返回旧值。原子方式体现在何处,就体现在compareAndSe......

阅读全文(20344) | 评论:19

Javascript删除列表项中的下拉项(2014-03-24 11:10:00)

摘要: Javascript如何删除列表项中的下拉项呢?要从列表框同时删除多个项目,我们不能从上到下的删除,因为上面的项目每删除一个,下面的项目的索引号就会变化,所以只能从下向上删除,这样才不会出现索引号乱变的问题了。 如下面的例子: HTML代码: <table> <tr> <td align="center"> <select id="lsbox" name="lsbox" size="10" multiple> <option value="1">India</option> <option value="2">United States</option> <option value="3">China</option> <option value="4">Italy</option> <option value="5">Germany</option> <option value="6">Canada</option> <option value="7">France</option> <option value="8">United Kingdom</option> </select> </td> </tr> <tr> <td align="center"> <button onclick="listbox_remove('lsbox');">Delete</button> <button onclick="window.location.reload();">Reset</button> </td> </tr> ......

阅读全文(3882) | 评论:0

JAVA中可以有两个方法处理大数计算(2013-06-19 14:49:00)

摘要:首页,感谢你的阅读,本人观点:学习编程是个漫长的过程并不是一时就会很厉害的,关键是坚持,快乐地学习,在这里分享我的一些笔记给你; 广州JAVA培训中可以在java中有两个方法处理这个问题 第一种方法就是BigInteger类,用这个类可以很方便的求出非常大的数.以求100!为例 import java.io.*; import java.math.BigInteger; public class calc { public static void main(String[] args) throws IOException{ BigInteger s = BigInteger.valueOf(1); for(int i=1;i<=100;i++){ s = s.multiply(BigInteger.valueOf(i)); System.out.println(s); } } } 第二种方法是,把求的值放在足够大的数组中 import java.util.*; public class calc2{ public static void main(String[] args) throws Exception{ int[] data = new int[1000]; int num = 1; data[1] = 1; System.out.println("用数组解决java大数计算问题"); System.out.println("求一个整数的阶乘,请输入一个整数:"); Scanner input = new Scanner(System.in); int n = input.nextInt(); for(int i=1;i<=n;i++){ for(int j=1;j<=num;j++){ data[j] = data[j] * i; } for(int j=1;j<num;j++){ if(data[j] >= 10){ data[j+1]+=data[j]/10; data[j]=data[j]%10; } } while......

阅读全文(4907) | 评论:0

分享关于Java静态内部类(2013-06-06 16:15:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内java培训的学员,感谢你对本博客的支持; 今天在网上看到一篇关于Java静态内部类的介绍,文章还是写不错。于是加以装载,记录下来供更多读者学习和参考。 如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。 嵌套类意味着: 1. 嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。 public class StaticTest{ private static String name = "woobo"; private String num = "X001"; static class Person{ // 静态内部类可以用public,protected,private修饰 // 静态内部类中可以定义静态或者非静态的成员 private String address = "China"; private Static String x=“as”; public String mail = "kongbowoo@yahoo.com.cn";//内部类公有成员 public void display(){ //System.out.println(num);//不能直接访问外部类的非静态成员 // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法) System.out.println(name);//只能直接访问外部类的静态成员 //静态内部类只能访问外部类的静态成员(包括静态变量和静态方法) System.out.println("Inner " + address);//访问本内部......

阅读全文(4247) | 评论:0

浅谈支持Java平台三种事务模型(2013-06-03 14:19:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持; 在客户端发出了多个基于服务器或基于模型的调用来完成一个单独的工作单元时需要使用客户端编排(Client Orchestration)事务策略 事务对于确保数据的完整性与一致性是至关重要的。要想完全理解事务,必须得熟悉一些基本概念、模型还有策略。Mark Richards说到“混淆事务模型与事务策略是个常见错误”。这篇文章谈到了“Java"平台所支持的三种事务模型并对基于这些模型的四种主要事务策略展开了讨论。通过使用Spring Framework及Enterprise JavaBeans(EJB)3.0的一些示例,Mark介绍了事务模型的工作方式及他们缘何能作为从基本的事务处理到高速事务处理系统的基石” 。 Java平台支持三种事务模型: * 本地事务模型——事务由DB资源而不是应用容器或框架管理。开发者管理连接而不是事务。 * 编程式事务模型——开发者从事务管理器中获取事务,之后需要自己编写事务启动、提交、异常及回滚代码。 * 声明式事务模型——最常见的模型,又叫做容器管理事务。在这种模型下,容器管理着事务,开发者定义(声明)事务的行为和参数。 但这种支持仅能描述事务基本信息和期望行为以及使用的语法和规则。事务策略能够解决如下问题:何时需要使用REQUIRED或MANDATORY属性、特定的指令、使用哪种模型及如何对特定的情况进行优化。 Mark在之前的一篇文章中讨论了事务模型的优势与陷阱。 这篇文章介绍了使用特定模型的策略及如何以恰当的方式使用模型。下面列出了这四个策略: * 在客户端发出了多个基于服务器或基于模型的调用来完成一个单独的工作单元时需要使用客户端编排(Client Orchestration)事务策略。 * 在对后端调用的主要入口方法是粗粒度(如果你愿意可以称其为服务)的情况下需要使用API层事务策略。 * 高并发事务策略是上面策略的一个变种,在应用无法支持长事务的情况下需要使用该策略(通常基于性能和可伸缩性考虑)。 * 高速处理事务策略也许是最极端的一种事务策略了。如果应用需要最快的处理时间(以及吞吐量),同时还要在处......

阅读全文(4549) | 评论:0

浅谈Java开发工具一路走来的历程(2013-05-08 11:06:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持; 2008年的软件开发生命周期管理软件(software development lifecycle: SDLC)在2008年有了长足进展,JavaWorld的Java工具领域专家John Ferguson 为我们带来2008年Java领域自动构建框架,软件开发周期管理工具,测试工具,以及IDEs方面的总结。他指出java工具2008年的变化包括CI持续集成工具的改进,JVM脚本语言支持上升,以及对支持多核系统编程工具需求增加等。让我们开始吧! Build automation 让我们从现代软件开发进程的核心部分开始:Build automation自动构建,整体来看,build automation包括持续集成(continuous integration :CI)工具,构建脚本build-scripting工具,代码质量控制工具,以及版本管理或者称为SCM存储管理工具。 build automation的第一个舞台是自动build脚本。传统工具类似于Apache Maven和Apache Ant,以及最新的Gant和Gradle,能够帮助创建build脚本。在2008年,我看到许多大型公司都开始使用Maven,被Maven能在内部软件组件中为多个团队之间提供标准化开发实践,和提供显著的连贯透明的架构所吸引。这个趋势明显将继续延续到2009年。 Maven:最新的和即将发布的功能 在2008年,Maven 2的最高版本2.0.9发布,Maven 2.0.9修正了bug和添加了一些新的功能,Maven拥有更好的稳定性,并提供很好的方式使用插件来驾驭依赖管理。比如,你能够使用Checkstyle 插件来更新Checkstyle的版本。 总而言之,Maven开发中最活跃的是专注于新的重要版本的发布:Maven 2.1,这个版本将于2009年初面世。新的版本将包含很多性能改进和最优化,包括为多模块项目提供更精细的build 规则,和能够平行下载不相关依赖包,而不是现在我们使用的串行方式。 Eclipse对Maven的支持更好,m2eclipse 插件为Maven开发提供了完整......

阅读全文(3185) | 评论:0

程序中的图像复制到非java应用程序实现(2013-04-23 13:49:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持; Java开发图形应用程序的朋友一定遇到过如何在程序中实现复制图像的功能。在jdk1.4以前,java本身就支持将程序中文字串复制给其它的非java应用程序使用,而将程序中的图像复制到非java应用程序简直难上加难。只到jdk1.4出来,这个问题才得以解决。 一般我们开发java application界面,主要用swing图形包。几乎所有的swing控件都是由JComponent继承而来的。如果我们要取得JComponent的图像,可以用以下方式: Rectangle rect = comp.getBounds(); BufferedImage bufImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB); Graphics g = bufImage.getGraphics(); g.translate(-rect.x, -rect.y); comp.paint(g); 这样的话,图像就保存到BufferedImage对象当中了。 现在来看如何将这个BufferedImage复制到系统clipboard中。要做复制功能,一般是继承TransferHandler类,实现Transferable接口, 这样你的复制内容才能传到系统clipboard,为此我们来写一个ImageSelection类: /** * Copyright: Copyright (c) 2002 * @author Turbo Chen * @version 1.00 */ import java.awt.*; import java.awt.image.*; import java.awt.datatransfer.*; import javax.swing.*; public class ImageSelection extends TransferHandler implements Transferab......

阅读全文(2560) | 评论:0

列举JAVA开发中需要注意的事项,你都知道吗?(2013-04-12 10:16:00)

摘要:首先,感谢你的阅读,本人观点:学习编程是个漫长的过程并不是一时就会很厉害的,关键是坚持,快乐地学习,在这里分享我的一些笔记给你; java的类型自动提升规则 1、所有byte,short,char型的值将被提升到int型; 2、如果一个操作数为long型,计算结果就是long型; 3、如果一个操作数是float型,计算结果就是float型; 4、如果一个操作数是double型,计算结果就是double型。 我们不能把任何方法体内的变量声明为静态,例如下面这样是不行的 fun{ static int i = 0; } 1、在静态的方法里只能直接调用同类中其他静态成员(包括变量和方法),而不能直接访问类中的非静态成员,这是因为,对于非静态成员,先要创建类的实例对象后才可使用,而静态成员在使用前是不需要实例化的; 2、静态方法不能以任何形式引用this或super关键字; 3、main()方法是静态的,因此jvm在执行main方法时,不创建main方法所在的类的实例对象,因此在main方法中,不能直接访问该类中的非静态成员。 1.final标记的类不能被继承; 2.其标记的方法不能被子类重写; 3.其标记的变量即变成常量,只能赋值一次,但这个常量也只能在这个类内部使用,不能在类的外部使用,且赋值只能在声明的时候显式赋值或在构造方法中赋值,构造方法里不含返回值的概念是不同于“void”的,对于"public void example()"这样的写法就不再是构造方法了,而变成了普通方法,很多人都会犯这种错,在定义构造方法时加了void,结果这个方法就不再自动调用了。 1.java只支持单继承,不允许单继承,但一个类可以被多个类继承; 2.可以有多重继承,即一个类可以继承某个类的的子类,如B继承了A,C又可以继承B,那么C也间接继承了A; 3.子类继承父类所有的成员变量和成员方法,但不继承父类的的构造方法,在子类的构造方法中,可以使用语句super调用父类的构造方法; 4.如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重 载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法,如果父类没有无参数的构造方法,则编译出......

阅读全文(3395) | 评论:0