JavaRush /Java Blog /Random-KO /자바의 I/O. 클래스 FileInputStream, FileOutputStream, BufferedI...

자바의 I/O. 클래스 FileInputStream, FileOutputStream, BufferedInputStream

Random-KO 그룹에 게시되었습니다
안녕하세요! 오늘 강의에서는 Java의 입력 및 출력 스트림, 줄여서 Java I/O (“입력-출력”) 에 대한 대화를 계속하겠습니다 . 이것은 이 주제에 대한 첫 번째 강의도 아니고 마지막 강의도 아닙니다 :) 언어로서의 Java는 입력/출력 작업에 대한 많은 기회를 제공합니다. 이 기능을 구현하는 클래스가 꽤 많아서 처음에 헷갈리지 않도록 여러 강의로 나누었습니다 :) 이전 강의에서는 BufferedReader 와 추상 클래스인 InputStream & OutputStream 및 여러 클래스 자바의 I/O.  클래스 FileInputStream, FileOutputStream, BufferedInputStream - 1에 대해 다루었습니다. 자손. 오늘은 3개의 새로운 클래스인 FileInputStream , FileOutputStreamBufferedInputStream을 살펴보겠습니다 .

FileOutputStream 클래스

FileOutputStream 클래스 의 주요 목적은 파일에 바이트를 쓰는 것입니다. 복잡한 것은 없습니다 :) FileOutputStream은 추상 OutputStream 클래스 의 구현 중 하나입니다 . 생성자에서 이 클래스의 객체는 대상 파일(바이트를 써야 하는 파일)에 대한 경로 또는 클래스의 객체를 사용합니다 File. 두 가지 예를 모두 살펴보겠습니다.
public class Main {

   public static void main(String[] args) throws IOException {


       File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
       FileOutputStream fileOutputStream = new FileOutputStream(file);

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
객체를 생성할 때 File생성자에 객체가 위치해야 하는 경로를 지정했습니다. 미리 생성할 필요는 없습니다. 존재하지 않으면 프로그램이 자동으로 생성합니다. 추가 객체를 생성하지 않고 주소와 함께 문자열을 전달하면 됩니다.
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
두 경우 모두 결과는 동일합니다. 파일을 열어서 확인할 수 있습니다.

Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
그러나 여기에는 한 가지 주의 사항이 있습니다. 위 예제의 코드를 연속해서 여러 번 실행해 본 후 파일을 살펴보고 다음 질문에 답해 보세요. 파일에 몇 줄이 기록되어 있습니까? 딱 하나만. 하지만 코드를 여러 번 실행했습니다. 그러나 매번 데이터를 덮어쓰면서 이전 데이터를 대체한 것으로 나타났습니다. 이에 만족하지 않고 순차적 녹화가 필요한 경우에는 어떻게 하나요? 인사말을 파일에 세 번 연속으로 쓰고 싶다면 어떻게 해야 할까요? 여기에서는 모든 것이 간단합니다. 언어 자체는 각 경우에 어떤 종류의 동작이 필요한지 알 수 없으므로 FileOutputStream추가 매개변수를 생성자에 전달할 수 있습니다 boolean append. 값이 true 이면 데이터가 파일 끝에 기록됩니다. false 인 경우 (기본값은 false ) 이전 데이터가 지워지고 새 데이터가 기록됩니다. 수정된 코드를 세 번 테스트하고 실행해 보겠습니다.
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!\r\n";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
파일 결과:

Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
또 다른 한가지! 입출력 클래스를 사용할 때 이 기능을 염두에 두십시오. 한때는 이전 데이터가 파일에서 어디로 갔는지 이해하기 위해 작업에 몇 시간 동안 앉아 있어야 했습니다. :) 그리고 물론 다른 I/O 클래스의 경우와 마찬가지로 close().

FileInputStream 클래스

클래스는 FileInputStream파일에서 바이트를 읽는 반대 목적을 가지고 있습니다. FileOutputStream상속 과 마찬가지로 OutputStream이 클래스는 추상 클래스에서 파생됩니다 InputStream. 텍스트 " test.txt "에 여러 줄의 텍스트를 작성해 보겠습니다.

«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
자바의 I/O.  클래스 FileInputStream, FileOutputStream, BufferedInputStream - 2 이것은 다음을 사용하여 파일에서 데이터를 읽는 구현입니다 FileInputStream.
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       int i;

       while((i=fileInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
파일에서 1바이트를 읽고, 읽은 바이트를 문자로 변환하여 콘솔에 출력합니다. 콘솔의 결과는 다음과 같습니다.

So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters

BufferedInputStream 클래스

BufferedInputStream이전 강의에서 배운 지식을 바탕으로 이 수업이 왜 필요한지 , 수업에 비해 어떤 이점이 있는지 쉽게 알 수 있을 것 같습니다. FileInputStream:) 우리는 이미 버퍼링된 스트림에 대해 살펴봤으므로 계속 읽기 전에 추측(또는 기억)해 보세요. :) 버퍼링 된 스트림 주로 I/O를 최적화하는 데 필요합니다. 파일 읽기와 같은 데이터 소스에 액세스하는 것은 성능 집약적인 작업입니다. 그리고 매번 1바이트를 읽기 위해 파일에 액세스하는 것은 낭비입니다. 따라서 BufferedInputStream한 번에 1바이트가 아닌 블록 단위로 데이터를 읽어 특수 버퍼에 임시 저장합니다. 이를 통해 파일에 대한 액세스 횟수를 줄여 프로그램 작동을 최적화할 수 있습니다. 그것이 어떻게 보이는지 봅시다:
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
여기서 우리는 객체를 생성했습니다 BufferedInputStream. 이는 객체나 그 후속 객체를 input 으로 받아들이 InputStream므로 이전 객체가 FileInputStream그렇게 합니다. 추가 매개변수로 버퍼 크기(바이트)를 사용합니다. 이제 덕분에 파일에서 한 번에 1바이트가 아니라 한 번에 200개의 데이터를 읽을 수 있습니다! 파일 액세스 횟수가 얼마나 줄어들었는지 상상해 보십시오. FileInputStream성능을 비교하려면 수 메가바이트 크기의 큰 텍스트 파일을 가져와서 및 를 사용하여 이를 읽고 콘솔에 출력하는 데 걸리는 시간을 밀리초 단위로 비교할 수 있습니다 BufferedInputStream. 다음은 두 가지 코드 예입니다.
public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}



public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");


       int i;

       while((i = fileInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}
내 컴퓨터에서 1.5MB 파일을 읽을 때 FileInputStream~3500밀리초 만에 작업을 수행했지만 여기서는 BufferedInputStream~1700밀리초 만에 작업을 수행했습니다. 보시다시피, 버퍼링된 스트림은 프로그램 성능을 2배나 최적화했습니다! :) 앞으로도 계속해서 I/O 수업을 공부하겠습니다. 곧 만나요!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION