import java.io.OutputStream ; import java.io.InputStream ; import java.io.OutputStreamWriter ; import java.io.InputStreamReader ; import java.io.BufferedReader ; import java.io.BufferedWriter ; import java.io.IOException ; class TestRuntime { public static void main( String[] args ) { Runtime runtime = Runtime.getRuntime() ; try { Process proc = runtime.exec( "dot -Tps" ) ; OutputStream out = proc.getOutputStream() ; InputStream in = proc.getInputStream() ; BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( out ) ) ; writer.write( "digraph { A->B; B ->C ; A->C }" ) ; writer.close() ; BufferedReader reader = new BufferedReader( new InputStreamReader( in ) ) ; String line = null ; while( null != ( line = reader.readLine() ) ) System.out.println( line ) ; } catch( IOException e ) { System.exit(1) ; } } }这里以 dot 为例,向其发送一个 digraph 然后输出为一个 ps 文件。
Thursday, October 21, 2010
启动一个进程管道输入输出
见下面
Wednesday, August 25, 2010
JSON Library
JSON 是一种非常通用的数据存放格式。其基本的形式为 "key": "value",并且用 {} 引起来。多个 key 可以用 , 将其分开,另外还有 array 的概念,这一般是用 [] 括起来的相同格式的对象。关于格式进一步的信息可以在其官网获得。这种格式流行的一个主要原因是对各种语言的支持非常全面。这里简单的介绍一下官网上提供的 org.json.* 下面的几个对象。
最重要的当然是 JSONObject 对象,我们可以用常见的字符串创建一个 JSON 的对象,然后通过 get* 方法获得某些键对应的值,而 * 表示的正是在 Java 中的类型,比如 String 等。使用 has() 方法可以测试该对象是否有需要的 key,而 keys() 可以用于遍历一个 JSON 对象的所有 key。其 toString() 方法可以很容易将一个 JSON 对象转换成为文本存放到文件中。
对应的 JSONArray 自然是处理 JSON 中 array 类型的值了。
该库还提供了其他格式的文本,如 XML、CDL(用逗号分割的文本)、HTTP 头、cookie 等转换成为或者从 JSON 转换的能力。
该库在解析错误的时候会抛出 JSONException 异常。
下面是一个简单的 snippet:
最重要的当然是 JSONObject 对象,我们可以用常见的字符串创建一个 JSON 的对象,然后通过 get* 方法获得某些键对应的值,而 * 表示的正是在 Java 中的类型,比如 String 等。使用 has() 方法可以测试该对象是否有需要的 key,而 keys() 可以用于遍历一个 JSON 对象的所有 key。其 toString() 方法可以很容易将一个 JSON 对象转换成为文本存放到文件中。
对应的 JSONArray 自然是处理 JSON 中 array 类型的值了。
该库还提供了其他格式的文本,如 XML、CDL(用逗号分割的文本)、HTTP 头、cookie 等转换成为或者从 JSON 转换的能力。
该库在解析错误的时候会抛出 JSONException 异常。
下面是一个简单的 snippet:
import org.json.* ; import java.util.Iterator ; try{ JSONObject json = new JSONObject( str ) ; Iterator<String> iter = json.keys() ; while( iter.hasNext() ) { String key = iter.next() ; System.out.print( key + ": " + json.getString( key ) ) ; } } catch( JSONException e) { System.err.println( "JSON parsing error" ) ; }
Sunday, August 22, 2010
Java 中的日志解决方案
Java 里面有一些现成的 logging 库,比如 log4j(apache logging 的子项目),JDK 里面自带的 java.util.logging,以及 jakarta commons 里面的 logging 库 。这样也就诞生了很多 wrapper,或者用 design pattern 的话来说所谓 facade 的东西,比如 org.apache.commons.logging 和 org.slf4j。这两个使用比较容易,一般提供了一个 factory 用于获得 logger(前者为 LogFactory.getLog(),后者为 LoggerFactory.getLogger())。
下面用一个简单的例子说明如何使用 org.apache.commons.logging。
后者提供了几个 hard-wired 的库,如 slf4j-nop(无输出)、slf4j-jdk(使用 java.util.logging)、slf4j-log4j(使用 log4j)、slf4j-simple(使用 System.err)、slf4j-jcl(使用 jakarta commons logging)。通过改变 -cp 就能方便的使用不同的 logger。
值得一提的是在 apache 的 logging 里面不仅仅有 java 的,还有 C++、.net 和 php 的 logger。
下面用一个简单的例子说明如何使用 org.apache.commons.logging。
import org.apache.commons.logging.Log ; import org.apache.commons.logging.LogFactory ; private Log log = LogFactory.getLog( MyClass.class ) ; if( log.isFatalEnabled() ) log.fatal( "this is a fatal error message") ; import org.slf4j.Logger ; import org.slf4j.LoggerFactory ; Logger log = LoggerFactory.getLogger( MyClass.class ) ; log.debug( "something in {} is {}", something, val) ;类似的还有 info、warn、error、trace 用在不同的情况。
后者提供了几个 hard-wired 的库,如 slf4j-nop(无输出)、slf4j-jdk(使用 java.util.logging)、slf4j-log4j(使用 log4j)、slf4j-simple(使用 System.err)、slf4j-jcl(使用 jakarta commons logging)。通过改变 -cp 就能方便的使用不同的 logger。
值得一提的是在 apache 的 logging 里面不仅仅有 java 的,还有 C++、.net 和 php 的 logger。
Wednesday, August 18, 2010
几个有用的 Java snippet
使用 java.net.* 获得网页:
使用 WebCAT 抓去网页,并抽取网页中文本信息:
使用 org.apache.commons.cli.* 解析命令行参数:
这里有一个非常好的教程。值得注意的是,org.apache.common 是一个非常大的 Java 程序集合,其中有不少好用的东西,比如编码 base64、压缩文件、xml 到 Java 对象的转换等等,值得有空研究一下的。
使用 java.util.Properties 创建简单的配置文件(key=val 形式的文件),并读取其中的内容。
可能我还是更喜欢 boost::program_options 解决的方案,呵呵。
import java.net.URL;import java.net.URLConnection ; import java.io.InputStreamReader ; import java.io.BufferedReader ; import java.io.IOException ; URL url = new URL( "your URL" ) ; URLConnection uc = url.openConnection() ; BufferedReader reader = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ) ; String line ; while( (line = reader.readLine()) != null ){ // read one line }注意可以用 HttpURLConnection 获得更加细致的控制。
使用 WebCAT 抓去网页,并抽取网页中文本信息:
import pt.tumba.parser.WebCAT ; import pt.tumba.parser.HTMLParser ; import pt.tumba.parser.Content ; HTMLParser parser = new HTMLParser( "profiles" ) ; URL url = new URL( "Your URL" ) ; parser.initTokenizer( url ) ; parser.processData() ; Content content = parser.getContent() ; System.out.println( content.getText() ) ;通过 WebCAT 可以直接 parse 很多格式的东西,比如 PDF、RTF 甚至 SWF 的文本内容。这段代码里面初始化 HTMLParser 的参数是 language profiles 的目录。这个在该 project 的下载的压缩包里面有,利用这些 profile 能够匹配网页的语言类型。比较遗憾的是该库无法确定网页中的哪部分是主体,抽取出来的文字一般会含有其他的信息。比较有用的是里面还有对 link、图片等等的分析。
使用 org.apache.commons.cli.* 解析命令行参数:
import org.apache.commons.cli.* ; Options options = new Options() ; options.addOption( "h", false, "Help" ) ; options.addOption( "o", true, "Output file" ) ; CommandLineParser parser = new PosixParser() ; CommandLine cmd = null ; HelpFormatter formatter = new HelpFormatter() ; try { cmd = parser.parse( options, args) ; } catch( ParseException e ) { System.err.println( "Error in parsing." ) ; formatter.printHelp( "TestCLI", options ) ; System.exit( 1 ) ; } if( cmd.hasOption( "h" ) ) { formatter.printHelp( "TestCLI", options ) ; System.exit( 1 ) ; } if( cmd.hasOption( "o" ) ) { // do something System.out.println( "output file is " + cmd.getOptionValue( "o" ) ) ; }
这里有一个非常好的教程。值得注意的是,org.apache.common 是一个非常大的 Java 程序集合,其中有不少好用的东西,比如编码 base64、压缩文件、xml 到 Java 对象的转换等等,值得有空研究一下的。
使用 java.util.Properties 创建简单的配置文件(key=val 形式的文件),并读取其中的内容。
import java.util.Properties ; import java.util.Set ; import java.io.FileInputStream ; import java.io.IOException ; Properties properties = new Properties() ; FileInputStream in = null ; try { in = new FileInputStream( "test.conf" ) ; properties.load( in ) ; in.close() ; } catch( IOException e ) { System.err.println( "Can't open config file" ) ; System.exit( 1 ) ; } Set<String> keys = properties.stringPropertyNames() ; for( String key : keys ) { System.out.println( key + ": " + properties.getProperty( key ) ) ; }另外可以考虑使用 org.apache.commons.configuration.* 做类似的事情。
可能我还是更喜欢 boost::program_options 解决的方案,呵呵。
Subscribe to:
Posts (Atom)