- 学过或用过 Basic 的朋友大约还会记得,在 Basic 里要演奏(当时还是从 PC 喇叭里发出的,现在也能走声卡了)一段 哆来咪发唆拉西哆 可以写成:直接用 JDK 可没有这么简单,虽然 JDK 1.3 开始就引入了 Java Sound API 处理 MIDI(Musical Instrument Digital Interface),可是它的接口很难使用, 另外,Sun 也专为视、音频的捕获、回放、格式转换提供了 Java Media Framework API (JMF),但不能用来创作。有一个开源的组件 JFugue(http://www.jfugue.org/), 它能让你尽显音乐方面的天赋,给你一个高级易用的接口来操作 Java Sound,制作自己的 MIDI 音乐。 Read More
1PLAY "C D E F G A B O6C" 前面写过一个因为 Oracle 驱动版太低引起的一在题:Oracle 驱动版本引起的显示字段奇怪编码问题。 今天又遇着一个。
本地写好的一段连接数据库的程序,一放到正式服务器上又不能正常工作了,原来的代码中没有打印出异常栈,都看不出什么问题来,后来加上异常栈输出,得到如下信息:
Fail to convert to internal representation
java.sql.SQLException: Fail to convert to internal representation
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:219)
at oracle.jdbc.driver.OracleStatement.getLongValue(OracleStatement.java:3022) Read More- 原来只是关注过跨平台组件的选择对比,有 GTK、wxWidgets、Qt、AWT/SWING、SWT。
GTK 是 GNOME 的实现组件
wxWidgets 对于用过 MFC 的人来说用起来很顺手
Qt 是 KDE 的实现组件
AWT/SWING 无需多说,SWT 相信也为 Java 开发人员熟知了。
曾得益于 VC 写的程序小巧且基本上拷个 EXE 文件到别人机器上就能运行,所以希望还是用 C++ 来编写界面程序,所以考虑过 wxWidgets 和 Qt。后来发现这两个组件的动态库的个头也不小,即使在客户端安装个 JRE 又何妨,何况 JAVA+SWT 的程序与 wxWidgets/Qt 的本地程序速度上差别已不大。综上,如果仅仅是跨平台的界面程序个人看重 JAVA+SWT 了,SWING 给我产生的欲望还不大。 Read More - 前面写过一篇:Oracle 驱动版本引起的显示字段奇怪编码问题。讲到因 Oracle 8.0.5 不支持子查询排序,为改善原来那种每次翻页时都捋出所有数据成对象到 List 中,然后从中拣取页面实际要显示的记录的性能问题时,采用了 rs.absolute() 直接跳到起始记录游标的方法,但又引入了乱码问题,例如:"无效",变成了 "0xE697A0E69588"。
虽说,换个驱动,如 8.1.7.0.0 以上版本的驱动就能解决乱码的问题,但这一换又怕会影响到其他的应用。有朋友评论说,其实循环 next() 到某处比 absolute() 定位要好,乍一看,有些牵强,不过试试就知道了。下面就来做样一个测试,测试代码如下: Read More
有一 Java 控制台程序,启动经过一段时间之后从 Windows 任务管理器里看它所占用的内存稳定在 540M 左右。
启动参数是:-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128
但只要你把那个控制台窗口最小化后,观察到的内存用瞬间下降到 100 多M,有时候甚至是几十M。然后不管是窗口保持最小化还是恢复了,它所占用的内存又以几十M几十M的上扬,直至先前的 540 M 左右。每次最小化窗口都可以观察到这种现象。
控制台窗口的参数:屏幕缓冲区大小:宽 120;高 300。窗口大小:宽 120;高 40。
不知道在控制台窗口最小化那时,JVM 做了些什么事情能让内存骤降下来,而复又升回去。
开门见山把产生问题的原因的解决办法列出来。
我们一般获取 Statement 都是通过 conn.createStatement() 方法,很少传递参数给它的,所以其内置属性都取默认值的,取记录只用 while(rs.next()) 逐个取即可。然而有一个需求(Oracle 8i 之前的版本不支持子查询排序,所以无法用 rownum 取分页记录) 是通过如下代码来得到 Statement:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
由它获得的结果集可以 rs.absolute(n) 直接跳到第 n 行记录来获得值,但就这个用法出问题了,取出来的中文出现乱码了,如 "无效",变成了 "0xE697A0E69588" Read More- 如有 index.jsp 页,当出现后服务器端异异常时要转向到 errorPage.jsp,并在 errorPage.jsp 中把对应错误信息显示出来。我们需要在这两个页面分别加上指令 errorPage="errorPage.jsp" 和 isErrorPage="true"。
index.jsp1<%@page errorPage="errorPage.jsp" %> 2 3<% 4 throw new Exception("exception from jsp"); 5%>
Read More
前面记载过一篇 Java 执行 SQL 脚本文件,这里边完全是由自己写代码来分离出脚本中的每一个 SQL 语句的,有不少缺陷。当时还不太清楚 ANT 本身提供了功能很强的执行 SQL 语句和脚本的 SQL Task 可用。以下依次简单介绍如何在 build.xml 中执行 SQL 语句或脚本;Java 代码中如何调用 ant 的 SQLExec 类执行 SQL 脚本,最后考虑 ant.jar 的个头说大也不小,1M 多,如果只用于执行 SQL 脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类 JDBCTask 和 SQLExec,完全去除了对 ant.jar 包的依赖。
有关 ant 的更详细的记录请参见,http://ant.apache.org/manual/CoreTasks/sql.html 。 Read More- 多线程下载由来已久,如 FlashGet、NetAnts 等工具,它们都是依懒于 HTTP 协议的支持(Range 字段指定请求内容范围),首先能读取出请求内容 (即欲下载的文件) 的大小,划分出若干区块,把区块分段分发给每个线程去下载,线程从本段起始处下载数据及至段尾,多个线程下载的内容最终会写入到同一个文件中。
只研究有用的,工作中的需求:要把多个任务分派给多个线程去执行,这其中就会有一个任务列表指派到线程的策略思考:已知:1. 一个待执行的任务列表,2. 指定要启动的线程数;问题是:每个线程实际要执行哪些任务。
策略是:任务列表连续按线程数分段,先保证每线程平均能分配到的任务数,余下的任务从前至后依次附加到线程中--只是数量上,实际每个线程执行的任务都还是连续的。如果出现那种僧多(线程) 粥(任务) 少的情况,实际启动的线程数就等于任务数,一挑一。这里只实现了每个线程各扫自家门前雪,动作快的完成后眼见别的线程再累都是爱莫能助。 Read More
每日E读,间隔几天,显的每日E读不每了,新闻过后,精彩继续!
今儿,想起来昨儿,解决的一问题,贴出来大家学习下,由于工作需要,学习,哈哈~!
手头的一个任务,是个java的SWT做的桌面应用程序,有一需求是,程序只能启动一个实例,二次启动会提示启动失败!网上转了一大圈几天也没找到比较理想的解决方法,在CSND等专业程序员网站上查找过,也没有找到!我正要放弃的时候,哈哈,被我找到了!
找了一写方案,总结起来就是,系统单一实例,就是查看共用资源,如果被占用,说明已经启动!有人说用单例模式,那是没有作用的!
网上找到的几种解决方案: Read More