Java에서 데이터 구조 요소 추가 Java: 파일 작업 - 쓰기, 읽기, 삭제. 이번 강의에서는 어떤 문제를 해결해볼까요?

이전에 설명한 클래스를 사용하면 파일에 텍스트를 쓸 수 있지만 해당 클래스의 기능은 다음과 같습니다. 본격적인 작업와 함께 텍스트 파일부족한. 그리고 이를 위해 상속인인 완전히 다른 클래스가 사용됩니다. 추상 수업독자와 작가.

녹음 파일. FileWriter 클래스

FileWriter 클래스는 Writer 클래스에서 파생됩니다. 텍스트 파일을 작성하는 데 사용됩니다.

올바른 방법은 명시적인 문자 인코딩 선언을 하도록 강제하는 클래스를 사용하는 것입니다. 스캐너는 각 행을 읽는 데 사용되며, 두 번째 스캐너는 각 행을 간단한 이름-값 쌍으로 구문 분석하는 데 사용됩니다. 예제를 실행하면 수신됩니다.

가장 먼저 해야 할 일은 이러한 클래스와 예외를 처리하는 클래스를 가져오는 것입니다. 그런 다음 이러한 클래스 중 하나에서 개체를 만들어야 합니다. 우리는 후자를 사용할 것입니다. 예외를 제어해야 한다는 점을 기억하세요. 객체 생성의 예를 살펴보고 스레드도 닫습니다.

FileWriter 객체를 생성하려면 다음 생성자 중 하나를 사용할 수 있습니다.

FileWriter(파일 파일) FileWriter(파일 파일, 부울 추가) FileWriter(FileDescriptor fd) FileWriter(문자열 파일 이름) FileWriter(문자열 파일 이름, 부울 추가)

따라서 파일 경로를 문자열로 지정하거나 특정 텍스트 파일을 참조하는 File 객체가 생성자에 전달됩니다. 추가 매개변수는 데이터를 파일 끝에 추가해야 하는지(매개변수가 true인 경우), 아니면 파일을 덮어써야 하는지를 지정합니다.

보시다시피 파일 경로를 작성합니다. 이제 파일에 텍스트를 쓰고 읽는 방법을 살펴보겠습니다. 이를 화면에 표시하거나 다른 파일로 전송할 수도 있습니다. 파일이 완료되면 read 메소드가 반환됩니다. 예를 살펴보겠습니다. 먼저 파일에 쓴 다음 읽습니다.

아이디어는 파일을 열고, 쓰거나 읽고, 파일을 닫는 것입니다. 파일 포인터를 이동하기 위해 아무것도 할 필요가 없습니다. 문자를 읽으면 자동으로 포인터가 이동합니다. 코드를 실행하면 화면에 아무 것도 쓰지 않지만 파일에 쓰면 질문은 다음과 같습니다. 왜? 대답은 스트림이 닫히면 그래픽으로 저장하기 위해 클릭한 것과 같습니다. 즉, 스트림을 닫지 않으면 파일이 비어 있는 것과 같습니다. 또한 동일한 파일을 동시에 읽고 수정하기 때문에 이런 일이 발생한다는 점도 기억해야 합니다.

파일에 텍스트를 작성해 보겠습니다.

java.io.* 가져오기; public class FilesApp ( public static void main(String args) ( try(FileWriter Writer = new FileWriter("C:\\SomeDir\\notes3.txt", false)) ( // 전체 줄 쓰기 String text = "Mom washing 액자, 엄마가 비누 액자를 씻어주셨어요.";writer.write(text); //문자로 쓰기writer.append("\n");writer.append("E");writer.flush(); ) catch( IOException ex)( System.out.println(ex.getMessage());

생성자는 값이 false인 추가 매개변수를 사용했습니다. 즉, 파일을 덮어씁니다. 그런 다음 Writer 기본 클래스에 정의된 메서드를 사용하여 데이터가 기록됩니다.

이렇게 하지 않으면 새로운 내용을 작성할 때 전체 파일을 덮어쓰게 됩니다. 이제 위와 동일한 예를 볼 수 있지만 메서드를 사용합니다. 프로그램으로 파일을 읽고 쓰는 것은 매우 유용할 수 있으며 구성 파일로 사용되어 자주 변경할 필요가 없습니다. 소스 코드각 시나리오에 대한 프로그램 자체 또는 단순히 데이터 공급 및 출력을 위한 것입니다.

읽고 쓰기 위한 파일 만들기

이 예에서 파일은 하나를 사용하여 생성되었지만 어떤 경우에도 동일한 파일을 생성할 수 있습니다. 독자가 선택해야 합니다. 가장 좋은 방법파일 생성. 아래와 같이 처음에는 이 파일이 비어 있습니다.


읽기 방법은 다음과 같습니다. 입력 매개변수메소드 서명에 표시된 대로 읽을 파일의 경로입니다.

파일을 읽는 중입니다. FileReader 클래스

FileReader 클래스는 다음에서 상속됩니다. 추상 수업 Reader이며 텍스트 파일을 읽는 기능을 제공합니다.

FileReader 객체를 생성하려면 해당 생성자 중 하나를 사용할 수 있습니다.

FileReader(문자열 파일 이름) FileReader(파일 파일) FileReader(FileDescriptor fd)

그리고 기본 Reader 클래스에 정의된 메서드를 사용하여 파일을 읽습니다.

프로젝트 사용 후 보관

이 메소드에는 삽입 기능이 있습니다 새 줄문자를 텍스트 파일로.


클래스에는 다음이 포함됩니다. 정적 방법, 파일 조작기를 시작하고 조작할 동일한 파일 경로의 메소드로 점프하는 기능이 있습니다.





파일에서 문자별로 읽는 방법을 보여주는 것부터 시작하겠습니다. 그러면 줄을 읽는 방법을 살펴보겠습니다. 마지막으로 텍스트, 비디오, 음악 또는 바이너리 콘텐츠 등 파일에서 바이트를 읽는 방법을 살펴보겠습니다.

java.io.* 가져오기; 공용 클래스 FilesApp( public static void main(String args)( try(파일 독자 독자= new FileReader("C:\\SomeDir\\notes3.txt")) ( // int c 문자를 문자별로 읽습니다. while((c=reader.read())!=-1)( System.out.print (( char)c); ) ) catch(IOException ex)( System.out.println(ex.getMessage()); ) )

수업 파일패키지 java.io파일 및 디렉터리에 대한 정보를 관리하는 데 사용됩니다. 수준에서 운영 체제파일과 디렉토리는 상당한 차이가 있지만 Java에서는 하나의 클래스로 설명됩니다. 파일. Java의 디렉토리는 다음과 같이 처리됩니다. 일반 파일, 그러나 추가 속성 - 메소드를 사용하여 볼 수 있는 파일 이름 목록 목록.

파일 읽기 및 쓰기

상황은 문자의 경우와 유사합니다. 이는 이미 파일의 첫 번째 바이트를 가리키는 바이트 판독기를 열고 위치를 지정합니다. 1바이트를 읽는 프로그램입니다. 즉, 이제 읽을 수 있는 몇 바이트가 있습니다. 이 훌륭한 콘텐츠를 게시하는 데 앞장서신 것을 축하합니다. 계속해서 활동해 주세요. 이 사이트는 매우 훌륭합니다.

제공하기 위해 믿을 수 있는 창조파일을 사용하려면 애플리케이션을 다음과 같이 구성해야 합니다. 생성된 파일가장 제한적인 허가를 받았습니다. 이는 운영 체제 구성이므로 애플리케이션을 설치할 때 고려해야 합니다. 파일이 생성되면 애플리케이션은 설정을 구성하기 위한 권한을 관리해야 합니다.

물건의 목적에 따라 파일- 파일이나 디렉터리의 경우 생성자 중 하나를 사용하여 객체를 생성할 수 있습니다.

파일(문자열 path_to_directory); 파일(문자열 디렉토리_경로, 문자열 파일_이름); File(파일 디렉터리, 문자열 파일 이름);

File 객체 생성의 예

// 디렉토리에 파일을 생성합니다. File dir = new File("C://dir_test"); // File 디렉터리에 있는 파일에 대한 파일을 생성합니다. file1 = new File("C://dir_test", "Hello1.txt"); File file2 = new File(dir, "Hello2.txt");

항상 동일한 사용자로 실행되는 웹 애플리케이션에서는 해당 사용자만 생성된 파일에 액세스할 수 있다는 것이 중요합니다. 파일을 통해 정보를 교환하는 애플리케이션의 경우 권한이 다음과 같은 것이 중요합니다.

녹음을 위해 파일을 사용하지 마십시오 다양한 응용, 모든 애플리케이션은 다음을 작성해야 합니다. 별도의 파일. 보시다시피 텍스트 파일을 작성하는 것은 읽는 것과 매우 유사합니다. 이 예에서 몇 가지 관찰을 할 수 있습니다. 마지막으로, 비공개 방법리소스를 해제하기 위해 호출됩니다. ~에 이 순간데이터가 파일에 기록되고 이전에 존재했다면 완전히 비워져 새 데이터가 이전 데이터에 오버로드됩니다. 파일에 추가하려면 즉, 기존 파일끝에 데이터를 추가하려면 다음 예제와 같이 다른 클래스 생성자를 사용하십시오. 따라서 작성된 데이터는 기존 내용을 덮어쓰지 않고 파일 끝에 추가됩니다.

파일 클래스의 속성 및 메서드

클래스에서 표준 파일 속성을 정의하려면 파일다양한 방법이 있습니다. 하지만 파일 클래스비대칭, 즉 객체의 속성을 결정하는 방법은 존재하지만 이러한 속성을 변경하는 해당 기능이 없습니다.

기능설명
문자열 getName()파일 또는 디렉터리의 이름입니다.
문자열 getParent()상위 디렉터리의 이름입니다.
긴 길이()파일 크기를 바이트 단위로 결정하는 함수입니다.
문자열 getAbsolutePath()판정 기능 절대 경로파일이나 디렉토리.
부울 삭제()파일이나 디렉터리를 삭제합니다.
부울이 존재합니다()파일이나 디렉터리가 있는지 확인합니다.
부울 isDirectory()확인 중 이 개체목록.
부울 isFile()주어진 객체가 파일인지 확인합니다.
긴 마지막 수정()파일이 마지막으로 수정된 날짜를 확인하는 기능입니다.
부울 canRead()파일에서 데이터를 읽을 수 있는지 확인합니다.
부울 canWrite()파일에 데이터를 쓸 수 있는지 확인합니다.
부울 isHidden()디렉터리나 파일이 숨겨져 있는지 확인합니다.
문자열 목록()파일 이름 및 하위 디렉터리 배열을 읽습니다.
파일 목록파일()일련의 파일 및 하위 디렉터리를 읽습니다.
부울 mkdir()새 디렉토리를 생성합니다.
부울 renameTo(파일 대상)파일이나 디렉터리의 이름을 바꿉니다.

다음 예에서는 "d:/test/MyFile.txt"(Windows) 파일을 열고 해당 특성을 추출합니다.

작성 방법과 관련하여 항상 높은 수준의 방법을 사용하지 마십시오. 디렉터리에 포함된 모든 파일과 하위 디렉터리를 찾기 위해 디렉터리의 내용을 나열하려는 경우가 많습니다. 포함된 모든 파일과 하위 디렉터리를 표시하는 파일입니다.

이러한 메서드는 콘텐츠가 결과 테이블에 완전히 로드된 후 차단되고 반환됩니다. 따라서 많은 파일과 하위 디렉터리가 포함된 디렉터리에서는 이를 호출하는 데 시간이 오래 걸릴 수 있습니다. 경고: 디렉터리가 비어 있으면 반환된 배열도 비어 있습니다. 그러나 디렉토리가 디렉토리가 아닌 파일을 참조하거나 작업 중에 오류가 발생하면 이런 일이 발생합니다.

java.io.파일 가져오기; 공용 클래스 FileTest ( public static void main(String args) ( File fl = new File("d:\\test\\MyFile.txt"); System.out.println("파일 이름: " + fl .getName() ); System.out.println("경로: " + fl.getPath()); 전체 경로: " + fl.getAbsolutePath()); System.out.println ("상위 디렉터리: " + fl.getParent()); System.out.println (fl.exists() ? "파일이 존재합니다." : "파일이 있습니다. 존재하지 않습니다. "); System.out.println (fl.canWrite() ? "속성 - 쓸 수 있음" : "속성 - 쓸 수 없음"); System.out.println (fl.canRead() ? "속성 - 읽을 수 있음" : " 속성 - 읽을 수 없음"); System.out.println ("디렉토리입니까? " + (fl.isDirectory() ? "yes": " no")); System.out.println ("이 파일은 일반 파일입니까? " + ( fl.isFile() ? "yes" : "no")); System.out.println("파일의 마지막 수정: " + fl.lastModified()); out.println("파일 크기: " + fl.length() + "바이트");

파일을 사용하여 반복된 파일 및 하위 디렉터리 시퀀스를 생성할 수 있습니다. 대상 경로. 이 작업을 수행할 파일입니다. 데이터 원본과 대상 사이의 중개자 역할을 합니다. 입력 스트림과 함께 작동하는 객체, 스트림 읽기용, 출력 스트림과 작동하는 객체, 스트림 쓰기용. 여기 또 다른 테스트 라인이 있습니다.

파일 이름을 텍스트 유형과 동일하게 지정할 수 있습니다. 이 개체는 사용하기가 매우 쉽고 해당 메서드가 매우 명시적이라는 것을 알 수 있습니다. 결과는 놀랍습니다! 당신은 이 객체의 메소드가 매우 유용할 수 있다는 데 동의할 것입니다! 이제 이 개체에 대해 조금 더 알았으므로 파일 작업을 시작할 수 있습니다!

다음 정보가 콘솔에 인쇄됩니다.

파일 이름: MyFile.txt 경로: d:\test\MyFile.txt 전체 경로: d:\test\MyFile.txt 상위 디렉터리: d:\test 파일이 있음 속성 - 쓸 수 있음 속성 - 읽을 수 있음 디렉터리입니까? ? 아니요 일반 파일인가요? 예 마지막 파일 수정: 1441710053162 파일 크기: 12바이트

파일필터 인터페이스

수업 파일특정 파일 목록만 읽는 방법이 포함되어 있습니다.

파일을 읽고, 파일에 씁니다. . 짐작하셨겠지만, 내부와 외부에 대한 클래스 계층 구조가 있습니다. 반대로 말하시겠습니까? 처음에는 많은 사람들처럼. 그러나 귀하의 프로그램이 아닌 귀하와 관련된 스레드를 찾았기 때문입니다!

드디어 파일 작업을 시작하겠습니다. 이 코드는 꽤 복잡하므로 키보드를 꽉 쥐고 계세요! 반면, 존재하지 않는 파일에 대한 쓰기 스트림을 열면 해당 파일이 자동으로 생성됩니다! 이러한 객체를 사용하려면 가져오기에 주의하시기 바랍니다.

다음 이미지는 이 코드의 출력을 보여줍니다.


따라서 기호를 표시하고 조작하기 위한 코딩 시스템이 개발되었습니다. 파일에 입력하거나 읽는 모든 문자는 이진 코드이며 이는 바이너리 코드십진수 코드입니다. 대응표. 그러나 이 인코딩은 악센트 문자가 있는 언어에 대해 너무 제한적인 것으로 판명되었으므로 이 문제를 극복하기 위해 광범위한 문자 인코딩 세트가 만들어졌습니다. 8바이트 바이트 배열을 정의한다는 것은 한 번에 8바이트를 읽는다는 의미입니다.

공용 파일 목록파일(FileFilter 필터)

같은 이름의 메소드와는 달리 매개변수가 없습니다. 이 방법특정 조건을 만족하는 디렉토리 파일만 선택합니다. 필터 매개변수는 이 조건을 설정하기 위한 것입니다. 이 경우 매개변수 유형은 파일필터- 클래스는 아니지만 파일이 특정 조건을 만족하면 true를, 그렇지 않으면 false를 반환하는 메서드가 하나만 있는 인터페이스입니다.

각 루프에서 바이트 배열에는 8개의 값이 포함되어 있으며 각 값은 다음에 해당합니다. 십진수 코드, 문자와 일치합니다. 스레딩 프로세스가 정확한 논리와 구문을 따르는 것을 볼 수 있습니다! 파일을 복사할 때 들어오는 스트림에서 몇 바이트를 받아 나가는 스트림에 전달했습니다. 각 사이클에서 읽은 데이터는 다음과 같습니다. 소스 파일, 복사본으로 정의된 파일에 기록됩니다.

이제 사용하기가 훨씬 쉬운 객체가 있지만 방금 배운 두 객체와 함께 작동하며 이러한 객체도 위에서 언급한 계층 구조의 일부이지만 이를 정의하는 슈퍼클래스가 있습니다. 이 두 클래스는 실제로 추상 클래스입니다.

공개 부울 수락(파일 경로 이름)

방법 목록파일디렉터리의 각 파일에 대해 accept 메서드를 호출하고, accept가 true를 반환하는 파일은 결과 목록에 포함됩니다. 나머지는 무시됩니다.

사용하기위한 파일필터객체를 생성하고 그에 상응하는 메소드를 정의해야 합니다 수용하다.

클래스 필터는 FileFilter ( String ext; Filter(String ext) ( this.ext = ext.split(","); ) private String getExtension(File pathname) ( String filename = pathname.getPath(); int i = filename을 구현합니다. lastIndexOf("."); if ((i > 0) && (i< filename.length()-1)) { return filename.substring(i+1).toLowerCase(); } return ""; } public boolean accept(File pathname) { if (!pathname.isFile()) return false; String extension = getExtension(pathname); for (String e: ext) { if (e.equalsIgnoreCase(extension)) return true; } return false; } }

다음 그림은 계층 구조를 도식화한 클래스 다이어그램을 보여줍니다.


이러한 클래스는 슈퍼클래스의 인스턴스를 매개변수로 사용하므로 필터를 누적하여 이와 같은 것을 얻을 수 있습니다. 이러한 클래스의 개선 사항을 구현하기 위해 거대한 텍스트 파일을 읽습니다. 평소대로이전에 본 객체와 버퍼를 사용합니다.

이제 재생 시간을 테스트할 수 있는 코드가 있습니다. 그리고 다음 사진에 보이는 결과는 또 허세입니다.

버퍼를 사용하면 코드 성능이 크게 향상될 수 있다는 데 동의하실 것입니다. 더 이상 지체하지 말고 편지로 테스트해보자.

FileFilter 필터 사용 예

java.io.파일 가져오기; import java.io.FileFilter; public class FileTest ( public static void main(String args) ( // 파일 디렉터리 정의 dir = new File("."); // 읽기 전체 목록디렉토리 파일 파일 lst1 = dir.listFiles(); // 확장자가 "png" 및 "jpg"인 디렉터리 파일 목록 읽기 File lst2 = dir.listFiles(new Filter("png,jpg")); System.out.println("lst1.length = " + lst1.length + ", lst2.length = " + lst2.length); ) )

다음 그림에서 볼 수 있듯이 여기서 차이점은 더욱 명확해집니다. 나중에 읽을 수 있도록 처음부터 파일을 생성하겠습니다. 다음 결과는 이 코드의 출력과 일치합니다.

코드는 간단하고 명확하며 간결합니다. 이 개체 유형에는 기능이 없다는 것을 알 수 있습니다! 지금까지 우리는 오직 기본 유형, 하지만 개체를 ​​사용하여 작업하는 것도 가능합니다!

파일에 개체를 쓰고 싶을 때 이를 "직렬화"라고 합니다. 이는 개체를 저장하는 작업의 이름입니다! 이제 여러분의 피험자들을 특정한 죽음으로부터 구할 시간입니다! 다음은 우리가 작업할 클래스입니다. 이것은 어떤 종류의 인터페이스입니까? 당신은 심지어 그 방법을 구현하지도 않았습니다!

FileInputStream 파일의 내용 읽기

파일의 내용을 읽으려면 클래스를 사용할 수 있습니다 파일입력스트림는 InputStream 클래스의 상속자이며 해당 메서드를 모두 구현합니다. FileInputStream 클래스의 생성자:

FileInputStream(String fileName)이 FileNotFoundException을 발생시킵니다.

파일을 열 수 없으면 FileNotFoundException이 발생합니다.

파일에서 데이터를 읽고 내용을 콘솔에 출력하는 예:

java.io.FileInputStream 가져오기; 공용 클래스 FilesApp ( public static void main(String args) ( try ( FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); System.out.println("파일 크기: " + fis.available () + " 바이트"); int i = -1; while((i = fis.read()) != -1)( System.out.print((char)i); ) fis.close (); ) catch(IOException e)( System.out.println(e.getMessage()); ) )

바이트 버퍼 = 새 바이트; // 파일을 버퍼로 읽습니다. fis.read (buffer, 0, fis.available()); System.out.println("파일 내용:"); for(int i = 0; 나는< buffer.length; i++){ System.out.print((char)buffer[i]); }

수업 파일입력스트림주로 바이너리 파일 작업을 위해 설계되었습니다. 텍스트 파일 작업에 사용할 수 있지만 이 작업에는 다른 클래스가 더 적합합니다.

사용예 파일입력스트림 UTF-8 인코딩으로 속성 파일을 읽으려면 다음을 수행하세요.

UTF-8 인코딩의 속성 파일 "data.properties":

# # SMTP 서버 매개변수 # 회사=뿔과 발굽 관리자=Ostap Bender

예시 목록:

java.io.Reader 가져오기; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; import java.io.InputStreamReader; java.util.Properties 가져오기; public class Main ( public static void main(String args) ( try ( InputStream is = new FileInputStream("data.properties"); if (is != null) ( Reader reader = new InputStreamReader(is, "UTF-8") ; 속성 props = new Properties(); System.out.println(props.getProperty("company") + ", " props.getProperty("manager")) ) catch (IOException e ) ( e.printStackTrace(); ) ) )

FileOutputStream에 쓰기

수업 파일출력스트림은 OutputStream 클래스에서 파생되므로 모든 기능을 상속합니다.

파일에 한 줄을 쓰는 예:

java.io.FileOutputStream 가져오기; 공개 클래스 FilesApp( 공개 정적 void main(String args)( 문자열 텍스트 = " 안녕하세요 세상!"; // 쓸 문자열 try ( FileOutputStream fos = new FileOutputStream("C:\\test_dir\\test.txt"); // 문자열을 바이트로 변환 byte buffer = text.getBytes(); fos.write( buffer , 0, buffer.length); ) catch(IOException e)( System.out.println(e.getMessage()); ) )

객체를 생성하려면 파일출력스트림작성할 파일의 경로를 매개변수로 사용하는 생성자가 사용됩니다. 문자열을 쓰려면 먼저 이를 바이트 배열로 변환하고 write 메소드를 사용하여 문자열을 파일에 씁니다. 전체 바이트 배열을 쓸 필요는 없습니다. 메소드 오버로딩 사용 쓰다(), 단일 바이트를 쓸 수도 있습니다.

Fos.write(버퍼); // 첫 번째 바이트만 쓰기

한 파일에서 다른 파일로 콘텐츠를 다시 쓰는 예:

java.io.FileInputStream 가져오기; import java.io.FileOutputStream; 공용 클래스 FilesApp ( public static void main(String args) ( try ( FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); FileOutputStream fos = new FileOutputStream("C:\\test_dir\\new .txt"); byte buffer = new byte; // 버퍼 읽기 fis.read(buffer, 0, buffer.length); // 버퍼에서 파일 fos.write(buffer, 0, buffer.length)에 쓰기 ; fis.close(); fos.close(); ) catch(IOException e)( System.out.println(e.getMessage()); )

수업 파일출력스트림주로 녹음을 목적으로 함 바이너리 파일. 텍스트 파일 작업에 사용할 수 있지만 이 작업에는 다른 클래스가 더 적합합니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: