자바의 많은 파일 스트림 클래스의 최고는 뭘까요?

2014-02-07 22:11

제가 알기로는 자바에서 파일 입출력 등을 위해 스트림을 여는 클래스들이 아주 많은 것으로 알고 있습니다. 일례로 텍스트 파일에 어떤 내용을 읽고 쓰는 방법만 해도 자바에서는 여러가지 방법이 있는 걸로 알고 있는데요. 경우에 맞게 최적의 클래스를 골라서 쓸 수 있으면 그것이 제일 베스트겠지만 그래도 그 중에 제일 좋은 클래스를 하나 꼽으신다면 어떤 것이 있을까요? 추천 이유도 밝혀주시면 공부에 많은 도움이 될 듯 합니다.

3개의 의견 from SLiPP

2014-02-07 23:20

파일 입출력을 담당하는 기본 클래스는 FileInputStream/FileOutputStream(이미지 파일과 같은 바이트 파일 처리), FileReader/FileWriter는 Character 단위로 파일 입출력.

이 기본 클래스가 파일에 대한 입출력을 담당하고, 그 이외 부가적인 기능을 추가하고 싶으면 다양한 입출력 API를 활용하면 된다.

Java IO는 Decorator Pattern 기반으로 구현되어 있다. http://stackoverflow.com/questions/6366385/decorator-pattern-for-io 문서 참고해 봐라. Decorator Pattern을 이해하면 Java IO 이해하는데 많은 도움이 될 거야. Java IO 관련 클래스는 많지만 Decorator Pattern을 이해하면 전체적으로 대략적인 구조를 이해할 수 있을거야. Decorator Pattern을 이해하기 위해 Java IO 소스 코드를 읽어 보는 것도 추천한다.

2014-02-08 00:17

@자바지기 String 처리를 할때는 어떤가요? 제가 보고있는 서적에서는 지금 FileInputStream에서 바이트로 읽어와 String을 만드는데요.. FileReader도 Character 단위로 처리되면 결국 같은 String 변환이 가능해질 것 같은데.. 전에 두 클래스의 차이를 수업때 살펴본것 같긴 한데 효율까지 살펴보았나는 기억이 가물가물하네요..

2014-02-08 11:15

@김민혁 나도 둘 사이의 효율성을 따지라면 뭐가 더 좋을지 성능 테스트를 해보지 않아서 모르겠다. 네가 직접 테스트해보고 눈으로 확인해 보면 좋겠다. 나라면 다음과 같은 부분에 의문을 가지고 하나씩 접근해 보겠다.

  • FileInputStream을 활용해 Character로 변환하는 부분과 FileReader에서 Character로 변환하는 부분에 차이가 있는가? 즉, String에서 byte[]을 활용해 변환하는 부분이 있을테고, FileReader의 경우도 byte[]을 받아 char[]로 변환하는 부분이 있지 않을까?
  • 어차피 모든 데이터는 byte로 저장되기 때문에 FileInputStream만 있어도 될 듯 한데 왜 FileReader를 만들었을까? byte[]을 활용해 String으로 변환하는 것도 가능한데.
  • 파일을 복사, 이동하는 경우 FileInputStream/FileOutputStream을 활용하는 것과 FileReader/FileWriter를 사용하는 것에 차이점이 있을까? 있다면 뭘까? 성능 차이는 있을까?
  • 위 질문에서 성능차이가 있다면 파일 복사, 이동의 경우에는 어떤 Stream을 사용하는 것이 좋을까? 아니면 어느 것을 사용해도 괜찮을까?
  • FileInputStream/FileOutputStream과 FileReader/FileWriter 사이의 성능 차이는 어떻게 테스트할 수 있을까?
  • Stream은 무한히 연결되어 있는 배열과 비슷한 구조라 생각하는데 도대체 어떤 방식으로 동작하는 것일까? 내가 구현한다면 어떻게 구현할까? Stream이 필요한 경우는 언제일까?
  • 자바는 JVM 상에서 동작한다고 하는데 하드디스크에 있는 파일 데이터를 어떻게 처리할까? 파일 데이터를 직접 접근하는 구조일까? JVM이 중간 다리 역할을 하는 것일까?

위 질문 이외에도 꼬리에 꼬리는 무는 질문들이 계속 나올 수 있을 듯하다. 너만의 해결 방식을 찾아 해결해 나가면서 Stream에 대해 더 깊이 있게 이해하면 좋겠다. 단순히 가장 효율적인 소스 코드를 얻기 보다는 더 깊이 있게 파고 들다보면 네가 생각하는 가장 효율적인 방법을 찾아낼 수 있지 않을까 생각한다.

학습하는 과정에서 해소되는 질문들이 있다면 다른 이들에게 공유까지 해준다면 더 없이 좋겠다.

의견 추가하기

연관태그

← 목록으로