技巧之一同步输出目录 在Java开发过程中有时候我们要创建一些简单的类来测试某些功能测试完成后就从磁盘删除该类的源文件因为我们不想让该类出现在最终的产品中但是虽然源文件已经被删除编译好的class文件仍可能留在磁盘上当有其他的类依赖于该类就可能导致开发环境的不稳定 在JBuilder中我们可以设置一个编译选项来同步(Synchronize)Java的源文件和对应的类这样一旦Java源文件被删除对应的class文件也将被删除按照如下步骤设置该同步选项 打开 Project | Project Properties 选择 Compiler 选项卡看到如下对话框 注意Synchronize output dir选项选中该选项就可以实现输出目录同步每次编译时JBuilder将保证Java源文件与Java class文件的同步 输出调试信息 很多时候我们要向标准输出设备输出一些简单的变量值以便了解程序的运行情况例如在程序中加入类似下面的代码 Systemoutprintln(调试信息: 变量的值是 + value); 当编写和调试代码的工作结束接下去就要进行最后的编译和打包这时就要删除所有上面这些Systemoutprintln代码为了避免这些麻烦我们可以引入一个逻辑变量debugMode把它设置为true并在输出调试信息之前检查这个变量的值 if (debugMode) Systemoutprintln(调试信息: 变量的值是 + value); 所有调试工作结束之后再把debugMode变量设置成false这样程序运行时就不会再输出调试信息 但是这还不是处理类似调试信息的最佳办法我们可以用Diagnostic类来改进Diagnostic类有三个与输出流有关的方法除了标准的Systemerr输出流还可以赋予其他不同的输出流(例如文件或URL)最重要的是当编写和调试代码的工作结束之后我们可以在正式编译时排除Diagnostic类从而也就排除了对Diagnostic类方法的所有调用 下面是Diagnostic类中可用于输出信息的三个方法 print(String message)输出信息 println(String message)输出信息并追加行结束符 printlnc(String message)输出带有行结束符计数器(它的值不断递进)和Tab字符的信息 因此我们可以把上面的Systemoutprintln替换为 Diagnosticprintlnc(调试信息变量的值是 + value); 这些输出方法的标准输出设备是Systemerr但我们可以用setLogStream(PrintStream log)方法改变它例如假设要把输出发送到logtxt文件只需插入如下代码 DiagnosticsetLogStream(new javaioPrintStream(new javaioFileOutputStream(logtxt))); 最后在开发期间我们只需调用一个方法就可以关闭所有的输出 Diagnosticenable(false); 资源捆绑 在Java中要把直接嵌入到程序的字符串作为资源使用是很容易的例如只要把字符串保存到一个独立的文件我们就可以很方便地通过创建不同的文件实现对多种语言的支持 为了把硬编码的字符串保存到资源捆绑文件标准Java API提供两种办法 · 把键值对以属性文件的形式保存到文本文件 · 把键值对保存到Java源文件中的String[][]数组对象该Java源文件从javautilListResourceBundle扩展 第一种方法具有较好的灵活性可以在不重新编译的前提下修改字符串值第二种方法具有较好的性能但每次修改字符串值包含键值对的Java源代码文件都必须重新编译JBuilder提供了保存硬编码字符串值的第三种方法即comborlandjbutilArrayResourceBundle ArrayResourceBundle类通过一个String[]数组对象保存键的值但不包含键我们可以通过索引访问值即第一个值的索引为第二个值的索引为等等由于可以直接访问值因此性能相当好但也有缺点——维护保存值的文件很困难因为值和键之间没有直接的(直观的)联系 异常跟蹤 在Java中利用trycatch(finally)语句可以捕获和处理异常非常方便catch块的常见异常处理方式是输出异常例如把异常输出到日志文件 Exception类有一个printStackTrace()方法它能够从发生异常的方法中输出堆栈信息默认输出位置是Systemerr但是有时候我们要把堆栈信息输出到Systemerr之外的其他地方例如在出现异常时把堆栈信息输出到email或者用一个对话框显示出来 printStackTrace()方法有几种不同的类型 · printStackTrace()输出到标准错误流 · printStackTrace(PrintStream ps)输出到名为ps的PrintStream · printStackTrace(PrintWriter pw)输出到名为pw的PrintWriter 我们可以用最后一种printStackTrace()方法把堆栈信息保存到String对象只要在String对象中捕获了堆栈信息我们就可以方便地在应用的任何地方使用这些信息了下面的代码片断示范了具体的实现步骤 private String getStackTraceAsString() { // StringWriter将包含堆栈信息 StringWriter stringWriter = new StringWriter(); //必须将StringWriter封装成PrintWriter对象 //以满足printStackTrace的要求 PrintWriter printWriter = new PrintWriter(stringWriter); //获取堆栈信息 eprintStackTrace(printWriter); //转换成String并返回该String StringBuffer error = stringWritergetBuffer(); return errortoString(); } 快速查看JavaBean基本信息 在JBuilder中要查看JavaBean的内部信息是非常方便的我们可以把JavaBean拖入设计窗口中通过Object Inspector查看JavaBean的属性和事件但是即使不通过设计器我们也可以查看JavaBean的信息这就是使用BeanInsight(菜单Tools | BeanInsight) 点击Examine Bean按钮就开始分析指定的JavaBean在BeanInsight Result区域可以看到分析JavaBean的结果如果要了解更详细的信息点击View Details按钮 多个行的属性值 属性文件是保存应用配置信息的好方法有了属性文件修改应用参数时只需修改简单的属性文本文件无需重新编译整个应用 属性文件以键值对的形式保存数据每一个行以键开头加上一个等于符号再加上与该键对应的值键与值必须在同一个行上这一点很重要但是有些时候值的内容非常多如果值能够分成多行存放将带来很大的方便下面我们就来看看如何使用多行的属性值 首先下面这个代码片断读取testproperties属性文件 try { Properties p = new Properties(); File file = new File(testproperties); FileInputStream fis = new FileInputStream(file); pload(fis); } catch (IOException ioex) { ioexprintStackTrace(); } Properties类的load()方法需要一个输入流作为参数这里我们向它传入了一个FileInputStream对象 接下来我们就可以通过调用getProperty()方法从Properties对象获取属性值下面我们来看看testproperties属性文件的内容 singleline=Single line value multiline =This example shows how we can write a property value over multiple lines in a properties file 这个属性文件保存了两个属性键分别是singleline和multilinesingleline的值只有一行而multiline的值有多行 如果我们调用Properties对象的getProperty()方法并输出属性值结果将是 调用 Systemoutprintln(singleline? + pgetProperty(singleline)); Systemoutprintln(multiline ? + pgetProperty(multiline)); 结果 singleline? Single line value multiline ? This example shows how we multiline属性只包含了第一行值那么如何解决这个问题呢?其实很简单只需要在每个行的末尾加上转义字符\就可以了修改后的属性文件如下所示 singleline=Single line value multiline =This example shows how wecan write a propertyvalue over multiple lines in aproperties file 再次读取属性文件的值multiline的属性值就能够完整地读取出来 |