Wednesday, August 18, 2010

几个有用的 Java snippet

使用 java.net.* 获得网页:
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 解决的方案,呵呵。

No comments:

Post a Comment