2017-11-29 6 views
0

ファイルの完全なパスからファイル名を取得したい。 入力: "D:// AMOL // 1/\ 15_amol.jpeg" 予想される出力:15_amol.jpegJavaで(バックスラッシュ)を使用する部分文字列

私はこの

public class JavaApplication9 { 
    public static void main(String[] args) { 
     String fname="D://amol//1/\15_amol.jpeg"; 
     System.out.println(fname.substring(fname.lastIndexOf("/"))); 
     System.out.println(fname.substring(fname.lastIndexOf("\\"))); 
    } 
} 

が、出力の下に取得するためのコードの下に書かれている:

_amol.jpeg 

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: -1 
    at java.lang.String.substring(String.java:1927) 
    at javaapplication9.JavaApplication9.main(JavaApplication9.java:6) 

C:\Users\lakhan.kamble\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: 
Java returned: 1 
+0

あなたがエスケープする必要が例外を発生させ、-1を返して元のStringリテラルのバックスラッシュだから 'String fname =" D:// amol // 1/\\ 15_amol.jpeg ";'タイプミスとしてこれを閉じる投票。 –

+0

'File.getName()'はあなたのためにこれを行います(あなたが入力ミスを修正した後)。車輪を再構築しないでください。 'System.out.println(新しいファイル(" D:// amol // 1/\\ 15_amol.jpeg ").getName());' –

答えて

1

文字列\15は、キャリッジリターン文字(0x0d、13小数)の「8進エスケープ」です。ここには2つの可能性があります。

  1. あなたは本当にあなたが埋め込まれた改行とファイル名を作成しようとしている場合には8進数のエスケープであると\15を意味しました。この場合fnameの実際の内容は

    "D://amol//1/" + "\n" + "_amol.jpeg"; 
    

    Windowsのように表すことができ起きてからそれを防ぐことができますし、あなたのプログラムはIOExceptionをスローします。

  2. あなたは本当に

    String fname="D://amol//1/\\15_amol.jpeg"; 
    

    この場合、余分なバックスラッシュが冗長であり、ファイル名は、単一のD:\amol\1\\15_amol.jpegと隣接するディレクトリの区切りの崩壊に(Windowsのパスの用語で)解決しますので、Windowsによって無視されることを意味セパレータ。したがって、有効なパスを変更することなく、余分なバックスラッシュを省略することができます。

は、あなたの例外については、バックスラッシュ文字(上記の場合1)を含まない示すように、文字列は、そう

fname.lastIndexOf("\\") 

+1

あなたの答えは私の近くの投票を撤回するよう促したと十分に洞察していました。質問。このような答えを得る価値があることは間違いありません。私が超ピカピカになるのであれば、埋め込み改行は埋め込みのキャリッジリターンと同じものではないことを指摘したいと思います。 –

+0

ありがとうございました。また、私は_actual_の直ぐ質問に答えるための回答を更新しました:-) –

関連する問題