Java读取股票信息

公司局域网中有个网站,希望网站上能够显示本公司股票信息,但是局域网内大部分人都不能上外网,所以就不能考虑内嵌股票网页。

没有股票数据库,那么只能读取某个财经网站的股票信息了,找来找去,找到东方财富网,数据结构比较简单。

比如输入网址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(), 0, 10*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 color:green;font-size:10pt;\">" + arr[2] + " " + arr[3] + " " + arr[4] + "</span>";

else

str = "<span 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;

}

}

}