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);
      }

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門