Loading, please wait...
Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Friday, April 3, 2009

原来java中try - catch - finally的执行是这样的.

以前对java中try-catch-finally总是一知半解,今天看到憨厚生博客关于try catch finally一点疑惑的讨论,才大开眼界.
public int test1(){
   int i=4;
   try{
       return i;
   }finally{
       i=0;
      System.out.println("---test----");
   }
}// 返回4
public int test2(){
   int i=4;
   try{
      return i;
   }finally{
      i=0;
      System.out.println("---test----");
      return i;
   }
}//返回0
注意两个方法的返回值.
按jbahamut的说法
return 压栈,执行finally,方法返回
第一个test中return压栈后,栈中的值没有变,所以返回4 
finally总是被执行的,如此在finally中的某些操作是非常危险的.如Fingki.li所说.
finally块里尽量避免使用return,会吃掉exception.
今天真是上了一课,以前还自以为在finally中使用return很不错,原来犯了这么大的忌讳.

转载声明: 出自: Ghoul To World!作者: GreatGhoul

Monday, March 23, 2009

突然想到字符串与整数相乘的简单实现

用正则,效率还算不错。
public class StringUtility { 
   public static String buildString(String cell, int length) {
        StringBuilder ret = new StringBuilder(length);
        ret.setLength(length);
        ret.setCharAt(length - 1, ' ');
        return ret.toString().replaceAll(".", cell);
    }

    public static void main(String[] args) {
        System.out.println(StringUtility.buildString("[]", 10000));
    } 
} 

不知道还有没有更好的实现方法。

转载声明: 出自: Ghoul To World!作者: GreatGhoul

LayoutManager删除Component的的误区

最近在写ui时,一时糊涂,用LayoutManager的removeLayoutComponent方法移除组件,结果组件是移除了,但重新在容器内添加新组件内,显示的竟然还是原来的(我的布局是BorderLayout),起初还以为是界面没更新了,折腾了半天,重新查API,结果找到了原因。
BorderLayout (Java 2 Platform SE 6)

removeLayoutComponent

public void removeLayoutComponent(Component comp)
从此边框布局中移除指定组件。当容器调用其 remove 或 removeAll 方法时,可调用此方法。大多数应用程序并不直接调用此方法。
指定者:
接口 LayoutManager 中的 removeLayoutComponent

参数:
comp - 要移除的组件。
另请参见:
Container.remove(java.awt.Component), Container.removeAll()
从布局中移除指定组件,也就是说并没有从容器中移除。所以还是建议使用容器的remove方法移除组件,以保万无一失。
偶然遇到这样的情况,和大家分享下。

转载声明: 出自: Ghoul To World!作者: GreatGhoul

Saturday, March 14, 2009

FileNameFilter接口应用: 指定多个扩展名过滤规则

学java的经常会写一些FileNamesFilter以方面自已获取文件列表.
G.G我捉摩了下这个接口.也写了一个自已的应用来获取能匹配扩展名列表的文件集合.
大家pp.用匿名实现.
/**
 * Returns a list of files that the extension name matchs one of extensions.
 * 

Usage: getFilesByNameExtensions(dir, "txt", "JPEG");
 * @author GreatGhoul http://greatghoul.blogspot.com  * @param dir The directory to scan in.  * @param extensions Extensions collection.  * @return A list of matched files.  */ public static List getFilesByNameExtensions(File dir, final String... extensions) {     return Arrays.asList(dir.listFiles(new FilenameFilter()  {         @Override         public boolean accept(File dir, String name) {             File file = new File(dir, name);             boolean accept = false;             for (String extension : extensions) {                 if (file.isDirectory()) break;                 if (name.toLowerCase().endsWith("." + extension.toLowerCase())) {                     accept = true;                     break;                 }             }             return accept;         }        })); }
Enjory it.

转载声明: 出自: Ghoul To World!作者: GreatGhoul

用正则验证文件名是否合法(仅限win平台)

的Java中用到文件操作时,经常要验证文件名是否合法.
我以前都是用File类的createNewFile()方法.当然,这个方法的确很管用.但当要批量验证时,总不能一个个创建文件吧.

于是想到了正则,正则匹配的开销比创建文件小了不知道多少倍.
Google了一下Win平台的文件名规则,并实践了一下.

ps: 这学期学习马哲,老师告诉我们黑格尔说的思想的运动也算是一种实践行为是不正确的.如此说来YY也不能算是实践.真是可惜.

那么一个合法的文件(Win下)应该符合如下规则 .
  1. 文件名不能为空,空在这里有两个意思


    • 文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等不可见的转义字符)
    • 文件名和扩展名不能同时为空.但实际上我们可以用程序创建出类似.project,..txt等形式的文件,但却创建不出类似abc.的文件
  2. 文件名中不能包含\/:*?"<>|中的任意字符
  3. 文件名(包括扩展名)的长度不得大于255个字符
事实上形如".."(不包含引号,下同)的文件也不能被创建.
不合法的文件还有类似" aa", "aa ", "aa."(会被创建为"aa",也把它算作不合法),"a\ta"(\t为制表符等不可见字符(除空格外))

于是我们得到了文件名命名规则的更详细规定:
  1. 首尾不能有空字符(空格、制表符、换页符等空白字符的其中任意一个),文件名尾不能为.号
  2. 文件名和扩展名不能同时为空
  3. 文件名中不能包含\/:*?"<>|中的任意字符
  4. 文件名(包括扩展名)的长度不得大于255个字符
  5. 在1.的条件下,文件名中不能出出现除空格符外的任意空字符.出现控制字符其实也算不合法,但因为情况太复杂,就不做判断了。
于是有如下匹配
首字符: [^\s\\/:\*\?\"<>\|]
尾字符: [^\s\\/:\*\?\"<>\|\.]
其它字符: (\x20|[^\s\\/:\*\?\"<>\|])*

\s 只能匹配下面六种字符(via: java.util.regex.Pattern):
半角空格( )
水平制表符(\t)
竖直制表符
回车(\r)
换行(\n)
换页符(\f)

用Java语言实现:
public static boolean isValidFileName(String fileName) {
    if (fileName == null || fileName.length() > 255) 
        return false;
    else
        return fileName.matches(
           "[^\\s\\\\/:\\*\\?\\\"<>\\|](\\x20|[^\\s\\\\/:\\*\\?\\\"<>\\|])*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$");
}

用于测试:
System.out.println("null(未初始化)" + "\t" + isValidFileName(null));
System.out.println(" .xml" + "\t" + isValidFileName(" .xml"));
System.out.println(".xml " + "\t" + isValidFileName(".xml "));
System.out.println(" .xml " + "\t" + isValidFileName(" .xml "));
System.out.println(".xml." + "\t" + isValidFileName(".xml."));
System.out.println(".xml" + "\t" + isValidFileName(".xml"));
System.out.println("    .xml(制表符)" + "\t" + isValidFileName("    .xml"));
System.out.println(".." + "\t" + isValidFileName(".."));
System.out.println("fdsa    fdsa(制表符)" + "\t" + isValidFileName("fdsa    fdsa(制表符)"));
System.out.println("a.txt" + "\t" + isValidFileName("a.txt"));

转载声明: 出自: Ghoul To World!作者: GreatGhoul

Monday, February 23, 2009

Java启动画面类

    最近编写了几个Java桌面程序,打成jar后启动速度不是很理想,很长一段时间主窗口才能完全加载.于是想到加一个启动画面.
    在网上找了好久也没有找到一个满意的,于是自已写了一个,虽然简陋,但好歹可以用.

构造方法:
public GSplashWindow(String imgPath) 通过路径构造
public GSplashWindow(Image bgImage)  通过图像对象构造

方法:
public void start() 显示启动画面
public void end() 销毁启动画面
public void setStatus(String statusText) 设置状态信息



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;

/**
 * 启动画面类
 * 
 * @author GreatGhoul
 */
public class GSplashWindow extends JWindow {
    
    /** 当前状态信息 */
    JLabel status = null;
    
    /** 背景图像 */
    private Image bgImage = null;
    
    /**
     * 通过路径构造启动画面
     * 
     * @param imgPath 背景图像路径
     */
    public GSplashWindow(String imgPath) {
        this.bgImage = new ImageIcon(imgPath).getImage();
        initComponents();
    }
    
    /**
     * 通过图像对象构造启动画面
     * 
     * @param bgImage 背景图像对象
     */
    public GSplashWindow(Image bgImage) {
        this.bgImage = bgImage;
        initComponents();
    }
    
    private void initComponents() {
        // 获取图片尺寸
        int imgWidth = bgImage.getWidth(this);
        int imgHeight = bgImage.getHeight(this);
        
        // 设置窗口大小
        setSize(imgWidth, imgHeight);
        
        // 设置窗口背景
        JPanel background = new JPanel() {
            protected void paintChildren(Graphics g) {
                g.drawImage(bgImage, 0, 0, this);
                super.paintChildren(g);
            }
        };
        background.setLayout(new BorderLayout());
        setContentPane(background);
        
        // 设置窗口位置 
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension scmSize = toolkit.getScreenSize();
        setLocation(scmSize.width / 2 - imgWidth / 2, 
                scmSize.height / 2 - imgHeight / 2);
        
        // 加入状态条
        status = new JLabel("状态条..........", JLabel.RIGHT);
        status.setForeground(Color.WHITE);
        status.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        getContentPane().add(status, "South");
    }
    
    public void start() {
        setVisible(true);
        toFront();
    }
    
    /**
     * 设置状态信息
     * 
     * @param statusText 状态信息
     */
    public void setStatus(String statusText) {
        status.setText(statusText);
    }
    
    public void stop() {
        setVisible(false);
        dispose();
    }
}

转载声明: 出自: Ghoul To World!作者: GreatGhoul

Sunday, November 16, 2008

java BoxLayout布局心得

非常喜欢java的布局方式,但系统提供的寻几个基础布局方式太不强大,在使用时很不便.尤其是BoxLayout时,会改变添加到其中的组件的大小,组件会因为容器大小的关系被撑得很难看.



经过反复实验,找到了一种解决方法.



解决方案:容器嵌套



在应用了BoxLayout的容器外层套一个应用了BorderLayout,根据需要,将内层容器添加到外层容器的非Center位置.这样,BorderLayout就可以限制内层容器到最合适的大小.

转载声明: 出自: Ghoul To World!作者: GreatGhoul

Wednesday, October 15, 2008

Netbeans 优化手册

安装了NB后感觉很卡,字体也很小.再者就是资源占用上让人很不满意.
Google了一篇文章,用来做优化.

这是在版本6.0beta2上的优化。
1,修改英文netbeans界面字体大小,修改%Netbeans_home%\etc\netbeans.conf
在netbeans_default_options里加上 --fontsize 13

2,修改JVM内存配置(本机内存1G,不同内存大小不同设置)
在netbeans_default_options里加上 -J-Xmx512m,同时修改-J-Xms256m。
【说明】-J-Xms32m
此设置用于通知 Java 虚拟机将其初始堆大小设置为 32 MB。通过通知 JVM 它最初应该为堆分配多少内存,我们可以防止它随着 IDE 使用更多的内存而将堆增大。
【说明】-J-Xmx128m
此设置用于指定 Java 虚拟机应该用于堆的最大内存。对此数值设置硬性上限意味着 Java 进程不能使用比可用的物理 RAM 更多的内存。对于具有更多内存的系统可以提升此限制 - 128 MB 设置有助于确保 IDE 在 256MB 的系统上可靠地执行操作。注意:不要将此值设置为接近或大于系统中的物理 RAM 数,否则在主要回收过程中将导致频繁的交换空间操作。

3,在netbeans_default_options里修改 -J-XX:PermSize=20m
这是一个较特殊的 JVM 开关,但它也缩短了启动时间。此设置用于调整内存中“永久区域”(在这里保存类)的大小。由于我们知道所有 IDE 类均占用特定数量的内存,因此我们向

转载声明: 出自: Ghoul To World!作者: GreatGhoul