URLConnectionクラスを使用しています - URLが利用できない場合でも、指定されたURLにストリームを取得できます。 URL上のコンテンツをいくつかのローカルファイルシステムディレクトリに) - 今、私はこのコードを数回書いたことがあります(それには満足していません)。URLConnectionの周りにローカルキャッシュをラップする方法はありますか?
0
A
答えて
-1
私はちょうどこの同じ問題に遭遇し、自分のWebCacheクラスを投げました。まだテストしていませんが、あなたが望むならそれを試すことができます。ページをキャッシュするディレクトリで構築し、getPage(String url)を呼び出してページを取得します。 getPageはキャッシュディレクトリを最初にチェックし、存在しなければキャッシュにダウンロードして結果を返します。キャッシュファイル名はurl.hashCode()+ ".cache"
です。これはページのソースを取得するためのものですが、URLConnectionで何をしたいのか分かりませんが、助けて。
/**
* A tool for downloading and reading the source code of HTML pages.
* Prevents repeated downloading of pages by storing each page in a cache.
* When it recieves a page request, it first looks in its cache.
* If it does not have the page cached, it will download it.
*
* Pages are stored as <cachedir>/<hashcode>.cache
*
* @author Mike Turley
*/
import java.io.*;
import java.net.*;
public class WebCache {
File cachedir;
boolean enabled;
/**
* Create a web cache in the given directory.
*/
public WebCache(File cachedir, boolean enabled) {
this.cachedir = cachedir;
this.enabled = enabled;
}
public WebCache(String cachedir, boolean enabled) {
this.cachedir = new File(cachedir);
this.enabled = enabled;
}
public WebCache(File cachedir) {
this.cachedir = cachedir;
this.enabled = true;
}
public WebCache(String cachedir) {
this.cachedir = new File(cachedir);
this.enabled = true;
}
/**
* Get the content for the given URL.
* First check the cache, then check the internet.
*/
public String getPage(String url) {
try {
if(enabled) {
File cachefile = new File(cachedir.getAbsolutePath() + url.hashCode() + ".cache");
//FIXME - might be missing a slash between path and hashcode.
if(cachefile.exists()) return loadCachedPage(url);
}
return downloadPage(url);
} catch(Exception e) {
System.err.println("Problem getting page at " + url);
e.printStackTrace();
return null;
}
}
public void clear() {
try {
File[] cachefiles = cachedir.listFiles();
for(int i=0; i<cachefiles.length; i++) {
cachefiles[i].delete();
}
cachedir.delete();
} catch(Exception e) {
System.err.println("Problem clearing the cache!");
e.printStackTrace();
}
}
public String downloadPage(String url) {
try {
URL weburl = new URL(url);
URLConnection urlc = weburl.openConnection();
urlc.setDoInput(true);
urlc.setDoOutput(false);
BufferedReader in = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
if(!cachedir.exists()) cachedir.mkdir();
File outfile = new File(cachedir.getAbsolutePath() + url.hashCode() + ".cache");
// FIXME - might be missing a slash between path and hashcode.
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(outfile)));
StringBuilder sb = new StringBuilder("");
String inputline;
while ((inputline = in.readLine()) != null) {
out.println(inputline);
sb.append(inputline);
}
in.close();
out.close();
return sb.toString();
} catch(Exception e) {
System.err.println("Problem connecting to URL " + url);
e.printStackTrace();
return null;
}
}
public String loadCachedPage(String url) {
try {
File infile = new File(cachedir.getAbsolutePath() + url.hashCode() + ".cache");
// FIXME - might be missing a slash between path and hashcode.
BufferedReader in = new BufferedReader(new FileReader(infile));
StringBuilder sb = new StringBuilder("");
while (in.ready()) sb.append(in.readLine());
in.close();
return sb.toString();
} catch(Exception e) {
System.err.println("Problem loading cached page " + url);
e.printStackTrace();
return null;
}
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
-1
このようにしないでください。キャッシングHTTPプロキシをデプロイします。たとえば、Apache Squidです。
1
URLConnection
からApache HttpClientに切り替えた場合、HttpClient Cacheを使用できます。
関連する問題
- 1. divタグの周りにブロックをラップする方法は?
- 2. RSSで注目画像の周りに投稿URLをラップする方法はありますか?
- 3. ディレクティブの周りにJSカプセル化関数をラップする方法
- 4. divでブートストラップ・カラムをラップする方法はありますか?
- 5. セパレータの周りの枠線を削除する方法はありますか?
- 6. jQueryを使ってテキストノードの周りにHTMLをラップする方法は?
- 7. html5意味タグの周りにdivをラップしますか?
- 8. D3.jsの各弧にテキストをラップする方法はありますか?
- 9. divに要素のセットをラップする方法はありますか?
- 10. リポジトリをクローンする前にrebar get-depsにローカルキャッシュをチェックさせる方法はありますか?
- 11. Android Studioにコードをきれいにラップする方法はありますか?
- 12. ObjectiveCブロックを関数ポインタにラップする方法はありますか?
- 13. liのjqueryのグループの周りにulをラップします。
- 14. CSSでチェックボックスのフォーム要素をラップする方法はありますか?
- 15. SVG要素の内容をラップする方法はありますか?
- 16. ノイズの周波数スペクトルをプロットする方法はありますか?
- 17. iOSでは、ボタンを円弧または円の周りを移動する方法はありますか?
- 18. センター周りを☆スピンする方法は?
- 19. イメージの周りにスクロールするテキストを整列する方法はありますか?
- 20. ウェブページの周りには境界線がありますか?
- 21. PHP拡張モジュールでC++クラスをラップする方法はありますか?
- 22. .NET WebServiceをSoapExtensionでプログラムでラップする方法はありますか?
- 23. mainを拡張クラスでラップする方法はありますか?
- 24. 浮動要素の周りに親divをラップする
- 25. 変数の周りに中括弧をラップする場合
- 26. ラップされた要素の周りにコンテナを広げる方法
- 27. gtkの文字列の周りに "境界線"を作成する方法はありますか?
- 28. フレックスボックスのイメージの周りにテキストを折り返す方法はありませんか?
- 29. JtextAreaの周りをパディングする方法
- 30. 要素を作成してテキストを周囲に追加するより良い方法はありますか?
この実装では、HTTP仕様ではいつ、どのようにリソースをキャッシュできるのか、またキャッシュする必要がないのかについては詳しく説明していません。 ステータスコード(つまり、3xx再送信、5xxサーバエラー、検証(Eタグ、最終変更)、非無効メソッド(POST/PUT/DELETE)など)の処理が欠落しています。問題の大きな山... このような不自由なキャッシングレイヤーを使用する前に、squid、ngnixなどのスタンドアロンプロキシーセットアップを使用することをお勧めします。 – ordnungswidrig