2017-11-29 2 views
0

파일의 전체 경로에서 파일 이름을 가져 오려고합니다. 입력 : "D : // 아몰 // 1/\ 15_amol.jpeg" 예상 출력 : 15_amol.jpeg자바에서 (백 슬래시)를 사용하는 하위 문자열

나는이

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 진수 이스케이프"입니다. 여기에는 두 가지 가능성이 있습니다.

  1. 당신은 정말 당신이 포함 된 개행 문자와 파일 이름을 만들려고하는 경우에 진수 탈출로 \15을 의미했다. Windows가 일어나는 것을 방지하고 프로그램이 IOException가 발생합니다

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

    이 경우에 fname의 실제 내용이 표현 될 수있다.

  2. 당신은 정말 백 슬래시가 중복 및 파일 이름이 해결할 수 있기 때문에 하나에 D:\amol\1\\15_amol.jpeg 인접 디렉토리 분리 붕괴 (Windows 경로 측면에서) Windows에서 무시됩니다이 경우

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

    을 의미 분리 기호. 따라서 유효 경로를 변경하지 않고 여분의 백 슬래시를 모두 생략 할 수 있습니다.

은 예외로, 백 슬래시 문자 (위의 경우 1)를 포함하지 않습니다 같이 문자열, 그래서

fname.lastIndexOf("\\") 

+1

당신의 대답은 저의 가까운 투표를 철회하는 데 영감을주었습니다. 질문. 이런 대답을하는 것이 가치가 있습니다. 비록 제가 매우 까다 롭다면, 포함 된 개행 문자가 내장 된 캐리지 리턴과 같은 것이 아니라는 것을 지적하고자합니다. –

+0

감사합니다. 즉 _actual_ 즉각적인 질문에 대한 답변을 업데이트했습니다 .-) –

관련 문제