머리말
이 기사에서 시작하여 본질적으로 파일을 읽고 쓰는 Java IO 시스템을 배우기 시작합니다. 간단하게 들리지만 쉽지는 않습니다. Java의 IO 시스템은 개선 및 개선을 해왔으며 많은 수업을 설계했습니다. 이러한 유형의 의미를 이해하고 해당 애플리케이션 시나리오의 의미를 이해함으로써 파일 IO의 이해를 향상시킬 수 있습니다.
따라서 첫 번째 단계는 파일을 나타내는 방법의 문제를 해결하는 것입니다. Java World에서 "모든 것이 객체입니다"이며, Java 객체에 대한 실제 디스크 파일 또는 디렉토리에 해당하는 방법이 우리의 주요 문제입니다.
파일은 Java에서 일반 파일이든 디렉토리이든 파일을 추상화하는 데 사용되며 파일 객체에 해당 할 수 있습니다. 모든 사람이 파일 유형을 위치시키는 데 정확해야한다고 생각합니다. 단순히 디스크의 파일 또는 디렉토리를 간단하게 나타내며 실제로 플랫폼 독립적 인 로컬 파일 시스템 클래스에 의존하며 파일은 파일 콘텐츠에서 읽기 및 쓰기 작업을 수행 할 수 없습니다 (즉, 스트림이하는 것).
파일 인스턴스를 작성하십시오
실제로 파일 인스턴스 생성자 메소드를 소개하기 전에 여러 가지 중요한 속성 멤버를 살펴 봐야합니다.
개인 정적 최종 파일 시스템 FS = DefaultFilesystem.getFilesystem ();
이것은 파일 클래스의 가장 핵심 멤버이며 현재 시스템의 파일 시스템 API로 표시됩니다. 디스크에 발행 된 모든 작업은이 속성을 기반으로합니다.
개인 최종 문자열 경로;
경로는 현재 인스턴스의 전체 경로 이름을 나타냅니다. 현재 파일 인스턴스가 디렉토리를 나타내는 경우 경로 값은 전체 디렉토리 이름입니다. 순수한 파일을 나타내는 경우이 경로의 값은 파일 + 파일 이름의 전체 경로와 같습니다.
public static final char exparatorchar = fs.getSeparator (); public static final char pathseparatorchar = fs.getPathSeparator ();
SeparatorChar는 디렉토리 사이의 분리기를 나타내고 PathSeparatorchar는 다른 경로에서 분리기를 나타냅니다. 이 두 값은 시스템 플랫폼에서 다릅니다. 예를 들어, 창 에서이 두 가지의 값은 다음과 같습니다. ""및 ";", 여기서 금지는 여러 다른 경로를 분리하는 데 사용됩니다.
파일 클래스는 파일 개체를 인스턴스화하기위한 4 개의 다른 생성자를 제공하지만 3 개만 더 일반적으로 사용됩니다. 우리는 또한 처음 세 가지 생성자를 배우는 데 중점을 둡니다.
공개 파일 (String PathName)
이것은 파일 개체를 인스턴스화하는 가장 일반적인 방법입니다. PathName 값은 디렉토리 또는 일반 파일 이름 일 수 있습니다. 예를 들어:
파일 = 새 파일 ( "c : // users // yanga // goodtop"); file file1 = new File ( "c : //users//yanga//desktop//a.txt"); file file2 = new File ( "a.txt");
물론 부모 경로를 명시 적으로 지정할 수도 있습니다.
공개 파일 (String Parent, String Child)
생성자 내부에서 프로그램은 예를 들어 우리를위한 완전한 파일 경로를 연결합니다.
파일 = 새 파일 ( "c : // users // yanga // goodtop", "a.txt"); file file1 = new File ( "C : // users // Yanga // goodtop", "java");
세 번째 생성자는 본질적으로 두 번째 생성자와 동일하지만 부모 파일 인스턴스의 캡슐화 프로세스를 추가한다는 점을 제외하고는 다음과 같습니다.
공개 파일 (파일 부모, 문자열 자녀)
비슷한 상황은 설명되지 않습니다. 우리는 여기에서 이러한 생성자의 내부 구체화를 탐구하지 않았습니다. 간단한 것은 아닙니다. 대신 파일은 로컬 파일 시스템에 너무 의존하며 많은 방법의 구현을 직접 볼 수 없습니다. 따라서 파일 학습을 위해서는 파일을 마스터하는 데 능숙하기에 충분하며 특정 구현은 당분간 심층적으로 배울 수 없습니다.
파일 이름 또는 경로와 관련된 정보를 얻습니다
getName 메소드는 파일 이름을 얻는 데 사용될 수 있습니다.
public String getName () {int index = path.lastIndexof (SeparatorChar); if (index <prefixlength) return path.substring (prefixlength); 반환 경로. 서브 스트링 (index + 1);}우리의 분리기 차가 무엇을 나타내는 지 기억하십니까?
경로 분리기, Windows의 기호 ""는 경로 속성에 저장되고 현재 파일 인스턴스의 전체 경로 이름에 저장되므로 마지막 발생 후 모든 문자는 파일 이름이어야합니다.
물론 순수한 파일의 경우이 메소드가 파일의 간단한 이름을 반환 할 수 있고 디렉토리의 경우 리턴 값이 가장 최근의 디렉토리 이름이 될 것임을 발견했을 것입니다. 예를 들어:
파일 = 새 파일 ( "c : //users//yanga//desktop//a.txt"); System.out.println (file.getName ()); 파일 파일 = 새 파일 ( "c : // users // yanga // goodtop"); system.out.println (file1.getname ());
출력은 당신을 놀라게하지 않을 것입니다.
a.txtdesktop
GetParent 메소드는 현재 파일의 상위 디렉토리를 반환하는 데 사용됩니다. 당신이 일반 파일이든 디렉토리이든, 결국 부모 디렉토리가 있습니다 (물론 가상 시스템에서 생성 된 임시 파일은 물론 그렇지 않습니다).
public String getParent () {int index = path.lastIndexof (SeparatorChar); if (index <prefixlength) {if ((prefixlength> 0) && (path.length ()> prefixlength)) return path.substring (0, prefixlength); 널 리턴; } return path.substring (0, index);}이 방법의 구현은 매우 간단하므로 자세한 내용은 없습니다.
getPath 메소드는 현재 파일 인스턴스의 전체 파일 이름을 반환 할 수 있습니다.
public String getPath () {return path;}다음은 디렉토리와 관련된 일부 관련 작업으로, 구현하기가 비교적 간단합니다. 다음은 간단한 목록입니다.
여기서 우리는 GetCanonicalPath에 대한 설명, 표준 경로는 무엇이며 절대 경로 사이에 차이가 있습니까?
일반적으로 "../"는 소스 파일이있는 디렉토리의 이전 디렉토리를 의미합니다. "../../"는 소스 파일이있는 디렉토리의 이전 디렉토리를 의미합니다. getAbsolutepath 방법은 이러한 변환 작업을 수행하지 않으며 GetCanonicalPath 방법은 이러한 특수 문자를 인식하고 적절한 의미를 취합니다.
예를 들어:
파일 = 새 파일 ( "..// a.txt"); System.out.println (file.getAbsolutepath ()); System.out.println (file.getCanonicalPath ());
출력 결과 :
C :/사용자/yanga/goodtop/java/workspace2017/testfile /../ a.txt
C : /users/yanga/desktop/java/workspace2017/a.txt
전자는 파일 경로 이름의 일부로 "../a.txt"를 사용하는 반면, 후자는 "../a.txt"가 "a.txt"가 현재 디렉토리의 상단 디렉토리에 있음을 의미한다는 것을 인식 할 수 있습니다. 이것은 다른 상황에 적합한 두 가지의 가장 큰 차이점입니다.
파일의 속성 정보를 가져옵니다
파일 의이 부분의 작동은 실제로 매우 간단합니다. 파일 권한에 대한 몇 가지 질문에 지나지 않습니다. 파일 권한이 읽을 수 있는지 여부, 쓸 수 있는지 여부, 숨겨진 파일 등을 자세히 살펴 보겠습니다.
길이 메소드는 순수한 파일에 대해 파일의 총 바이트 수를 올바르게 반환 할 수 있지만 디렉토리의 경우 리턴 값은 "지정되지 않은"값이 될 것이며, 이는 디렉토리의 모든 파일의 총 바이트 수가 아니지만 단지 지정되지 않은 값이 아니며 의미가 없습니다.
파일 작동
파일의 작동은 "첨가, 삭제, 수정 및 검색"에 지나지 않습니다. 함께 살펴 보겠습니다.
물론 위의 두 가지 간단한 새로운 생성 및 삭제 작업을 처리 할 때 파일 클래스는 소위 "쿼리"작업을 제공하며 신중하게 배워야합니다. 예를 들어:
public String [] list () {SecurityManager Security = System.GetSecurityManager (); if (security! = null) {security.checkread (path); } if (isinValid ()) {return null; } return fs.list (this);}이 메소드는 현재 인스턴스로 표시되는 디렉토리에서 "Pure Files"및 "Directory"의 모든 간단한 이름을 검색합니다. 예를 들어:
파일 = 새 파일 ( "c : // users // yanga // goodtop"); String [] list = file.list (); for (string str : list) {system.out.println (str);}프로그램의 출력 결과는 컴퓨터 데스크탑 디렉토리에있는 모든 파일의 간단한 이름을 인쇄하므로 귀하에게 표시하지 않습니다.
주목해야 할 것은 파일 인스턴스가 디렉토리에 해당하지 않고 일반 파일에 해당하는 경우 List는 NULL을 반환한다는 것입니다.
다음으로 디렉토리 파일을 검색하는 메소드를 살펴 보겠습니다.
public String [] list (filenamefilter filter) {문자열 이름 [] = list (); if ((names == null) || (filter == null)) {return names; } list <string> v = new ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.cept (this, names [i])) {v.add (names [i]); }} return v.toArray (새 문자열 [v.size ()];}이 방법은 실제로 과부하 된 목록 버전으로, 디렉토리를 검색 할 때 필요한 파일과 디렉토리 만 필터를 필터로 전달할 수 있습니다.
그러나 filenamefilter 인터페이스의 정의는 매우 간단합니다.
공개 인터페이스 filenamefilter {boolean accept (파일 dir, string name);}이 수락 방법을 무시하면됩니다. 루프 목록이 파일 또는 디렉토리를 얻을 때 마다이 필터링 메소드를 먼저 호출하려고합니다. 필터링을 전달하면 현재 파일의 간단한 이름이 리턴 컬렉션에 추가됩니다.
따라서이 수락 방법을 다시 쓰면 필터링을 전달할 수있는 파일과 할 수없는 파일이 결정됩니다. 예를 살펴 보겠습니다.
데스크탑의 테스트 폴더의 파일은 다음과 같습니다.
파일 = 새 파일 ( "c : // users // yanga // goodtop // test"); String [] list = file.list (new filenamefilter () {@override public boolean accept (file dir, string name) {// dir // 이름은 현재 트래버스 된 파일 항목의 간단한 이름입니다. for (string str : list) {system.out.println (str); }여기서 익명의 내부 클래스를 사용하여 FilenameFilter의 서브 클래스 인스턴스를 작성한 다음 수락 방법을 구현합니다. 특정 구현은 매우 간단하며 모든 디렉토리를 필터링하고 모든 일반 파일의 간단한 이름을 가져옵니다.
최종 출력 결과는 다음과 같습니다.
3.txt
4.txt
물론 파일 클래스에는 다음과 같은 두 가지 "돌연변이"목록 메소드도 있습니다.
더 이상 대상 디렉토리에서 "Pure Files"및 "Directories"의 간단한 이름을 반환하지 않지만 해당 파일 개체를 반환합니다. 사실, 그것은 아무것도 아닙니다. 대상 디렉토리 + 간단한 이름은 이러한 파일 인스턴스를 빌드 할 수 있습니다.
따라서 기본적으로 목록 메소드는 대상 디렉토리의 모든 파일을 통과하지 않습니다.
따라서 첫 번째 수준 하위 디렉토리의 깊은 파일을 포함하여 대상 디렉토리의 모든 파일을 통과하는 방법에 대해 생각해야합니다. 답은 기사의 끝에 제공됩니다.
다음 두 가지 방법은 폴더 생성과 관련이 있습니다.
둘 다 현재 파일 인스턴스를 기반으로 폴더를 생성합니다. 차이점과 관련하여 먼저 코드를 살펴 보겠습니다.
파일 = 새 파일 ( "c : // users // yanga // goodtop // test2"); system.out.println (file.mkdir ()); file file2 = new File ( "C : // users // yanga // goodtop // test3 // hello"); system.out.println (file2.mkdir ());
그중에서도 Test2와 Test3는 프로그램이 실행될 때까지 존재하지 않습니다.
출력 결과는 다음과 같습니다.
진실
거짓
후자는 왜 만들지 못했습니까?
이는 MKDIR 메소드가 한 번에 하나의 폴더 만 생성 할 수 있기 때문에 주어진 디렉토리의 부모 또는 더 높은 디렉토리가 창조되지 않은 디렉토리가 존재하는 경우 생성 실패를 유발할 수 있기 때문입니다.
MKDIRS 방법은이 상황을 해결하는 데 사용됩니다. 대상 경로에서 모두 고정되지 않은 디렉토리를 생성합니다. 코드를 참조하십시오.
file 파일 = 새 파일 ( "C : // users // yanga // goodtop // test3 // hello // 231"); system.out.println (file3.mkdirs ());
Test3 폴더가 존재하지 않더라도 프로그램이 실행 된 후 3 개의 폴더 Test3, Hello 및 231이 생성됩니다.
또한 파일에는 임시 파일을 생성하는 메소드도 있습니다. 소위 임시 파일은 다음과 같습니다. 런타임 중에 존재하며 가상 머신이 종료 될 때 파괴됩니다. 직접 공부할 수 있습니다. 사용하기가 비교적 간단하므로 여기에서 자세히 설명하지 않습니다.
이 시점에서 파일 유형 파일에 대해 대략 배웠습니다. 나는 모든 사람들이 같은 유형을 사용하여 순수한 파일과 디렉토리를 표현하는 디자인이 약간 혼란스럽고 불합리한 것처럼 보일 것이라고 생각합니다. JDK1.7 SUN은 파일과 파일과 디렉토리를 별도의 파일로 향한 경로를 시작했으며 향후 기사에서 더 많이 배울 것입니다.
기사의 모든 코드, 이미지 및 파일은 내 github의 클라우드에 저장됩니다.
(https://github.com/singleyam/overview_java)
로컬로 다운로드하도록 선택할 수도 있습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.