博文

使用 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 ......

阅读全文(21712) | 评论: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) ......

阅读全文(19313) | 评论: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......

阅读全文(20287) | 评论: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> ......

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

JAVA面试指南:overload和override的区别(2014-03-24 11:09:00)

摘要: java软件工程师在应聘时面试官经常会问多个专业问题来考察你的java能力,其中override和overload的区别就是一个非常常见的面试问题,下面就来教教大家这两者到底有什么区别。 java软件工程师在应聘时面试官经常会问多个专业问题来考察你的java能力,其中override和overload的区别就是一个非常常见的面试问题,下面就来教教大家这两者到底有什么区别。 Overload是重载的意思,Override是覆盖的意思,也就是重写。我们说面向对象有四大特征:抽象,继承,封装,多态。其中多态这种特征的表现形式就包括方法的重写与重载。 重载Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。那么如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载?结果是不行的。,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java 就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。 重写Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。 (转自 www.jvtarena.com)......

阅读全文(3545) | 评论: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......

阅读全文(4898) | 评论: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);//访问本内部......

阅读全文(4237) | 评论: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层事务策略。 * 高并发事务策略是上面策略的一个变种,在应用无法支持长事务的情况下需要使用该策略(通常基于性能和可伸缩性考虑)。 * 高速处理事务策略也许是最极端的一种事务策略了。如果应用需要最快的处理时间(以及吞吐量),同时还要在处......

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

提供对于java程序在职业道路的出路(2013-05-28 14:15:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持;  从我做小程序员开始,就从未间断的在论坛看到有人在问java程序员的出路在哪里,其实我很能理解这些人的想法,在行业做了几年,有些感想跟大家随便聊聊。 俗话说,365行,行行出状元,此话也适用于IT行业,尤其是程序员。 当你迷茫找不到出路,又想快速成长和提高的时候,达内java培训有两种方案可以供你参考: 1、努力成为你工作环境中最优秀的人(技术最好的人); 2、跳槽,去另外一家公司做比你能力要高的工作。 针对工作环境的不同,分为大环境和小环境(人多和人少): 1、小环境,寻找技术最好的人,努力不断向他接近,当你通过努力觉得超过他的时候,我相信你就不会再来问“出路在哪里”的问题了。 2、大环境,人多优秀的人也多,想短时间超越所有人是有相当难度的,能与每个优秀人都交流的概率低,所以你可以选择跳槽。 跳槽,在我看来是程序员成功的必经之路。跳槽是有技巧的,同时也需要一定的运气,如果想跳槽就要果断。当你觉得不如意时,当你觉得没有出路时,当你觉得待遇不满意时,当你觉得成长不够快时。。。都可以考虑跳槽。 跳槽有利有弊,对企业来说,跳槽是不好的;对于打工者来说,跳槽是很完美的。企业培养一个程序员不容易,辛苦的带起来一个人,熟悉了业务,掌握了技术,这时候走人,损失最大的当然是企业,花时间培养人和熟悉业务也是需要成本的。对程序员来说,跳槽几乎是利大于弊,首先待遇上肯定立竿见影的体现,如果没体现出来那就是跳的失败,除非有其他想法和目标。 不要误会我的意图,跳槽对于技术人员来说并不是坏事: 1、一般的IT公司都有自己的常用的模式,该模式经过一个项目之后,就可以基本掌握,相关覆盖的知识、架构等大概也可以了解,此时可以换个环境寻找更高的发展; 2、跳槽相当于变向的升职,这个可以从你的简历中体现出来。 假如你是一个初级程序员。当你做完一个项目的时候,你会了解这个项目的整个流程,此时可以在简历中填写中级程序员的角色,把很多中级程序员做的事情写到你的履历里(前提是你要了解这些),跳槽的时候,你的目标自然就是中级程序员,而招聘公司看到你的情况也会觉得合适。 ......

阅读全文(5144) | 评论:1

监控Java应用程序性能和跟踪Java中的代码(2013-05-24 16:15:00)

摘要:在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持; 很多开发者觉得自己懂Java编程,事实是大多数开发人员都只领会到了Java平台的皮毛,所学也只够应付工作。作者将深度挖掘Java平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程困难。 当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中。跟踪Java应用程序瓶颈来源一直以来都是很麻烦的,因为Java虚拟机有黑盒效应,而且Java平台分析工具一贯就有缺陷。 然而,随着Java5中JConsole的引入,一切都发生了改变。JConsole是一个内置Java性能分析器,可以从命令行或在GUIshell中运行。它不是完美的,但是当尖头老板来问你关于性能的问题时,用它来应对还是绰绰有余的——这比查询PapaGoogle要好得多。 我们将向您展示5个方法,使您可以轻松地使用JConsole(或者,它更高端的“近亲”VisualVM)来监控Java应用程序性能和跟踪Java中的代码。 1.远程连接进程 因为Web应用程序分析工具假设通过一个套接字进行连通性分析,您只需要进行少许配置来设置JConsole(或者是基于JVMTI的分析器,就这点而言),监控/分析远程运行的应用程序。 如果Tomcat运行在一个名为“webserve”的机器上,且JVM已经启动了JMX并监听端口9004,从JConsole(或者任何JMX客户端)连接它需要一个JMX URL“service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi”。 基本上,要分析一个运行在远程数据中心的应用程序服务器,您所需要的仅仅是一个JMX URL。 2.JDK附带分析器 许多开发人员没有意识到从Java 5开始JDK中包含了一个分析器。JConsole(或者Java平台最新版本,VisualVM)是一个内置分析器,它同Java编译器一样容易启动。如果是从命令行启动,使JDK在PATH上,运行jconsole即可。如果从GUIshell启动,找到JDK安装路径,打开bin文件夹,双击jconsole。 当分析工具弹出时(取决于正在运行的Jav......

阅读全文(5351) | 评论:2