Java網絡編程之URI、URL研究(下) 03

  URL的openStream()方法通常返回抽象的InputStream類的一個具體的子類所建立的對象的引用。這意味着你必須按字節次序讀取資源數據,這種做法是恰當的,因爲你不知道將要讀取的數據是什麼類型的。如果你事先知道要讀取的數據是文本的,並且每一行以換行符(/n)結束,你就可以按行讀取而不是按字節讀取數據了。

  下面的代碼片斷演示了把一個InputStream對象包裝進java.io.InputStreamReader對象以從8位過渡到16位字符,把結果對象包裝進java.io.BufferedReader對象以訪問BufferedReader的readLine()方法,並調用readLine()方法從資源讀取文本的所有行。

InputStream is = url.openStream ();
BufferedReader br = new BufferedReader (new InputStreamReader (is));
String line;
while ((line = br.readLine ()) != null)
System.out.println (line);
is.close ();

  有時候按字節的次序讀取數據並不方便。例如,如果資源是JPEG文件,那麼獲取一個圖像處理過程並向該過程註冊一個用戶使用數據的方法更好。當圖像完整下載後立即顯示它並不困難。如果出現這種情況,你就有必要使用getContent()方法。

  當調用getContent()方法時,它會返回某種對象的Object引用,而你可以調用該對象的方法(在轉換成適當的類型後),採用更方便的方式檢索數據。但是在調用該方法前,你必須使用instanceof驗證對象的類型,防止類產生異常。

  對於JPEG資源,getContent()返回一個對象,該對象的類實現了java.awt.Image.ImageProducer接口。下面的代碼片斷演示了使用instanceof驗證對象是ImageProducer的,並進行了轉換。接下來可以調用ImageProducer方法註冊一個用戶並初始化圖像的使用過程。

URL url = new URL (args [0]);
Object o = url.getContent ();
if (o instanceof ImageProducer)
{
ImageProducer ip = (ImageProducer) o;
// ...
}

  技巧

  調用URL的equals(Object o)和sameFile(Object o)方法來決定兩個URL是否相同。第一個方法包含了比較的片斷,而第二個方法沒有包含。你可以參閱SDK文檔查找更多信息。

  查看一下getContent()方法的源代碼,你會找到openConnection().getContent()。此外,查看一下openStream()方法的源代碼,你會發現openConnection().getInputStream()。每個方法都首先調用URL的openConnection()方法。這個方法返回抽象的java.net.URLConnection類(描述與某些資源的連接)的一個子類建立的對象的引用。URLConnection的方法反映了資源和連接的細節信息,使我們能編寫代碼向資源寫入信息。

  列表5的URLDemo2源代碼演示了openConnection(),以及調用一些URLConnection的方法。

  列表5: URLDemo2.java

// URLDemo2.java

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

class URLDemo2
{
public static void main (String [] args) throws IOException
{
if (args.length != 1)
{
System.err.println ("usage: java URLDemo2 url");
return;
}

URL url = new URL (args [0]);

// 返回代表某個資源的連接的新的特定協議對象的引用

URLConnection uc = url.openConnection ();

// 進行連接

uc.connect ();

// 打印多種頭部字段的內容

Map m = uc.getHeaderFields ();
Iterator i = m.entrySet ().iterator ();

while (i.hasNext ())
System.out.println (i.next ());

// 如果資源允許輸入和輸出操作就找出來

System.out.println ("Input allowed = " +uc.getDoInput ());

System.out.println ("Output allowed = " +uc.getDoOutput ());
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章