본문 바로가기
Java

자바 입출력 관련 API

by 승환파크 2023. 6. 30.

콘솔은 시스템을 사용하기 위해 키보드로 입력을 받고 모니터로 출력하는 소프트웨어를 말한다. 유닉스나 리눅스 운영체제는 터미널에 해당하고, 윈도우 운영체제는 명령 프롬포트에 해당한다. 이클립스도 Console 뷰가 있는데, 키보드로 직접 입력받고 내용을 출력한다. 자바는 콘솔로부터 데이터르 입력받을 때 System.in을 사용하고, 콘솔에 데이터를 출력할 때 System.out 을 사용한다. 그리고 에러를 출력할 때에는 System.err를 사용한다.

 

 

System.in 필드

자바는 콘솔에서 키보드의 데이털르 입력받을 수 있도록 System 클래스의 in 정적 필드를 제공한다. System.in은 InputStream 타입의 필드이므로 다음과 같이 InputStream 변수로 참조가 가능하다.

InputStream is = System.in;

 

키보드로부터 어떤 키가 입력되었는지 확인하려면 InputStream의 read() 메소드로 1byte를 읽으면 된다. 리턴된 int 값에는 해당 키의 코드가 저장되어 있다.

int keyCode = is.read();

 

Enter키가 입력되고 나서 라인 단위로 전체 문자열을 읽는 방법의 예제이다.

InputStream is = System.in;
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);

먼저 InputStreamReader 보조 스트림을 연결해서 Reader로 변환한다. 그리고 라인 단위로 읽기위해 BufferedReader 보조 스트림을 추가로 연결한다. 그러면 아래와 같이 readLine() 메소드로 입력된 라인을 읽을 수 있다.

String lineStr = br.readLine();

 

 

System.out 필드

콘솔에서 키보드로 입력된 데이터를 System.in 으로 읽었다면, 반대로 콘솔에서 모니터로 데이터를 출력하기 위해서는 System 클래스의 out 정적 필드를 사용한다. System.out은 PrintStream 타입의 필드이다. 따라서 PrintStream이 제공하는 print(), println(), printf() 와 같은 메소드를 이용해서 모니터로 출력할 수 있다.

 

 

Scanner 클래스

Scanner 클래스는 입출력 스트림도 아니고, 보조 스트림도 아니다. Scanner는 문자 파일이나 바이트 기반 입력 스트림에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 java.util 패키지에서 제공하는 클래스이다. System.in 필드에서 보았듯이 라인 단위로 읽기 위해 여러 가지 보조 스트림을 연결하는 작업이 필요했다. 하지만 Scanner는 이러한 보조 스트림 없이 매우 쉽게 라인 단위 문자열을 읽기 위해 nextLine() 메소드를 제공한다.

 

 

File 클래스

java.io 패키지에서 제공하는 File 클래스는 파일 및 폴더(디렉토리) 정보를 제공해주는 역할을 한다. FIle 클래스로부터 File 객체를 생성하려면 문자열 경로를 아래와 같이 제공해야 한다.

File file = nwe File("C:/Temp/file.txt");
File file = nwe File("C:\\Temp\\file.txt");

 

경로 구분자는 운영체제마다 조금씩 다르다. 윈도우에서는 \ 또는 /를 둘 다 사용할 수 있고, 유닉스나 리눅스에서는 / 를 사용한다. 만약 윈도우에서 \ 를 경로 구분자로 사용하고 싶다면 이스케이프 문자(\\)로 기술해야 한다.

 

File 객체를 생성했다고 해서 파일이나 폴더가 생성되는 것은 아니다. 그리고 제공되는 문자열 경로에 실제 파일이나 폴더가 없더라도 예외가 발생하지 않는다. 해당 경로에 실제로 파일이나 폴더가 있는지 확인하고 싶다면 File 객체를 생성하고 나서 아래와 같이 exists() 메소드를 호출해보면 된다. 파일이나 폴더가 존재한다면 true를 리턴하고 그렇지 않으면 false를 리턴한다.

boolean isExist = file.exists();

 

exists() 메소드의 리턴값이 false일 때 아래 메소드로 파일 또는 폴더를 생성할 수 있다.

리턴 타입 메소드 설명
boolean createNewFile() 새로운 파일을 생성한다.
boolean mkdir() 새로운 폴더를 생성한다.
boolean mkdirs() 경로상에 없는 모든 폴더를 생성한다.

 

exists() 메소드의 리턴값이 true 라면 아래 메소드를 사용할 수 있다.

리턴 타입 메소드 설명
boolean delete() 파일 또는 폴더를 삭제한다.
boolean canExecute() 실행할 수 있는 파일인지 여부를 확인한다.
boolean canRead() 읽을 수 있는 파일인지 여부를 확인한다.
boolean canWrite() 수정 및 저장할 수 있는 파일인지 여부를 확인한다.
String getName() 파일의 이름을 리턴한다.
String getParnet() 부모 폴더를 리턴한다.
FIle getParentFile() 부모 폴더를 File 객체로 생성 후 리턴한다.
String getPath() 전체 경로를 리턴한다.
boolean isDirectory() 폴더인지 여부를 확인한다.
boolean isFile() 파일인지 여부를 확인한다.
boolean isHidden() 숨김 파일인지 여부를 확인한다.
long lastModified() 마지막 수정 날짜 및 시간을 리턴한다.
long length() 파일의 크기를 리턴한다.
String[] list() 폴더에 포함된 파일 및 서브 폴더 목록 전부를 String 배열로 리턴한다.
String[] list(FilenameFilter filter) 폴더에 포함된 파일 및 서브 폴더 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴한다.
File[] listFiles() 폴더에 포함된 파일 및 서브 폴더 목록을 전부를 File 배열로 리턴한다.
File[] listFiles(FilenameFilter filter) 폴더에 포함된 파일 및 서브 폴더 목록 중에 FIlenameFilter에 맞는 것만 File 배열로 리턴한다.

 

파일 또는 폴더의 정보를 얻기 위해 File 객체를 단독으로 사용할 수 있지만, 파일 입출력 스트림(FileInputStream, FileOutputStream, FileReader, FileWriter) 객체를 생성할 때 경로 정보를 제공할 목적으로 사용한다. 이들 스트림 생성자에 문자열 경로 대신에 아래와 같이 File 객체를 대입할 수 있다.

// 첫 번째 방법
FileInputStream fis = new FileInputStream("C:/Temp/image.gif");

// 두 번째 방법
File file = new FIle("C:/Temp/image.gif");
FileInputStream fis = new FileInputStream(file);

'Java' 카테고리의 다른 글

자바 보조 스트림  (0) 2023.06.30
자바 입출력 스트림  (0) 2023.06.29
자바 LIFO와 FIFO 컬렉션  (0) 2023.06.29
자바 컬렉션 프레임워크  (0) 2023.06.29
자바 스레드 제어  (0) 2023.06.29