Language/Summary

I/O

2022. 6. 24. 15:11
728x90
반응형

- Input과 Output은 JVM기준으로 실행된다. 
- java.io 패키지에는 Byte 기반의 데이터를 처리하기위한 Stream(InputStream, OutputStream), char기반의 데이터를 처리하기 위한 Reader, Writer 클래스가 존재한다. 
- JDK 1.4 부터는 NIO의 등장으로 Buffer와 Channel 기반으로 데이터를 처리하기 시작했다. 기존 방식보다 성능이 좋다.

 

ㆍFile

- File 클래스의 객체는 파일, 파일의 경로를 포함할 수 있는 클래스이다.
- java7 에서 NIO2가 도입됨에 따라 java.nio.file 패키지의  Files 클래스에서 File 클래스의 메소드들을 대체하여 사용. File은 객체를 생성하여 처리해야하지만, Files 클래스는 모든 메소드가 static으로 선언되어있어, 객체 생성이 필요없다.

 

- File 클래스의 생성자의 매개변수에는 '보통 파일 경로'가 포함되며 URI(Uniform Resource Identifier, 리소스를 가리키기위한 경로)를 매개변수로 받는 생성자가 하나 존재한다. 
- 경로를 나타내는 문자는 윈도우에서  ' \ ' 기호를 사용한다. 하지만 운영체제별로 이 기호가 상이하므로 File의 static 변수인 separator 를 사용하면 컴파일시 운영체제에 맞게 separator가 변환된다.  

File file1 = new File("C:\\gerthread\\test", "test.txt");
// File.separator 변수 사용
File file2 = new File("C:" + File.separator + "gerthread" +
                     File.separator + "test", "test.txt");

 

- File 클래스에서 File 객체의 상태를 확인할 수 있는 메소드는 다음과 같다. 

File file = new File("C:\\gerthread\\test");

// 파일 객체의 디렉터리가 존재하는지 확인
file.exists();

// 파일 객체의 디렉터리 생성(하위 디렉터리 포함)
file.mkdirs();

// 파일이 디렉터리인지,파일인지, 숨겨져있는지 확인
file.isDirectory();
file.isFile();
file.isHidden();

// 파일의 권한(읽기, 쓰기, 실행)을 확인
file.canRead();
file.canWrite();
file.canExecute();

// 파일이나 경로가 언제 생성되었는지 확인, 리턴값이 long이기 때문에 Date객체로 처리
new Date(file.lastModified());

// 파일이나 경로를 삭제
file.delete();

File file2 = new File("C:\\gerthread\\test", "test.txt");
// 파일을 생성. 파일이 이미 존재할경우 생성하지 않는다.
// createNewFile 메소드는 예외 발생가능성이 있기때문에 예외처리를 필요로한다.
try {
	file2.createNewFile();
} catch(Exception e) {

}

 

 

디렉터리 목록을 확인하기위한 메소드

  • listRoots() : OS에서 사용중인 파일 시스템의 루트 디렉터리 목록을  File 배열로 리턴. (return File[])
  • list() :  현재 디렉터리 하위 목록을 String 배열로 리턴
  • list(FilenameFilter filter) : 현재 디렉터리의 하위 목록들 중, FilenameFilter의 조건에 맞는 목록만 String 배열로 리턴
  • listFiles() : 현재 디렉터리의 하위 목록을 File  배열로 리턴
  • listFiles(FilenameFilter filter) : 현재 디렉터리의 하위 목록들 중 filter 조건에 맞는 목록만 File  배열로 리턴
  • listFiles(FileFilter filter) : 현재 디렉터리의 하위 목록들 중 filter 조건에 맞는 목록만 File  배열로 리턴

- 메소드에 Filter 객체를 매개변수로 넘겨주면 특정 파일만 목록에 추가할 수 있다.
- 클래스를 특정 파일만 추출하는 filter로 사용하기 위해서는 FileFilter 인터페이스나 FilenameFilter 인터페이스를 구현하고 accept 메소드를 구현해주면 된다. (accept 메소드에서 true를 리턴하는 파일만 목록에 포함된다.)

class TXTFileFilter implements FileFilter {
   @Override
   public boolean accept(File dir) {
      if(dir.isFile()) {
         String Name = dir.getName();
         if (name.endsWith(".txt")) return true;
      }
      return false;
   }
}

class TXTFilenameFilter implements FilenameFilter {
   @Override
   public boolean accept(File dir, String name) {
      if(name.endsWith(".txt")) return true;
   
      return false;
   }
}

//////////////////////////////////////////

public void checkList() {
   File file;

   try {
      file = new File("C:\\Nexton");
      File [] fileList = file.listFiles(new TXTFileFilter());
      // File객체 경로에서 .txt로 끝나는 파일만 추출하여 배열에 담음
      
      for (File list : fileList) {
         System.out.println("File name is " + list.getName());
      }
   } catch (Exception e) {
      e.printStackTrace();
   }
}

- FileFilter은 파일 검사식이 들어가, 파일인지 디렉터리인지 확인할 수 있지만 FilenameFilter은 디렉터리와 파일을 구분할 수 없다.
- 하지만, java 7 이상이라면 Files 클래스를 사용하자. 

 

 

ㆍStream

- 어떤 대상의 byte 데이터를 읽을 때는 InputStream, 쓸때는 OutputStream의 자식 클래스를 이용하며, Stream은 보통 네트워크를 처리할 때 많이 사용한다.
- InputStream과 OutputStream은 추상 클래스며 이들을 상속 받는 자식 클래스를 사용한다.
- 이 객체들은 사용한 후 close() 메소드로 항상 닫아주어야 한다. 

 

InputStream
- InputStream의 메소드에는 read()가 있다. read() 메소드에 byte 배열을 넘겨주게되면, 해당 byte 배열에 데이터를 담는다.
- InputStream을 확장한 주요 클래스들은 FileInputStream, FilterInputStream, ObjectInputStream  등이 있다.

 

OutputStream
- OutputStream에는 InputStream과는 다르게 Flushable 인터페이스를 구현하고 있다. Flushable의 인터페이스에는 flush()라는 메소드가 선언되어 있는데, 이 메소드는 버퍼에 쓰려고 대기중인 데이터들을 강제로 저장하는 메소드이다.
- write()라는 메소드의 매개변수로 byte 배열을 넘겨주거나, int 값을 넘겨주면 바이트 값이 스트림에 저장된다. 
- FileOutputStream, FilterOutputStream, ObjectOutputStream 등의 InputStream의 자식클래스와 동일한 기능의 클래스가 존재한다.

 

 

ㆍReader, Writer

- char 기반의 문자열을 처리하기 위한 클래스로, 보통 텍스트 에디터로 쉽게 볼 수 있는 파일들을 처리한다.

 

Reader

Reader 클래스의 계층관계


- read() 메소드로 데이터를 읽을 수 있으며, char 배열이나 CharBuffer 객체를 매개변수로 넘겨주면 해당 배열에 데이터를 저장한다. 
- Reader을 확장한 주요 클래스들에는 BufferedReader, InputStreamReader 등이 있다.

 

Writer

Writer 클래스의 계층관계

- Writer 클래스에서는 write() 메소드를 사용하여 데이터를 저장할 수 있을뿐만아니라, Appendable 인터페이스를 구현하여 append() 메소드를 통해서도 데이터를 추가할 수 있다. 

Writer - Methods

- append 메소드에서 CharSequence 객체를 매개변수로 받는다는 것을 볼 수 있다. 따라서, String, StringBuilder, StringBuffer등의 문자열 관련 대부분의 객체들을 처리할 수 있다.

 

- FileWriter 객체는 생성자로 File 객체나 파일 경로를 매개변수로 받아 생성된다. 
- 기존 Writer 클래스는 write(), append() 등의 데이터 추가 메소드를 사용하면 메소드를 호출할 때마다 파일에 쓰기때문에 비효율적이다. BufferedWriter은 버퍼에 저장할 데이터를 보관해두었다가 버퍼가 차면 데이터를 저장하기때문에 효율적이다.
- BufferedWriter 객체를 생성할 때는 매개변수로 Writer 객체를 필요로한다.

++)
- java.util에 Scanner라는 클래스는 텍스트 기반의 기본 자료형이나 문자열을 처리하기위한 클래스이다.
- 파일 객체를 매개변수로 하여 Scanner 객체를 생성하면 보다 편하게 파일 데이터를 처리할 수 있다.

728x90
반응형
저작자표시 (새창열림)
  1. ㆍFile
  2. ㆍStream
  3. ㆍReader, Writer
'Language/Summary' 카테고리의 다른 글
  • Thread
  • Data Structure#3 - Map, Properties
  • Data Structure#2 - Set, Linked List
  • Data Structure#1 - ArrayList
KAispread
KAispread
개발에 관련된 학습 내용들을 기록하는 공간입니다.
반응형
KAispread
기억의 정류장
KAispread
전체
오늘
어제
  • All (120)
    • Language (27)
      • Java (14)
      • JavaScript (4)
      • Principle (2)
      • Summary (7)
    • Web (10)
      • Template (4)
      • Base (6)
    • Spring (7)
    • Test (7)
    • JPA (23)
      • Spring Data JPA (9)
      • Base (14)
    • AWS (10)
    • DevOps (8)
      • Monitoring (2)
    • Database (10)
    • Algorithm (9)
    • Project (1)
    • Git (1)
    • 생각 정리 (4)
    • IDE (3)
      • eclipse (1)
      • Intellij (2)

블로그 메뉴

  • 🌈 GIthub
  • 🌎 LinkedIn
  • 📝 Notion
  • 🧑🏻‍💻 Resume

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
글쓰기 관리자
KAispread
I/O
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.