刘政道 - 应用程序框架

《31天学会CRM项目开发(C#编程入门及项目实战)》作者,IT经理,程序员
  博客园  :: 新随笔  :: 联系 :: 管理

Java读取股票信息

Posted on 2011-07-12 13:53  刘政道  阅读(2070)  评论(0编辑  收藏  举报
公司局域网中有个网站,希望网站上能够显示本公司股票信息,但是局域网内大部分人都不能上外网,所以就不能考虑内嵌股票网页。
没有股票数据库,那么只能读取某个财经网站的股票信息了,找来找去,找到东方财富网,数据结构比较简单。
比如输入网址http://hqdigi2.eastmoney.com/EM_Quote2010NumericApplication/CompatiblePage.aspx?Type=ZT&jsName=js_fav&fav=0000011,其中000001表示上证指数,1表示上证,
返回结果
var js_fav={favif:["1,000001,上证指数,2765.92,-1.31%,1003.01"]};
这不就是需要的股票信息吗?还有涨幅呢,稍加处理就可以放到自己的网站了。

实现目标需求,有以下几步:
1、创建一个定时器,每隔10秒钟读取一次最新股票信息;
2、给定股票代码,访问股票网址,获得股票信息;
3、处理得到符合要求的股票信息;
4、将股票信息存储在数据库中,供网站读取。

完整代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;

public class TimerTask {
    
static Connection conn;
    
static Statement st;
    
static SimpleDateFormat dtf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    
public static void main(String[] args) {
        java.util.Timer timer 
= new Timer(true); 
        timer.schedule(
new MyTimerTask(), 010*1000);//创建定时器,每隔10秒钟执行一次
        while(true)
            
try {
                Thread.currentThread().sleep(
5000);
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    
static class MyTimerTask extends java.util.TimerTask{
        
public void run() {
            
try
            {
                
//连接数据库
                if(conn==null || conn.isClosed()){
                    String dburl 
= "jdbc:mysql://localhost:3306/oa";
                    Class.forName( 
"org.gjt.mm.mysql.Driver" );
                    conn 
= DriverManager.getConnection(dburl, "root""password" );
                    st 
= conn.createStatement(); 
                }
                mGetStockPrice(st,
"0000011");//取得指定股票的价格,注意股票代码7为,最后一位表示,1表示上证,2表示深证
                mGetStockPrice(st,"3990012");
                mGetStockPrice(st,
"0000392");
                mGetStockPrice(st,
"2000392");
                mGetStockPrice(st,
"6000361");
                mGetStockPrice(st,
"6008371");
                mGetStockPrice(st,
"6018571");
                System.out.println();
                
            }
catch(Exception ex){ex.printStackTrace();}
        }
        
public void mGetStockPrice(Statement st,String stockCode){
            String str 
= "";
            
try
            {
                System.out.print(
"+");
                str 
= mGetUrlHtml("http://hqdigi2.eastmoney.com/EM_Quote2010NumericApplication/CompatiblePage.aspx?Type=ZT&jsName=js_fav&fav=" + stockCode,"UTF-8");
                
//网址返回的数据格式
                
//var js_fav={favif:["1,000001,上证指数,2765.92,-1.31%,1003.01"]};
                
//如果股票信息不为空
                if(str.indexOf(",")>-1){
                    String[] arr 
= str.split(",");
                    
//如果股票信息是有效的
                    if(arr.length==6){
                        
//如果上涨就是红色,如果下跌就是绿色
                        if(arr[4].startsWith("-"))
                            str 
= "<span style=\"color:green;font-size:10pt;\">" + arr[2+ " " + arr[3+ " " + arr[4+ "</span>";
                        
else
                            str 
= "<span style=\"color:red;font-size:10pt;\">" + arr[2+ " " + arr[3]  + " " + arr[4+"</span>";
                        str 
= str.replaceAll("'""\'");
                        
//判断数据库中是否已经存在股票代码,存在即新增,如果不存在就更新价格
                        ResultSet rs  = st.executeQuery("select count(*) from stock_prop where propType='stockPrice' and propName='"+ stockCode +"'");
                        rs.next();
                        
if("0".equals(String.valueOf(rs.getObject(1))))
                            st.executeUpdate(
"insert into stock_prop(propType,propName,propValue) values('stockPrice','"+ stockCode +"','"+ str +"')");
                        
else
                            st.executeUpdate(
"update stock_prop set propValue='"+ str +"' where propType='stockPrice' and propName='"+ stockCode +"'");
                        rs.close();
                    }
                }
                System.out.print(
"*");
            }
            
catch(Exception ex){ex.printStackTrace();}
        }
        
public String mGetUrlHtml(String urlStr,String charSet){
            String html
= "";
            
try
            {
                
//读取网址中的信息
                URL url = new URL(urlStr);
                URLConnection connection 
= url.openConnection();
                String sCurrentLine 
= "";
                StringBuffer sTotalString 
= new StringBuffer();
                BufferedReader l_reader 
= new BufferedReader(new InputStreamReader(connection.getInputStream(),charSet));
                
while ((sCurrentLine = l_reader.readLine()) != null)
                     sTotalString.append(sCurrentLine 
+ "\r\n");
                html 
= sTotalString.toString();
            }
catch(Exception ex){ex.printStackTrace();}
            
return html;
        }
    }
}