2012-01-09 3 views
26

Java7은 로컬 파일 용으로 기본 Path 구현과 함께 제공됩니다. URL에 대한 경로 구현이 있습니까?URL의 경로는 java.nio.file.Path입니까?

예를 들어, 다음 코드를 사용하여 원격 리소스를 복사 할 수 있어야한다 :

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html")); 
Path local = Paths.get(new URI("/bar.html")); 
Files.copy(remote, local); 

현재,이 java.nio.file.FileSystemNotFoundException: Provider "http" not installed가 발생합니다. 아마 이걸 직접 구현할 수는 있지만 바퀴를 재발 명하지는 않을 것입니다.

+0

무엇이 Files.copy (InputStream, Path)입니까? URL은 웹 인 세계로의 경로를 구성합니까? 아니면 포인터와 더 비슷합니까? 당신은 무엇을 얻을 가능성이 있습니까? –

+0

@owlstead, 내 라이브러리는 불투명 한 경로를 사용자에게 반환해야합니다. 파일이 로컬 (즉, 데이터베이스) 또는 원격 (웹 서버)인지 여부를 알거나 신경 쓸 필요없이 이러한 (읽기 전용) 경로를 로컬 파일 시스템에 복사 할 수 있습니다. InputStreams에는 파일 이름이나 lastModified 타임 스탬프와 같이 사용자에게 제공 할 속성이 없습니다. – Gili

+0

이해하지만 사용자가 볼 수있는 것은 필연적으로 기본 구현에 반영되어서는 안됩니다. –

답변

3

FTP가 수행하는 작업을 실제로 수행하려는 것 같습니다. 한 곳에서 다른 곳으로 파일을 복사하십시오. 기존 FTP 코드 라이브러리를 사용하여 더 나은 방법을 찾을 것을 제안합니다.

URI는 파일 시스템 경로가 아니므로 URI로 취급 할 수 없습니다. 이들은 주소/리소스 로케이터로서 브라우저 (또는 브라우저를 처리하는 다른 클라이언트)와 함께 이동하면 그 뒤에있는 서버에 정의 된대로 동작합니다. 서버가하는 일에 대한 표준이 없으므로 웹 서비스의 유연성이 있습니다. 따라서 서버가 파일 복사를 용이하게하기 위해 이러한 방식으로 HTTP 요청을 수락하면 자체적으로 롤백하고 파일 데이터를 POST 요청으로 전달해야합니다.

다른 말로하면 (1) 파일 시스템 경로처럼 URI를 처리하지 않아야합니다. (2) 파일을 복사 할 FTP 라이브러리를 찾고, (3) 이 작업을 수행하는 웹 서비스를 구축하고 POST 요청을 통해 파일 복사의 세부 사항을 추상화하려고합니다. # 3을하면 건물이 사용자 정의와 매우 흡사하며 사용자의 특정 디자인을 따르는 사이트의 하위 집합 (예 : 직접 제작 한 사이트)에서만 작동한다는 것을 이해합니다. POST 명령을 통해 매개 변수 또는 "파일 복사"에 대한 표준 집합이 없으므로이 작업을 "제대로 수행"할 수 있음을 알고 있습니다. HTTP 요청을 웹 서비스와 일치시켜야합니다. 서버 측.

+0

가치있는 점은 누군가 https://issues.apache.org/jira/browse/VFS-199에서 일반 HTTP 디렉토리 브라우저를 사용하고 있다는 것입니다. 필자의 경우 웹 서버는 지정된 디렉토리 구조를 따라야하므로 해당 Path 구현을 롤백해야합니다. 맞춤 구현이 필요한 이유를 이해하는 데 도움을 주셔서 감사합니다. – Gili

+0

Coolio - 기꺼이 도와 드리겠습니다. 기쁜 마음으로 프로젝트를 발견했습니다. – jefflunt

+0

@normalocity 그것은 거의 관련이 없으며 이것을 뇌의 꼭대기에서 쏘고 있습니다. 그러나 Java 7에서 현재 _classpath resource_에 대한 경로를 반환하는 메소드가 없다고 생각합니다. 좋은. 그것에 대해 어떻게 생각하세요? 나는'Path'가'URL'보다 훨씬 더 좋기 때문에 좋을 것이라고 생각합니다. –

0

나는 비슷한 문제를 다루어야하고 이것을 해결하기위한 약간의 방법을 썼다. 아래에서 찾을 수있다.

URL과 상대 접미어의 연결에 문제가 없습니다. URI 해석 기능의 동작 때문에 절대 접미사를주지 않도록주의하십시오.

private URI resolveURI(String root, String suffix) { 
    URI uri; 
    try { 
     uri = new URI(root + "/").resolve(suffix); 
    } catch (URISyntaxException e) { 
     //log 
    } 
    return uri; 
}