split、indexOf と substring で URL からファイル名を取得する
ここでは URL からファイル名の部分、つまり、 http://www.example.com/abc.txt とあったら abc.txt の部分を取り出す例を通して、 文字列操作メソッドの使い方をみていきます。
まぁ、そもそも単純な例なので、他にもいろいろとやりようはあると思いますが・・・(苦笑)
ともあれ、ここでは split、indexOf それと substring を組み合わせてやってみようと思います。
URL からファイル名を取得
最初にソースコードとその実行結果をみてください。
まずソースコードはこちらです。
package com.keicode.java.test;
import java.net.MalformedURLException;
import java.net.URL;
public class StringTest1 {
public static void main(String[] args){
try {
String urlString = "http://abc.com/xyz/foo.jpg?bar=baz";
URL url = new URL(urlString);
String f = url.getFile();
System.out.println("f = " + f);
String[] parts = f.split("/");
for(int i=0;i<parts.length; i++){
System.out.println("[" + i + "] " + parts[i]);
}
String t = parts[parts.length-1];
System.out.println(t);
int idx = t.indexOf("?");
if(-1 < idx ){
System.out.println(t.substring(0, t.indexOf("?")));
}
else{
System.out.println(t);
}
} catch (MalformedURLException e) {}
}
}
実行結果は次の通り・・・
f = /xyz/foo.jpg?bar=baz [0] [1] xyz [2] foo.jpg?bar=baz foo.jpg?bar=baz foo.jpg
さて、それでは順にみていきましょう。
まず具体的な問題設定ですが、ここでは元となる URL を
http://abc.com/xyz/foo.jpg?bar=baz
としています。
やりたいことは、ここから foo.jpg の部分を取り出すことです。
URL の getFile メソッドを利用
まず考えられるのは、java.net.URL クラスの利用です。
URL オブジェクトを URL 文字列を元に作成して、そのメソッド getFile メソッドを利用してみましょう。
package com.keicode.java.test;
import java.net.MalformedURLException;
import java.net.URL;
public class StringTest1 {
public static void main(String[] args){
try {
String urlString = "http://abc.com/xyz/foo.jpg?bar=baz";
URL url = new URL(urlString);
String f = url.getFile();
System.out.println("f = " + f);
...
この結果の出力は次のようになります。
f = /xyz/foo.jpg?bar=baz
ホスト名の残りのパートが getFile メソッドで取得できていることが分かります。しかし、これでは今回やりたいことと違いますね。
そこで、この部分をさらに分解する必要があります。
split を利用して / で区切る
URL のパスの区切り文字はスラッシュ / です。/ で区切った部分を取り出すために split を利用します。 split では指定した条件で文字列を区切り、それぞれの部分を含む String の配列を返します。
...
String[] parts = f.split("/");
for(int i=0;i<parts.length; i++){
System.out.println("[" + i + "] " + parts[i]);
}
...
for ループで、split で返された String 配列の内容をみると次のようになりました。
[0] [1] xyz [2] foo.jpg?bar=baz
配列の先頭の要素は空っぽです。これは渡したもとの文字列の先頭が / はじまりだったためです。 最後の要素がおしいところまできてますね。
最後の要素は "foo.jpg?bar=baz" ですから、 クエスチョンマークの前の部分だけ取り出しましょう。
indexOf で文字のインデックス取得して substring で部分文字列を
indexOf は指定した文字のインデックスを返します。指定した文字が元の文字列になければ -1 を返します。
さらに文字列から部分文字列を取り出すには substring を使います。
そこで、 -1 になるときとならないときを念のため分けて、次のようにして foo.jpg の部分を取り出しています。
...
String t = parts[parts.length-1];
int idx = t.indexOf("?");
if(-1 < idx ){
System.out.println(t.substring(0, t.indexOf("?")));
}
else{
System.out.println(t);
}