자바 : 경로 대 파일


200

Java 7로 작성된 새로운 응용 프로그램의 java.io.File경우 더 이상 객체 를 사용해야하는 이유가 있습니까? 아니면 더 이상 사용되지 않는 것으로 간주 될 수 있습니까?

나는 java.nio.file.Path할 수있는 모든 것을 할 수 있다고 믿습니다 java.io.File.

답변:


152

간단히 말해 :

java.io.File가능성이 가장 높은 것입니다 결코 / 지원되지 않는되지 없습니다. 즉, java.nio.file.Path더 현대적인 java.nio.file라이브러리의 일부이며 모든 것을 java.io.File할 수 있지만 일반적으로 더 나은 방법으로 더 많이 수행합니다.

새 프로젝트의 경우을 사용하십시오 Path.

File레거시를 위한 객체 가 필요한 경우 Path # toFile ()

파일에서 경로로 마이그레이션

이 Oracle 페이지는 차이점을 강조 표시 java.io.File functionality하고java.nio.file lib (including Path) functionality

JDK 7의 NIO.2 파일 시스템에 대한 Janice J. Heiss와 Sharon Zakhour의 기사 (2009 년 5 월)


12
차이점에 대한 Oracle의 의견은 여기를 참조하십시오. docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder

4
또한 "파일"(복수형)은 더 이상 사용 되지 않습니다. 본질적으로 Path 객체에서 작동하고 isDirectory () 또는 exist ()와 같은 이전 File 클래스의 많은 기능을 수행하는 추상 클래스입니다.
Josiah Yoder

2
이제 궁금합니다 : JavaFX 8의 새로운 File / FolderChooser 대화 상자가 왜 File대신에 여전히 사용 Path됩니까?
piegames

2
경로는 인터페이스입니다. 인스턴스를 작성하려면 Paths.get (filename)을 사용하십시오. 이전 API가 여전히 사용되는 새 File (filename) .exists () 대신 Files.exists (Paths.get (filename))를 작성해야하는 혼란 때문에 발생할 수 있습니다.
Josiah Yoder

Path더 쉽게와 "추가 아이들"을 수정할 수 있습니다 resolve(...)또는으로 "한 단계 위로 이동" getParent()반면 등을 File할 수 없습니다. 본질적으로 경로 수정을 마치면 생성자 toFile()와 같은 레거시 메서드로 보낼 수 있도록 종종 경로를 변환합니다 FileInputStream.
MasterHD

18

더 이상 사용되지 않는 것으로 간주 할 수 있습니까?

아니, 당신은 할 수없는 그것을하지 않는 한 그것은 그래서으로 표시 될 때까지 사용되지 고려 File의 Javadoc.


14
이것이 "RFC가 그렇게 말했기 때문에"-응답 중 하나라고해도, 나는 그것을 좋은 대답으로 간주하지 않을 것입니다. File이 Path로 대체 될 것입니다. 미리 원한다면 Path를 즉시 사용하기 시작하고 필요한 경우 toFile ()을 사용할 수 있습니다.
Chris

15
@Chris 1.02에서 AWT 이벤트 모델을 변경 한 이후 JDK에서 제거 된 것은 없습니다. 전혀 '분명하지 않습니다'. 잘못 됐어
Lorne의 후작

5
@downvoters이 답변은 본질적으로 팽팽한 설명입니다. 잘못 될 수 없습니다. NB이 답변을 작성한 후 5 년 동안 Java 8은 그 이후에 나타 났으며 java.io.File여전히 제거되거나 더 이상 사용되지 않으며, 이러한 문제 중 하나가 발생할 것이라고 제안하는 Javadoc에는 여전히 아무것도 없습니다.
Lorne의 후작

2
@ EJP 방금 당신의 의견을 찬성했습니다. 그러나 답이 타당 학이라고 말할 때 당신이 옳다고 확신하지는 않습니다. 아마도 "의견에 근거한"것으로 찌그러져 야했던 질문은 "우리 더 이상 사용되지 않는다고 생각할 수 있는가 "이다. 예, OP와 다른 사람 은 할 수 있지만 그렇지 않습니다.
마이크 설치류

@ mikerodent 나는 그 질문이 실제로 무엇인지에 대한 고의적 인 오독 일 뿐이라고 제안합니다. 또한 부분 인용문.
Lorne의 후작

8

자세한 정보는이 기사를 확인하십시오-http: //www.oracle.com/technetwork/articles/javase/nio-139333.html

기본적으로 file.Path는 앞으로 나아갈 길이지만 널리 알려진 Java 사람들은 이전 버전과의 호환성을 유지하는 경향이 있기 때문에 그들이 떠난 이유라고 생각합니다.


링크를 업데이트 하시겠습니까? 이 기사를 읽고 싶습니다.
John B

불행히도 오라클 웹 페이지에서 원본 기사를 찾을 수 없었습니다. 다음은 뒤로 머신의 버전은 다음과 같습니다 web.archive.org/web/20090601091119/http://java.sun.com/...은
LordDoskias

1
나는 정상적인 오라클 측에서 기사를 다시 찾았다.
Duncan Jones

5

의 아주 좋은 답변을 완성 할 것입니다 @mmcrae.

java.io.File 객체를 더 이상 사용해야하는 이유가 있습니까? 아니면 더 이상 사용되지 않는다고 생각할 수 있습니까?

JDK 클래스는 거의 사용되지 않습니다. JDK 8 API 사용 중단 목록 에서 첫 번째 JDK 이후 사용되지 않는 모든 클래스를
볼 수 있습니다 . 여기에는 Oracle 설명서 및 Java 커뮤니티가 사용하지 않는 클래스의 일부만 포함되어 있습니다. 결함이 너무 많은 클래스 인 ,, ...는 더 이상 사용되지 않습니다. 그런데 왜? 개념적으로 무언가가 여전히 존재하지만 매우 확실하게 제거 되기 때문에 사용하지 않는 것이기 때문입니다. 수천 개의 프로그램은 이러한 나쁜 디자인 클래스에 의존합니다. 이러한 클래스의 경우 Java API 개발자는 그러한 신호를주지 않습니다.

java.util.Datejava.util.Vectorjava.util.Hashtable

deprecated


에 대한 답변은 @EJP정말 옳습니다.

Javadoc에 그렇게 표시 될 때까지는 아닙니다.

따라서 귀하의 질문은 다음과 같은 관점에서 더 의미가 있다고 생각합니다.
"우리는 선택을해야하는지, java.io.File아니면 java.nio.file.Path새로운 개발을 위해 사용해야하는지, 아니면 새로운 개발을 위해 사용해야하는지, 그리고 대답이 그렇다면, 기존 프로젝트를 java.nio.file.Path쉽게 활용할 수 있습니까?"java.io.Filejava.io.File

java.nio.file.Path는 java.io.File이 할 수있는 모든 것을 할 수 있다고 생각합니다.

답이 있습니다.

레거시 IO에 대한 이 Oracle 자습서 는 여러분의 생각을 확인시켜줍니다.

Java SE 7 릴리스 이전에는 java.io.File클래스가 파일 I / O에 사용 된 메커니즘 이었지만 몇 가지 단점이있었습니다.

많은 메소드가 실패했을 때 예외를 발생시키지 않았으므로 유용한 오류 메시지를 얻는 것이 불가능했습니다. 예를 들어, 파일 삭제에 실패한 경우 프로그램은 "삭제 실패"를 수신하지만 파일이 존재하지 않거나 사용자에게 권한이 없거나 다른 문제가 있는지 여부를 알 수 없습니다.

여러 플랫폼에서 이름 바꾸기 방법이 일관되게 작동하지 않았습니다. 심볼릭 링크는 실제로 지원되지 않았습니다.

파일 권한, 파일 소유자 및 기타 보안 속성과 같은 메타 데이터에 대한 추가 지원이 필요했습니다.

파일 메타 데이터에 액세스하는 것이 비효율적이었습니다.

많은 File 메서드가 확장되지 않았습니다. 서버를 통해 큰 디렉토리 목록을 요청하면 정지 될 수 있습니다. 큰 디렉토리는 메모리 자원 문제를 야기하여 서비스 거부를 초래할 수 있습니다.

원형 심볼릭 링크가있는 경우 파일 트리를 재귀 적으로 탐색하고 적절하게 응답 할 수있는 안정적인 코드를 작성할 수 없었습니다.

에 대한 많은 단점이 있기 때문에 java.io.File새로운 개발에이 클래스를 사용할 이유가 없습니다. 오라클은
레거시 코드를 사용하더라도 java.io.File힌트를 제공합니다 Path.

아마도 java.io.File을 사용하는 레거시 코드가 있고 코드에 미치는 영향을 최소화하면서 java.nio.file.Path 기능을 활용하려고합니다.

java.io.File 클래스는 다음과 같이 이전 스타일 File 인스턴스를 java.nio.file.Path 인스턴스로 변환하는 toPath 메소드를 제공합니다.

Path input = file.toPath();

그런 다음 Path 클래스에 사용 가능한 다양한 기능 세트를 활용할 수 있습니다.

예를 들어 파일을 삭제 한 코드가 있다고 가정합니다.

file.delete();

다음과 같이 Files.delete 메소드를 사용하도록이 코드를 수정할 수 있습니다.

Path fp = file.toPath();
Files.delete(fp);

요컨대, 그녀는 원한다면 더 이상 사용되지 않는다고 생각할 수 있습니다 .
마이크 설치류

@ 마이크 설치류. 바로 그거죠. 개념적으로 설명 된 이유로 Javadoc과 관련하여 그렇지 않은 동안 개념적으로해야합니다.
davidxxx

4

예. 그러나 Java7 자체 표준 API를 포함한 많은 기존 API는 여전히 File유형 에서만 작동 합니다.


8
Path 객체는 Path.toFile () 을 사용 하여 File 객체로 변환 한 다음 표준 API를 사용할 수 있습니다.
jacktrades

2
그래서 당신의 대답은 '그렇지만 아니오'입니까?
Lorne의 후작

1

Java.io.File은 더 이상 사용되지 않습니다. 예 java.nio.file.Path가 더 좋지만 Java.io.File을 사용하는 많은 프로그램과 교과서가 여전히있는 한 레거시 이유로 만 더 이상 사용되지 않는 것으로 간주해서는 안됩니다. 그렇게함으로써 모든 이득을 얻지 못한 채로 스패너를 던질 수 있습니다. 예를 들어 Android 프레임 워크는 기본 파일 처리 기능 중 일부를 위해 File을 사용하지만 다른 많은 기능도 있습니다.


그는 Path더 나은지 묻지 않았다 . 그는 File더 이상 사용되지 않는지 물었습니다 .
Lorne의 후작

1
@ EJP 나는 당신이 약간 과장되어 있다고 생각합니다. OP는 java.io.File이 더 이상 사용되지 않는지 묻고 대답했습니다. 또한 "java.nio.file.Path가 java.io.File이 할 수있는 모든 작업을 수행 할 수 있다고 생각합니다."라고 말했습니다. 나는 단지 그의 의견을 확인하고 있었고 투표 할 가치가 거의 없었습니다.
Andrew S

-9

Java 7로 작성된 새로운 애플리케이션의 경우 java.io.File 객체를 더 이상 사용해야하는 이유가 있습니까?

"나폴레옹이 러시아를 침략해야 합니까 , 아니면 이 브뤼셀 콩나물이 정말 맛 있어야 합니까?"

질문의 두 번째 부분에 대해서는 실제로 사용되지 않는 것으로 간주 할 수 있습니다. 2018 년 1 월 기준으로 더 이상 사용되지 않습니다. 그러나 그렇게 생각 하는 것을 막을 수있는 것은 없습니다 . 그것이 당신에게이 생에서 어떤 이점을 얻을 수 있을지 아니면 다음 생에 말을하는지는 불가능합니다.


5
나는 당신의 비유를 이해하지 못합니다.
Tunaki

"또는"질문은 두 가지 논리적 대안을 제시해야하며, 둘 다 본질적으로 동일한 질문에 대답합니다.
마이크 설치류

죄송합니다.이 상황에서 매우 현명하게 들립니다. 아이디어는 "사용하고 싶습니다 File. 예, 아니요 여야합니까?"입니다.
Tunaki

1
예,로드 된 질문이라는 데 동의합니다. 특히 기존의 많은 타사 API가 여전히 File어쨌든 사용하기 때문입니다. 곧 죽지 않을 것입니다.
Tunaki

3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
돈 Cheadle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.