无注释。
两个方法:
executeQuery();查询集合中所有的股票信息
executeQueryWithFilter(Float indexRate,Float normalRate);查询超过一定涨幅的股票,将低于涨幅的过滤掉。indexRate:指数涨幅点过滤;normalRate目标涨幅过滤点。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Query {
private String requestUrl = "http://qt.gtimg.cn/r=0.7938921226847172q=";
private long sleepSecond = 10;
private List<String> stockCodeList;
private SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Set<String> indexCodeSet = new HashSet<String>(2);;
public Query(List<String> stockCodeList,long sleepSecond)
{
this.stockCodeList = stockCodeList;
this.sleepSecond = sleepSecond;
indexCodeSet.add("000001");
indexCodeSet.add("399006");
}
public void executeQuery() throws IOException, InterruptedException
{
query(null, null);
}
public void executeQueryWithFilter(Float indexRate,Float normalRate) throws IOException, InterruptedException
{
query(indexRate, normalRate);
}
private void query(Float indexRate,Float normalRate)throws IOException, InterruptedException{
String request = getRequestData();
while (true)
{
Calendar ca = Calendar.getInstance();
ca.setTime(new Date());
System.out.println(dateFormate.format(ca.getTime()));
System.out.println("***********************************************************************");
sendRequest(request,indexRate,normalRate);
if(!inTradeTime()){
break;
}
Thread.sleep(sleepSecond * 1000);
}
}
private String getRequestData()
{
StringBuilder requestUrlWithPara = new StringBuilder(requestUrl);
for(String code : stockCodeList)
{
requestUrlWithPara.append(code+",");
}
if(stockCodeList.size() > 0)
{
requestUrlWithPara.deleteCharAt(requestUrlWithPara.length()-1);
}
return requestUrlWithPara.toString();
}
private boolean inTradeTime(){
Calendar ca = Calendar.getInstance();
ca.setTime(new Date());
int hour = ca.get(Calendar.HOUR_OF_DAY);
if(hour>=9 && hour<=15){
return true;
}
return false;
}
private void sendRequest(String request,Float indexRate,Float normalRate) throws IOException
{
URL url = new URL(request);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,"GBK"));
String tmp = null;
List<String> stockList = new ArrayList<String>();
while (null != (tmp = br.readLine()))
{
stockList.add(tmp);
}
br.close();
in.close();
for(String stock : stockList){
displayMessage(stock,indexRate,normalRate);
}
}
private void displayMessage(String stock,Float indexRange,Float normalRange){
String stockInfo = stock.replace('~', '\t');
int index = stockInfo.indexOf('=');
stockInfo = stockInfo.substring(index + 2);
int headerIndex = stockInfo.indexOf("\t");
stockInfo = stockInfo.substring(headerIndex+1);
int last = stockInfo.lastIndexOf(";");
stockInfo = stockInfo.substring(0, last-1);
stockInfo = replaceInMap(stockInfo);
String[] arr = stockInfo.split("\t");//SZZS, 000001, 2979.43, 18.46, 0.62, 175074344, 20081844
StringBuilder sbuilder = new StringBuilder();
if(indexCodeSet.contains(arr[1])){//上证指数,中小板指数
if(indexRange== null
|| (indexRange != null && outOfRange(indexRange, arr[4]))){
for(int i = 0 ; i < 5 ; i++){
sbuilder.append(arr[i]+"\t");
}
}
}else{
if(normalRange == null || (normalRange != null && outOfRange(normalRange, arr[4])) ){
for(int i = 0 ; i < 5 ; i++){
sbuilder.append(arr[i]+"\t");
}
}
}
if(sbuilder.length() > 0){
System.out.println(sbuilder.toString());
}
}
private boolean outOfRange(Float range,String actRateStr ){
Float actRate = Float.valueOf(actRateStr);
if(actRate >= 0){//
return actRate.floatValue() >= range.floatValue() ? true : false;
}else{
return actRate.floatValue() <= range.floatValue()*-1 ? true : false;
}
}
private String replaceInMap(String content){
Map<String,String> map = new HashMap<String, String>();
map.put("粤 传 媒", "YCM");
map.put("晋西车轴", "JXCZ");
map.put("太安堂", "TAT*");
map.put("福耀玻璃", "FYBL*");
map.put("中联重科", "ZLZK*");
map.put("上证指数", "SZZS");
map.put("九洲电气", "JZDQ");
map.put("创业板指", "CYBZ");
map.put("云南铜业", "YNTY*");
map.put("慈星股份", "CXGF*");
map.put("招商证券", "ZSZQ*");
map.put("南都电源", "NDDY");
map.put("歌华有线", "GHYX*");
String newContent = new String(content);
for(Entry<String, String> entry : map.entrySet()){
newContent = newContent.replace(entry.getKey(), entry.getValue());
}
return newContent;
}
public static void main(String[] args)
{
//股票代号列表
List<String> codeList = new ArrayList<String>();
codeList.add("s_sh000001");
codeList.add("s_sz399006");
codeList.add("s_sz000878");
codeList.add("s_sh600999");
codeList.add("s_sz300307");
codeList.add("s_sz002433");
codeList.add("s_sz000157");
codeList.add("s_sh600660");
codeList.add("s_sh600037");
codeList.add("s_sz002181");
codeList.add("s_sz300040");
codeList.add("s_sz300068");
Query stockQuery = new Query(codeList, 20);
try
{
stockQuery.executeQuery(); //普通查询
// stockQuery.executeQueryWithFilter(1.00F,2.00f); //过滤查询
}
catch (IOException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}