﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-J2ME 技术的学习与实践者-随笔分类-OpenBaseMovil 资料</title><link>http://www.blogjava.net/iwinyeah/category/30292.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 23 Mar 2008 01:15:06 GMT</lastBuildDate><pubDate>Sun, 23 Mar 2008 01:15:06 GMT</pubDate><ttl>60</ttl><item><title>[导入]OpenBaseMovil Action &lt;--&gt; View &lt;--&gt; Controller</title><link>http://www.blogjava.net/iwinyeah/archive/2008/03/17/187974.html</link><dc:creator>iwinyeah</dc:creator><author>iwinyeah</author><pubDate>Mon, 17 Mar 2008 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/iwinyeah/archive/2008/03/17/187974.html</guid><wfw:comment>http://www.blogjava.net/iwinyeah/comments/187974.html</wfw:comment><comments>http://www.blogjava.net/iwinyeah/archive/2008/03/17/187974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iwinyeah/comments/commentRss/187974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iwinyeah/services/trackbacks/187974.html</trackback:ping><description><![CDATA[          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
                    链接：<a href="http://iwinyeah.javaeye.com/blog/172974" style="color:red;">http://iwinyeah.javaeye.com/blog/172974</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Action: 规定了与用户交互的View可以触发的动作,在某个View新建之后显示之前,应先为其指定具体的Action,当用户按下了相应的Command按钮之后，View将该Command对应的Action发送到该View的Controller进行处理。
<br /><pre name="code" class="java">
//
public class Action{
    String name; // 名称 
    Command command; // 命令 
    int code; // 代码 (将由该View的传递到其Controller使用)
    Item item; // 数据项 
    boolean defaultAction; // 是否是默认的Action 
    //...省略
}

</pre>
<br />请看View的基类的代码节选
<br /><pre name="code" class="java">
public abstract class AbstractView{

    //...省略

    // 为该View增加Action
    public void addAction( final Action action, final boolean active )
    {
        if( !actions.containsKey( action.getName() ) )
        {
            // 将Action存入Actions表中
            actions.put( action.getName(), action );
            if( active )
            {
                activateAction( action );
            }
        }
    }

    // 使Action生效可用
    private void activateAction( final Action action )
    {
        final Command command = action.getCommand();
        activeActions.put( command, action );
        final Item item = action.getItem();
        if( item == null )
        {
            addCommand( command ); // 该Action是屏幕相关的命令
        }
        else
        {
            item.addCommand( command ); // 该Action是数据项相关的命令
            if( action.isDefaultAction() )
            {
                item.setDefaultCommand( command );
            }
        }
    }

    //...省略

    // 用户按下相应的命令键后,触发执行与其关联的Action
    public void commandAction(
            final Command       command,
            final Displayable   displayable
    )
    {
        if( !handleAction( command ) )
        {
            if( displayable instanceof Choice )
            {
                AbstractController.commandAction(
                        this,
                        command,
                        (Choice) displayable
                );
            }
            else
            {
                AbstractController.commandAction( this, command );
            }
        }
    }

    // 用户在某个指定了命令的Item按下了命令按钮时触发执行与其关联的Action
    public void commandAction( final Command command, final Item item )
    {
        if( !handleAction( command ) )
        {
            AbstractController.commandAction( this, command );
        }
    }

    // 根据所触发的命令查找关联的Action,并新它发送到Controller进行处理
    public boolean handleAction( final Command command )
    {
        if( activeActions.containsKey( command ) )
        {
            final Action action = (Action) activeActions.get( command );
            // 以Action代码为参数生成ControllerEvent并传递到controller处理
            final ControllerEvent event = new ControllerEvent(
                    action.getCode(),
                    this
            );
            controller.handle( event );
            return true;
        }
        else
        {
            return false;
        }
    }

    //...省略

}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/172974#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">中科院软件、计算机工程硕士;中港软件硕士、管理类硕士博士招生</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">WebSphere 产品家族新特性系列经典推荐</span></a></li></ul>
          <br/><br/><br/>
          <br>文章来源:<a href='http://iwinyeah.javaeye.com/blog/172974'>http://iwinyeah.javaeye.com/blog/172974</a> <img src ="http://www.blogjava.net/iwinyeah/aggbug/187974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iwinyeah/" target="_blank">iwinyeah</a> 2008-03-17 14:06 <a href="http://www.blogjava.net/iwinyeah/archive/2008/03/17/187974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]OpenBaseMovil StreamParser 流标识符分段器</title><link>http://www.blogjava.net/iwinyeah/archive/2008/03/12/187977.html</link><dc:creator>iwinyeah</dc:creator><author>iwinyeah</author><pubDate>Tue, 11 Mar 2008 23:03:00 GMT</pubDate><guid>http://www.blogjava.net/iwinyeah/archive/2008/03/12/187977.html</guid><wfw:comment>http://www.blogjava.net/iwinyeah/comments/187977.html</wfw:comment><comments>http://www.blogjava.net/iwinyeah/archive/2008/03/12/187977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iwinyeah/comments/commentRss/187977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iwinyeah/services/trackbacks/187977.html</trackback:ping><description><![CDATA[          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://iwinyeah.javaeye.com">iwinyeah</a>&nbsp;
                    链接：<a href="http://iwinyeah.javaeye.com/blog/170335" style="color:red;">http://iwinyeah.javaeye.com/blog/170335</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在处理资源文件时，我以前的做法是一次性读入资源文件，然后再进行处理，在处理大文件时，这种方法对由于对机器内存消耗较大而存在隐患，刚想将它改为逐字读入的方式，在OpenBaseMovil中发现了这个类，很符合我的要求。关键代码如下：
<br /><pre name="code" class="java">
//... 省略
	public static final String WHITESPACE = "\r\n\t ";
	public String next(final String delimiters, final boolean keepWhitespace,
			final boolean allowComments, final boolean reuseDelimiter,
			final boolean processEscape) throws IOException {
		try {
			final StringBuffer token = new StringBuffer();
			startLine = endLine;
			startChar = endChar;
			int c = in.read();
			endChar++;
			int status = INITIAL;
			while (c != -1) { // 若还未读到文件尾
				if (c == '\n') {
					endLine++;
					endChar = 0;
				}
				switch (status) {
				case INITIAL:
					if (delimiters.indexOf(c) > -1) { // 如果是分隔符
						lastDelimiter = (char) c;
						if (isWhiteSpace(c)) {
							// 如果同时也是空白符并且标识符长度大于零则返回标识符
							if (token.length() > 0) {
								if (reuseDelimiter) { // 如果要重用分隔符则将它推回输入流中
									in.revert((char) c);
								}
								return token.toString();
							}
							// 如果还未有数据，还要继续往下读
						} else { // 如果不是空白符则无论标识符长度是否为零，都要返回
							if (reuseDelimiter) {
								in.revert((char) c);
							}
							return token.toString();
						}
					} else if (processEscape && c == '\\') {
						status = ESCAPE; // 设转义字符标志
					} else if (allowComments && c == '/') {
						status = COMMENT_START; // 设注释标志
					} else if (isWhiteSpace(c)) {
						if (keepWhitespace) { // 如果空白符也要用，把它加入标识符中
							token.append((char) c);
						}
					} else {
						token.append((char) c);
					}
					break;

				case ESCAPE: // 处理转义字符
					switch (c) {
					case 'n':
						token.append('\n');
						break;

					case 'r':
						token.append('\r');
						break;

					case 't':
						token.append('\t');
						break;

					case 'b':
						token.append('\b');
						break;

					case 'f':
						token.append('\f');
						break;

					default:
						token.append((char) c);
						break;
					}
					status = INITIAL; // 设正常情况标志
					break;

				case COMMENT_START: // 处理注释
					if (c == '/') {
						status = LINE_COMMENT; // 是行式注释
					} else if (c == '*') {
						status = BLOCK_COMMENT; // 是块式注释
					} else {
						status = INITIAL;
						// 如果都不是则把注释起始符和刚读入的字符都加入到标识符中
						token.append('/').append((char) c);
					}
					break;

				case LINE_COMMENT:
					if (c == '\n') {
						status = INITIAL; // 如果当前为行注释状态则要一直读到行尾才恢复正常情况标志
					}
					break;

				case BLOCK_COMMENT:
					if (c == '*') {
						status = COMMENT_END; // 如果当前为块注释状态则要一直读到*号设为块注释结束状态
					}
					break;

				case COMMENT_END:
					if (c == '/') {
						status = INITIAL; // 在块结束状态下读到/则为块结束
					} else {
						status = BLOCK_COMMENT; // 否则块注释还未结束，恢复为块注释状态
					}
					break;

				}
				c = in.read(); // 读入下一字符
			}
			// 如果读到文件尾时，标识符长度大于零，则返回标识符，否则返回NULL值
			return token.length() > 0 ? token.toString() : null;
		} catch (IOException e) {
			throw new IOException("Error reading input L=" + startLine + " C="
					+ startChar);
		}
	}
//... 省略
</pre>
<br />
<br />不过从代码可以看出，它并不支持非Ascii编码格式的文件，还要进行进一步的改造。
<br />我的计划是StringBuffer 用byte[]代替，增加setEncode(String encode)方法,返回字符串时使用 new String(byte[], encode)
          <br/>
          <span style="color:red;">
            <a href="http://iwinyeah.javaeye.com/blog/170335#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">中科院软件、计算机工程硕士;中港软件硕士、管理类硕士博士招生</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">WebSphere 产品家族新特性系列经典推荐</span></a></li></ul>
          <br/><br/><br/>
          <br>文章来源:<a href='http://iwinyeah.javaeye.com/blog/170335'>http://iwinyeah.javaeye.com/blog/170335</a> <img src ="http://www.blogjava.net/iwinyeah/aggbug/187977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iwinyeah/" target="_blank">iwinyeah</a> 2008-03-12 07:03 <a href="http://www.blogjava.net/iwinyeah/archive/2008/03/12/187977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>