본문 바로가기
java-liveStudy

13주차. I/O

by 에드박 2021. 2. 15.

목표

자바의 Input과 Ontput에 대해 학습하세요.

학습할 것 (필수)

  • 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
  • InputStream과 OutputStream
  • Byte와 Character 스트림
  • 표준 스트림 (System.in, System.out, System.err)
  • 파일 읽고 쓰기

개념 정리

  • I/O(입출력) : Input과 Output의 약자로 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고 받는것을 말합니다. (ex. System.out.println()을 이용해서 화면에 출력하는 것)
  • NIO(new I/O) : JDK 1.4 에서 Java I/O의 단점을 보완한 new I/O 

 


I/O vs NIO

Java I/O가 느린 이유

  • OS에서 관리하는 커널 버퍼에 직접 접근이 불가능
  • I/O 프로세스를 거치는 동안 작업을 요청한 쓰레드는 Blocking 됨

자바 I/O 프로세스 과정

  1. Process(JVM)이 파일을 읽기 위해 커널(kernel)에 명령을 전달
  2. 커널은 시스템 콜(read())을 사용
  3. 디스크 컨트롤러가 물리적 디스크로 부터 파일을 읽어옴
  4. DMA(Direct Memory Access)를 이용하여 커널 버퍼로 복사
  5. Process (JVM) 내부 버퍼로 복사

이런 과정에서 다음과 같은 단점이 발생합니다.

  • JVM 내부 버퍼로 복사할 때, CPU 연산이 필요
  • 복사된 내부 버퍼는 작업이 끝난 후 GC 대상
  • 복사가 진행되는 동안 I/O 요청 쓰레드 Blocking

NIO (new I/O)

기존의 Java I/O는 출력 스트림이 1바이트를 쓰면 입력 스트림에서 1바이트를 읽었습니다.(이런 형태는 속도가 느립니다.)

 

NIO는 버퍼를 사용해서 여러개의 바이트를 저장했다가 한번에 출력하는 형태로 사용하여 성능을 높입니다.

기본적으로 버퍼가 지원되며 시스템 메모리를 직접 사용할 수 있는 Buffer 클래스(DirectByteBuffer)가 도입됐습니다.


스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O

 

스트림(Stream)

  • 스트림은 단방향 통신만 가능
  • 하나의 스트림으로 입력과 출력을 동시에 처리하는것이 불가능
  • 입력과 출력을 수행하려면 입력 스트림(input stream), 출력 스트림(output stream) 총 2개의 스트림이 필요
  • 먼저 보낸 데이터를 먼저 받게 되어있는 선입선출(FIFO)구조

버퍼(Buffer)

  • 기존의 자바 I/O는 1바이트를 쓰면 1바이트를 읽는 구조이기 때문에 느림
  • NIO에서는 버퍼를 사용해서 여러개의 바이트를 저장했다가 한번에 출력하는 형태로 사용(성능 향상)
  • NIO는 기본적으로 버퍼를 지원
  • 채널은 이 버퍼를 통해 데이터를 읽고 쓰기를 함

채널(Channel)

  • 단방향 통신이던 스트림의 향상된 버전
  • 데이터가 통과하는 쌍방향 통로로, 데이터를 주고받을 때 항상 버퍼를 사용함
  • 채널은 비동기적으로 읽기/쓰기가 가능
  • OS 레벨에서 지원하는 Scatter/Gather 기술 구현 (시스템 콜 수 줄이기)
    • 시스템 호출(시스템 콜)을 할 때 여러개의 메모리 버퍼를 지정할 수 있는 방식
    • 시스템 콜의 부담을 줄여줌

셀렉터(Selector)

  • 하나의 쓰레드에서 다수의 채널을 처리할 수 있는 기술 입니다.
    • 기존에는 클라이언트 하나당 쓰레드 하나를 생성해서 처리함
    • 사용자가 늘어나면 쓰레드가 많이 생성됨으로 인해 급격한 성능 저하를 가져옴
    • 이런 단점을 개선한것이 셀렉터

InputStream과 OutputStream

모든 바이트기반 스트림의 최상위 클래스이며 추상클래스(absract class) 입니다.

 

InputStream에는 다음과 같은 메서드가 선언되어 있습니다.

메서드명 설 명
int available() 스트림으로부터 Blocking없이 읽어 올 수 있는 데이터의 크기를 반환합니다.
void close() 스트림을 닫음으로써 사용하고 있던 자원을 반환합니다.
void mark(int readlimit) 현재위치를 표시해 놓습니다. 후에 reset()에 의해서 표시해놓은 위치로 다시 돌아갈 수 있습니다. readlimit은 되돌아갈 수 있는 byte의 수입니다.
boolean markSupported() 이 입력 스트림이 mark()와 reset()을 지원하는지를 알려줍니다. mark()와 reset()기능을 지원하는것은 선택적이므로, mark()와 reset()을 사용하기 전에 markSupported()를 호출해서 지원여부를 확인해야합니다.
abstract int read() 1byte를 읽어옵니다(0~255사이의 값). 더 이상 읽어올 데이터가 없으면 -1을 반환합니다. abstract메서드라서 InputStream의 자손들은 자신의 상황에 맞게 구현해야합니다.
int read(byte[] b) 배열 b의 크기만큼 읽어서 배열을 채우고 읽어온 데이터의 수를 반환합니다. 반환하는 값은 항상 배열의 크기보다 작거나 같습니다.
int read(byte[] b, int off, int len) 최대 len개의 byte를 읽어서, 배열 b의 지정된 위치(off)부터 저장한다. 실제로 읽어 올 수 있는 데이터가 len개보다 적을 수 있다.
void reset() 스트림에서의 위치를 마지막으로 mark()이 호출되었던 위치로 되돌린다.
long skip(long n) 스트림에서 주어진 길이(n)만큼을 건너뛴다.

스트림의 종류에 따라서 mark()와 reset()을 사용하여 이미 읽은 데이터를 되돌려서 다시 읽을 수 있습니다. 이 기능을 지원하는 스트림인지 확인하는 markSupported()를 통해서 알 수 있습니다. 

 

 

OutputStream 에는 다음과 같은 메서드가 선언되어 있습니다.

메서드명 설 명
void close() 입력소스를 닫음으로써 사용하고 있던 자원을 반환합니다.
void flush() 스트림의 버퍼에 있는 모든 내용을 출력소스에 씁니다.
abstract void write(int b) 주어진 값을 출력소스에 씁니다.
void write(byte[] b) 주어진 배열 b에 저장된 모든 내용을 출력소스에 씁니다.
void write(byte[] b, int off, int ren) 주어진 배열 b에 저장된 내용 중에서 off번째부터 len개 만큼만을 읽어서 출력소스에 씁니다.

 

flush()는 버퍼가 있는 출력스트림의 경우에만 의미가 있으며, OutputStream에 정의된 flush()는 아무런 일도 하지 않습니다.

 

프로그램이 종료될 때, 사용하고 닫지 않은 스트림을 JVM이 자동적으로 닫아주지만, 스트림을 사용해서 모든 작업을 마치고 난 후에는 close()를 호출해서 반드시 닫아 주어야함.

ByteArrayInputStream 처럼 메모리를 사용하는 스트림과 System.in, System.out과 같은 표준 입출력 스트림은 닫아 주지 않아도 됩니다.

보조스트림

 

스트림의 기능을 보완하기 위해 제공되는 스트림

  • 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없습니다.
  • 보조스트림만으로는 입출력이 불가능하고, 스트림을 먼저 생성한 다음에 이것을 이용해서 보조스트림을 생성합니다.
// 기반 스트림 생성
FileInputStream fis = new FileInputStream("test.txt");

// 기반 스트림을 이용해서 보조스트림을 생성한다.
BufferedInputStream bis = new BufferedInputStream(fis);

bis.read(); // 보조스트림인 BufferedInputStream으로부터 데이터를 읽는다.

 

위의 코드에서 BufferedInputStream이 입력기능을 수행하는 것처럼 보이지만, 실제 입력기능은 BufferedInputStream과 연결된 FileInputStream이 수행하고, 보조스트림인 BufferedInputStream은 버퍼만을 제공합니다.

 

입력 출력 설명
FilterInputStream FilterOutputStream 필터를 이용한 입출력 처리
BufferedInputStream BufferedOutputStream 버퍼를 이용한 입출력 성능 향상
DataInputStream DataOutputStream int, float과 같은 기본형 단위(primitive type)로 데이터를 처리하는 기능
SequenceInputStream 없음 두 개의 스트림을 하나로 연결
LineNumberInputStream 없음 읽어 온 데이터의 라인 번호를 카운트(JDK1.1 부터 LineNumberReader로 대체)
ObjectInputStream ObjectOutputStream 데이터를 객체단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화와 관련있음
없음 PrintStream 버퍼를 이용하며, 추가적인 print관련 기능(print,printf,println메서드)
PushbackInputStream 없음 버퍼를 이용해서 읽어 온 데이터를 다시 되돌리는 기능(unread,push back to buffer)

Byte 기반의 스트림

모두 InputStream, OutputStream의 자손들이며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있습니다.

입력 스트림 출력 스트림 입출력 대상의 종류
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리(byte배열)
PipedInputStream PipedOutputStream 프로세스(프로세스간의 통신)
AudioInputStream AudioOutputStream 오디오 장치

 

각각의 입출력 스트림은 읽고 쓰는데 필요한 추상 메서드[read(), write()]를 자신에 맞게 구현해 놓았습니다.

-> 이 말은 다른 뜻으로 read() 와 write() 메서드를 구현하지 않으면 읽고 쓰는것이 불가능합니다.

 

이처럼 입출력을 처리할 수 있는 표준화된 방법을 제공함으로써 입출력의 대상이 달라져도 동일한 방법으로 입출력이 가능하기 때문에 프로그래밍을 하기에 편리합니다.

 

ByteArrayInputStream과 ByteArrayOutputStream

메모리, 즉 바이트 배열에 데이터를 입출력하는데 사용되는 스트림입니다.

주로 다른곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업을 하는데 사용합니다.

 

바이트 배열은 사용하는 자원이 메모리 밖에 없으므로 가비지 컬렉터에 의해 자동적으로 자원이 반환됩니다. 따라서  close()를 이용해서 스트림을 닫지 않아도 됩니다.

 

아래는 바이트 배열 스트림을 이용한 inSrc의 데이터를 outSrc로 복사하는 예제입니다.

package study13th;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;

public class ByteArrayStreamExample {
    public static void main(String[] args) {
        byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        byte[] outSrc;

        ByteArrayInputStream inputStream = new ByteArrayInputStream(inSrc);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        int data;

        while ((data = inputStream.read()) != -1) {
            outputStream.write(data);
        }
        outSrc = outputStream.toByteArray();

        System.out.println("Input Source  : " + Arrays.toString(inSrc));
        System.out.println("Output Source : " + Arrays.toString(outSrc));
    }
}

실행 결과

 

FileInputStream과 FileOutputStream

 

파일을 입출력 하기위한 스트림입니다. 

 

생성자 설 명
FileInputStream(String name) 지정된 파일 이름(name)을 가진 실제 파일과 연결된 FileInputStream을 생성한다.
FileInputStream(File file) 파일의 이름이 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileInputStream(String name)과 같다.
FileInputStream(FileDescriptor fdObj) 파일 스크립터(fdObj)로 FileInputStream을 생성한다.
FileOutputStream(String name) 지정된 파일이름(name)을 가진 실제 파일과의 연결된 FileOutputStream을 생성한다.
FileOutputStream(String name, boolean append) 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileOutputStream을 생성한다. 두번째 인자인 append를 true로 하면, 출력 시 기존의 파일내용의 마지막에 덧붙인다. false면, 기존의 파일내용을 덮어쓰게 된다.
FileOutputStream(File file) 파일의 이름을 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileOutputStream(String name)과 같다.
FileOutputStream(File file, boolean append) 파일의 이름을 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileOutputStream(String name, boolean append)과 같다.
FileOutputStream(FileDescriptor fdObj) 파일 디스크립터(fdObj)로 FileOutputStream을 생성한다.

 

아래의 코드는 FileInputStream과 FileOutputStream을 사용해서 FileExample.java 파일의 내용을 그대로 FileExample.bak로 복사하는 코드 입니다.

package study13th;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("src/main/java/study13th/FileExample.java");
            FileOutputStream fos = new FileOutputStream("src/main/java/study13th/FileExample.bak");
            int data;
            while ((data = fis.read()) != -1) {
                fos.write(data);
            }
            fis.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

read()가 int형(4byte)를 반환하는 이유는 한번에 1byte씩 데이터를 읽어들이긴 하지만 데이터의 범위가 십진수로 0~255범위의 정수값이고, 읽을 수 있는 입력값이 더이상 없음을 알리는 값(-1)도 필요합니다. 그래서 다소 크긴 하지만 정수형 중에서는 연산이 가장 효율적이고 빠른 int형 값을 반환하도록 한 것입니다.


Character 기반의 스트림

 

문자 데이터를 다루는데 사용된다는 것을 제외하고는 바이트기반 스트림과 문자기반 스트림의 사용방법은 거의 같습니다. 

 

Reader와 Writer

모든 문자 기반 스트림의 최상위 클래스로 추상클래스 입니다.

 

아래는 Reader와 Writer의 메서드들입니다. byte배열 대신 char배열을 사용한다는 것 외에는 InputStream과 OutputStream의 메서드와 거의 비슷합니다.

 

Reader 메서드

메서드 설명
abstract void close() 입력스트림을 닫음으로써 사용하고 있던 자원을 반환합니다.
void mark(int readlimit) 현재위치를 표시해놓습니다. 후에 reset()에 의해서 표시해놓은 위치로 다시 돌아갈 수 있습니다.
boolean markSupported() mark()와 reset()을 지원하는지 알려줍니다.
int read() 입력소스로부터 하나의 문자를 읽어옵니다. char의 범위인 0~65535범위의 정수를 반환하며, 입력스트림의 마지막 데이터에 도달하면, -1을 반환합니다.
int read(char[] c) 입력소스로부터 매개변수로 주어진 배열 c의 크기많큼 읽어서 배열 c에 저장합니다. 읽어 온 데이터의 개수 또는 -1을 반환합니다.
abstract int read(char[] c, int off, int len) 입력소스로부터 최대 len개의 문자를 읽어서, 배열 c의 지정된 위치(off)부터 읽은만큼 저장합니다. 읽어 온 데이터의 개수 또는 -1을 반환합니다.
int read(CharBuffer target) 입력소스로부터 읽어서 문자버퍼(target)에 저장합니다.
boolean ready() 입력소스로부터 데이터를 읽을 준비가 되어있는지 알려줍니다.
void reset() 입력소스에서의 위치를 마지막으로 mark()가 호출되었던 위치로 되돌립니다.
long skip(long n) 현재 위치에서 주어진 문자 수(n)만큼을 건너뜁니다.

 

Writer메서드

메서드 설명
Writer append(char c) 지정된 문자를 출력소스에 출력합니다.
Writer append(CharSequence c) 지정된 문자열(CharSequence)을 출력소스에 출력합니다.
Writer append(CharSequence c, int start, int end) 지정된 문자열(CharSequence)의 일부를 출력소스에 출력(CharBuffer, String, StringBuffer가 CharSequence를 구현합니다.
abstract void close() 출력스트림을 닫음으로써 사용하고 있던 자원을 반환합니다.
abstract void flush() 스트림의 버퍼에 있는 모든 내용을 출력소스에 씁니다.(버퍼가 있는 스트림에만 해당)
void write(int b) 주어진 값을 출력소스에 씁니다.
void write(char[] c) 주어진 배열 c에 저장된 모든 내용을 출력소스에 씁니다.
abstract void write(char[] c, int off, int len) 주어진 배열 c에 저장된 내용 중에서 off번째부터 len길이만큼만 출력소스에 씁니다.
void write(String str) 주어진 문자열(str)을 출력소스에 씁니다.
void write(String str, int off, int len) 주어진 문자열(str)의 일부를 출력소스에 씁니다. (off번째 문자부터 len개 만큼의 문자열)

 

문자기반 스트림이란것은 단순히 2byte로 스트림을 처리하는것 외에 문자 데이터를 다루는데 인코딩 정보를 필요로 합니다. 

 

다양한 문자기반 스트림

  • FileReader와 FileWriter : 파일로 부터 텍스트 데이터를 읽고, 파일을 쓰는데 사용됩니다.
  • PipedReader와 PipedWriter : 쓰레드 간에 데이터를 주고받을 때 사용됩니다.
    • 입력과 출력스트림을 하나의 스트림으로 연결(connect)해서 데이터를 주고받는다는 특징이있음
  • StringReader와 StringWriter : CharArrayReader/CharArrayWriter와 같이 입출력 대상이 메모리인 스트림입니다.
    • StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장됩니다.

표준 스트림 ( System.in / System.out / System.err )

 

표준 스트림은 콘솔을 통한 데이터 입력과 콘솔로의 데이터 출력을 의미합니다.

 

자바에서는 표준 스트림을 위해 3가지 입출력 스트림을 제공합니다.

  • System.in - 콘솔로부터 데이터를 입력받는데 사용 (InputStream)
  • System.out - 콘솔로 데이터를 출력하는데 사용 (PrintStream)
  • System.err - 콘솔로 데이터를 출력하는데 사용 (PrintStream)

이 3가지 입출력 스트림은 자바 애플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 개발자가 별도로 스트림을 생성하는 코드를 작성하지 않고도 사용이 가능합니다.

 

System클래스의 소스를 보면 out, err, in 타입은 InputStream과 PrintStream입니다.

 

하지만 실제로 사용하는 부분을 보면 BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용합니다.

 

 

표준입출력 대상 변경 ( setOut() / setErr() / setIn() )

System.in / System.out / System.err의 입출력 대상은 콘솔화면이지만, setIn() / setOut() / setErr()을 사용하면 입출력을 콘솔 이외에 다른 입출력 대상으로 변경하는 것이 가능합니다.

 

메서드 설명
static void setOut(PrintStream out) System.out의 출력을 지정된 printStream으로 변경
static void setErr(PrintStream err) System.err의 출력을 지정한 PrintStream으로 변경
static void setIn(InputStream in) System.in의 입력을 지정한 InputStream으로 변경

 

아래의 코드는 System.out의 출력 소스를 test.txt 파일로 변경하였기 때문에 System.out을 이용한 출력은 모두 test.txt파일로 저장됩니다.

package study13th;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Example {
    public static void main(String[] args) {
        PrintStream ps;
        FileOutputStream fos;
        
        try {
            fos = new FileOutputStream("test.txt");
            ps = new PrintStream(fos);
            System.setOut(ps);
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

 


파일 읽고 쓰기

자바에서는 File클래스를 통해서 파일과 디렉토리를 다룰 수 있도록 하고있습니다. 그래서 File인스턴스는 파일일 수도 있고 디렉토리 일 수도 있습니다.

 

File 클래스의 생성자

  • File(String fileName)
    • 주어진 문자열(fileName)을 이름으로 갖는 파일을 위한 File인스턴스를 생성
    • 파일 뿐만 아니라 디렉토리도 같은 방법으로 다룹니다.
    • fileName은 주로 경로(path)를 포함해서 지정해주지만, 파일 이름만 사용해도 됩니다.
    • 이 경우 프로그램이 실행되는 위치가 경로(path)로 간주됩니다.
  • File(String pathName, String fileName) / File(File pathName, String fileName)
    • 파일의 경로와 이름을 따로 분리해서 지정할 수 있도록 한 생성자입니다.
    • 두번째(오른쪽)것은 경로를 문자열이 아닌 File인스턴스인 경우를 위해서 제공된 생성자입니다.
  • File(URI uri)
    • 지정된 uri로 파일을 생성

경로에 관련된 메서드

  • String getName() : 파일 이름을 String으로 반환
  • String getPath() : 파일의 경로(path)를 String으로 반환
  • String getAbsolutePath() : 파일의 절대경로를 String으로 반환
  • File getAbsolutePathj() : 파일의 절대경로를 File로 반환
  • String getParent() : 파일의 조상 디렉토리를 String으로 반환
  • File getParentFile() : 파일의 조상 디렉토리를 File로 반환
  • String getCanonicalPath() : 파일의 정규경로를 String으로 반환
  • File getCanonicalFile() : 파일의 정규경로를 File로 반환
절대경로(absolute path) : 파일시스템의 루트(root)로부터 시작하는 파일의 전체 경로
정규경로(canonical path) : 기호나 링크 등을 포함하지 않는 유일한 경로

경로와 관련된 File 멤버변수

  • static String pathSeparator : OS에서 사용하는 경로(path)구분자. ( 윈도우 ";" / 유닉스 ":" )
  • static char pathSeparatorChar : OS에서 사용하는 경로(path) 구분자.
  • static String separator : OS에서 사용하는 이름 구분자. ( 윈도우 "\", 유닉스 "/" )
  • static char separatorChar : OS에서 사용하는 이름 구분자

그 외 File의 메서드

 

 

메서드 설명
boolean canRead() 읽을 수 있는 파일인지 검사
boolean canWrite() 쓸수 있는 파일인지 검사
boolean canExecute() 실행할 수 있는 파일인지 검사
int compareTo(File pathname) 지정된 파일(pathname)과 비교
boolean exists() 파일이 존재하는지 검사
boolean isAbsolute() 파일 또는 디렉토리가 절대경로명으로 지정되었는지 확인
boolean isDirectory() 디렉토리인지 확인
boolean isFile() 파일인지 확인
boolean isHidden() 파일의 속성이 '숨김(hidden)'인지 확인
또한 파일이 존재하지 않으면 false를 반환
int compareTo(File pathname) 주어진 파일 또는 디렉토리를 비교합니다. 같으면 0을 반환, 다르면 1 또는 -1 반환(Unix시스템에서는 대소문자를 구별하며, Windows에서는 구별하지 않습니다.)
boolean createNewFile() 아무런 내용이 없는 새로운 파일을 생성합니다.(단, 생성하려는 파일이 이미 존재하면 생성되지 않습니다.)
static File createTempFile(String prefix, String suffix) 임시파일을 시스템의 임시 디렉토리에 생성합니다.
static File createTempFile(String prefix, String suffix, File directory) 임시파일을 시스템의 지정된 디렉토리에 생성합니다.
boolean delete() 파일을 삭제합니다. 
void deleteOnExit() 응용 프로그램 종료시 파일을 삭제합니다. 주로 실행 시 작업에 사용된 임시파일을 삭제하는데 사용됩니다.
boolean equals(Object obj) 주어진 객체(주로 File 인스턴스)가 같은 파일인지 비교
long lastModified() 파일의 마지막으로 수정된 시간을 반환
long length() 파일의 크기를 반환
String[] list 디렉토리의 파일목록(디렉토리 포함)을 String배열로 반환
String[] list(FilenameFilter filter)
File[]    list(FilenameFilter filter)
FilenameFilter인스턴스에 구현된 조건에 맞는 파일을 String배열(File배열)로 반환
File[] listFiles()
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter f)
디렉토리 파일목록(디렉토리 포함)을 File배열로 반환(filter가 지정된 경우에는 filter의 조건과 일치하는 파일만 반환
static File[] listRoots()
long getFreeSpace()
long getTotalSpace()
long getUsableSpace()
컴퓨터의 파일시스템의 root의 목록을 반환
get으로 시작하는 메서드들은 File이 root일 때, 비어있는 공간, 전체 공간, 사용가능한 공간을 바이트 단위로 반환
boolean mkdir()
boolean mkdirs()
파일에 지정된 경로로 디렉토리(폴더)를 생성. 성공하면 true반환
mkdirs는 필요하면 부모디렉토리까지 생성
boolean renameTo(File dest) 지정된 파일(dest)로 이름을 변경
boolean setExecutable(boolean executable) 파일의 속성을 변경합니다.
boolean setExecutable(boolean executable, boolean ownerOnly) 파일의 속성을 변경합니다. ownerOnly 매개변수가 true면, 파일의 소유자만 해당 속성을 변경할 수 있습니다.
boolean setReadable(boolean readable) 파일의 속성을 변경합니다.
boolean setReadable(boolean readable, boolean ownerOnly) 파일의 속성을 변경합니다. ownerOnly 매개변수가 true면, 파일의 소유자만 해당 속성을 변경할 수 있습니다.
boolean setReadOnly() 파일의 속성을 변경합니다.
boolean setWritable(boolean writable) 파일의 속성을 변경합니다.
boolean setWritable(boolean writable, boolean ownerOnly) 파일의 속성을 변경합니다. ownerOnly 매개변수가 true면, 파일의 소유자만 해당 속성을 변경할 수 있습니다.
boolean setLastModified(long t) 파일의 마지막으로 수정된 시간을 지정된 시간(t)으로 변경
Path toPath() 파일을 path 로 변환해서 반환
URI toURI() 파일을 URI로 변환해서 반환

 


참고 문헌

- 자바의 정석 3판

- ohjongsung.io/2019/09/07/java-nio-%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0

- jeong-pro.tistory.com/145

-

-

-

 

'java-liveStudy' 카테고리의 다른 글

15주차. 람다식  (0) 2021.03.05
14주차. 제네릭  (1) 2021.03.01
12주차. 애너테이션  (0) 2021.01.31
11주차. Enum  (0) 2021.01.24
10주차 과제. 멀티쓰레드 프로그래밍  (0) 2021.01.17

댓글