예제 - 올바른 파일 분리 문자를 사용하도록 문자열 경로를 변환 할 Java 유틸리티가 있습니까?




jlabel 사용법 (6)

Java로 파일을 조작하는 많은 클래스를 개발했습니다. 나는 리눅스 박스에서 일하고 있으며, new File("path/to/some/file"); 행복하게 타이핑했다 new File("path/to/some/file"); . 커밋 할 시간이 왔을 때 프로젝트의 다른 개발자 중 일부는 Windows를 사용하고 있음을 깨달았습니다. 이제는 "/path/to/some/file" 형식의 String을 취할 수있는 메서드를 호출하고 OS에 따라 올바르게 구분 된 경로를 반환하고 싶습니다.

예 :
"path/to/some/file" 은 Windows에서 "path\\to\\some\\file" 됩니다.
Linux에서는 주어진 String을 리턴한다.

이 작업을 수행 할 수있는 정규 표현식을 작성하는 데 오랜 시간이 걸리지는 않을 것이라고 생각하지만 휠을 재발견하려는 것은 아니며 제대로 테스트 된 솔루션을 선호합니다. JDK에 내장되어 있다면 좋겠지 만, 일부 작은 F / OSS 라이브러리의 일부이기도하다.

그래서 올바른 파일 구분 문자를 사용하도록 문자열 경로를 변환 할 Java 유틸리티가 있습니까?

https://code.i-harness.com


Java Paths에는이 구멍이 있다고 생각합니다.

String rootStorePath = Paths.get ( "c : / projects / mystuff /"). toString ();

사용해야하는 파일 시스템이있는 시스템에서 실행중인 경우 작동합니다. 지적했듯이, 현재 OS 파일 시스템을 사용했습니다.

Windows와 Linux 사이의 경로로 작업해야합니다. 하나에서 다른 것으로 파일을 복사하십시오. "/"모든 작품을 사용하는 동안 당신은 모든 자바 명령을 사용하는 것 같아요,하지만 그래서 / 또는 file.separator 등을 사용하여 SFTP를 호출해야합니다 ... 도와주지 않습니다. 광산을 "지금"실행중인 기본 파일 시스템으로 변환하기 때문에 Path ()를 사용할 수 없습니다.

Java가 필요로하는 것 :
`윈도우 시스템 : 경로 posixPath = Paths.get ( "/ home / mystuff", FileSystem.Posix); / home / mystuff /에 있으며 \ home \ mystuff로 변환되지 않습니다.

리눅스 시스템에서 문자열 winPath = Paths.get ( "c : \ home \ mystuff", FileSystem.Windows) .toString ();`은 c : \ home \ mystuff에 있으며 / c : / home / mystuff

문자 집합 작업과 비슷합니다.

URLEncoder.encode ( "whatever here", "UTF-8") .getBytes ();

추신 : 나는 또한 전체 아파치 io jar 파일을로드하기를 원하지 않는다. 이 경우 그들은 내가 제안한 것을 어쨌든 가지지 않습니다.


당신은

System.getProperty("file.separator")

경로를 나타내는 문자열을 작성 하시겠습니까?



아파치 커먼즈가 다시 구출된다. 커먼즈 IO 메서드 FileNameUtils . separatorsToSystem() 이 원하는 것을 처리합니다.

말할 필요도없이, Apache Commons IO는 훨씬 더 많은 작업을 수행 할 것이며 가치가있다.


이것은 아파치 commons-io가 수행하는 것으로, 다음과 같은 두 줄의 코드로 풀립니다.

String separatorsToSystem(String path) {
    if (res==null) return null;
    if (File.separatorChar=='\\') {
        // From Windows to Linux/Mac
        return res.replace('/', File.separatorChar);
    } else {
        // From Linux/Mac to Windows
        return res.replace('\\', File.separatorChar);
    }
}

따라서 여분의 의존성을 피하려면 그냥 사용하십시오.


"/path/to/some/file" 은 Windows Vista 및 XP에서 실제로 작동합니다 .

new java.io.File("/path/to/some/file").getAbsoluteFile()

> C:\path\to\some\file

그러나 Windows에는 여러 roots있으므로 이식성없습니다 . 따라서 루트 디렉토리는 어떤 식 으로든 선택되어야합니다. 상대 경로에는 문제가 없어야합니다.

편집하다:

아파치 커먼스 io 는 유닉스와 윈도우가 아닌 envs를 돕지 않는다 . Apache io 소스 코드 :

public static String separatorsToSystem(String path) { 
    if (path == null) {
     return null;
    }
    if (isSystemWindows()) {
      return separatorsToWindows(path);
    } else {
      return separatorsToUnix(path);
    }
}




jdk1.6