是否可以使用相同的URL对象进行多次URL提取

时间:2014-07-17 06:45:01

标签: java

import java.net.*;
import java.io.*;
import java.sql.*;
import java.util.*;


public class URLConnectionReader {


    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost/EMP"; 
    static final String USER = "root";
    static final String PASS = "password";



    public static void main(String[] args) throws Exception{


Scanner sc = new Scanner(System.in);


URL o = new URL("http://www.worldportsource.com/countries.php");




        URLConnection yc = o.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));






ReadURL ru = new ReadURL();

    Connection conn = null;
    Statement stmt= null;

String[] va0 = new String[200];
String[] va1 = new String[197];

//ReadURL[] ru = new ReadURL[200];


        String inputLine;
    String table="<table";
    String dtable="</table";
    String dtr="</tr>";
    String tr="<tr";
String link="http://www.worldportsource.com";
String endcontent="-- end content --";

String val0 =null;
String val1=null;
String vol0=null;

String td="<td>";
String dtd="</td";



int x=0,x1=0,z=0,s=0,j=0;

inputLine = in.readLine();
String inputLine2 = null;





 try{

      Class.forName("com.mysql.jdbc.Driver");


      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

   }
catch(SQLException se){se.printStackTrace();}//Handle errors for JDBC
catch(Exception e){ e.printStackTrace();}//Handle errors for Class.forName






do
{
if(inputLine.indexOf("- end content -")!=-1)
z++;



if(z<1){

if(inputLine.indexOf("- start content -")!=-1)
{x++;}

if(x>=3)
{

if(inputLine.indexOf("<tr")!=-1)
s++;


if(s>=2){


if(inputLine.indexOf("php\">")!=-1){
val0=(inputLine.substring(inputLine.indexOf("php\">")+5,inputLine.indexOf("</a>")));


if(inputLine.indexOf("a href=")!=-1){
val1=link+(inputLine.substring(inputLine.indexOf("a href=\"")+8,inputLine.lastIndexOf("\">")));
j++;
va0[j]=val0;
va1[j]=val1;








}}




}
}


}//z if
}while((inputLine = in.readLine())!= null);




ru.sendURL(va1);


      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){}
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }




  in.close();
    }
}


class ReadURL{

        Scanner scan = new Scanner(System.in);

       String[] al=null;
int p=1;
URL o1= null;
Scanner sc2=null;



public void sendURL(String []t) throws Exception
{
al=t;
System.out.println(""+al[p]);

for(p=1;p<t.length;p++)
getURL(al[p]);

}



public void getURL(String t) throws Exception
             {



String[] vol = new String[200];


String country=null;
String inputLine;
int x1=0,i=0,b=0,z1=0,table=0;






o1 = new URL(t);
sc2 = new Scanner(o1.openStream());

inputLine= sc2.nextLine();



while((inputLine = sc2.nextLine())!=null) {


if(inputLine.indexOf("<div")!=-1)
table++;
if(table==12)
{

country = (inputLine.substring(inputLine.lastIndexOf("php\">")+5,inputLine.lastIndexOf("</a")));
table++;

}











if(inputLine.indexOf("- end content -")!=-1)
z1++;



if(z1<1){




if(inputLine.indexOf("- start content -")!=-1)
{x1++;}

if(x1>=3)
{
if(inputLine.indexOf("<table")!=-1)
b++;

if(b>=1){

if(inputLine.indexOf("php\">")!=-1){



vol[i]=(inputLine.substring(inputLine.indexOf("php\">")+5,inputLine.indexOf("</a")));
System.out.println(""+country+"\t"+vol[i]);
i++;
}//("php\"")
}//(x1>=2)
}//ifb>1
}//endcontent
}//while

}//method close

}//clas 

字符串数组传递给sendURL(),字符串有196个链接 getURl假设采用每个链接并解析它并返回每个链接的端口名称。 但它仅适用于传递的第一个链接。 即我只获得一个国家链接的端口号.. 我想要显示所有链接的端口号

2 个答案:

答案 0 :(得分:1)

您的代码无法编译,您将在myArray[3]="http://www.worldportsource.com/ports/index/IND.php";点击一个ArrayOutOfBoundException

  • 您在同一范围内创建相同的参考名o1 2次。
  • 您正在创建一个可存储3个对象的数组,并在其中放入4个对象。

要回答您的标题,您没有使用相同的网址对象,因为您多次调用新网址(myUrl) - &gt;每个new表示创建一个新对象

答案 1 :(得分:0)

我不认为此代码会编译。您有变量&#34; o1&#34;的重复声明。当myArray的大小为3时,你会尝试分配myArray [3],你会遇到一个运行时异常。你的逻辑是每次在循环中创建新的URL对象,所以那里不应该有任何问题。如果你还没有这样做,你必须关闭你打开的流然后到那个循环结束。

如果从命令行执行程序,很可能是您正在执行上一个成功编译的类文件。