[Java][I/O] 표준입출력과 File

2022. 6. 28. 11:54JAVA/Language

1. 표준입출력 - System.in, System.out, System.err

표준입출력은 콘솔(console, 도스창)을 통한 데이터 입력과 콘솔로의 데이터 출력을 의미합니다.

 

자바에서 제공하는 표준 입출력 스트림

  • System.in   : 콘솔로부터 데이터를 입력받는데 사용
  • System.out : 콘솔로 데이터를 출발하는데 사용
  • System.err : 콘솔로 데이터를 출력하는데 사용

표준 입출력 스트림 클래스 타입

  • System.in : InputStream
  • System.out : PrintStream
  • System.err : PrintStream

 

2. 표준입출력의 대상변경 - setOut(), setErr(), setIn()

System.in, System.out, System.err의 입출력 대상은 기본적으로 콘솔화면입니다. 하지만 setOut(), SetErr(), SetIn()을 사용하면 입출력을 콘솔 이외의 다른 입출력 대상(파일 등)으로 변경하는 것이 가능합니다.

메서드 설명
static void setOut(PrintStream out) System.out의 출력을 지정된 PrintStream으로 변경
static void setErr(PrintStream err) System.err의 출력을 지정한 PrintStream으로 변경
static void setIn(InputStream in) System.in의 입력을 지정한 InputStream으로 변경
	@Order(3)
	@Test
	void setOutMethodTest() {
		String filePath = "./src/ch15/ex_12_StandardIO_StandardFile/test.txt";
		try(FileOutputStream fos = new FileOutputStream(filePath);
			PrintStream ps = new PrintStream(fos)) {
			System.setOut(ps);
			
			System.out.println("Hello by System.out");
			System.err.println("Hello by System.err");
		}catch (FileNotFoundException e) {
			System.err.println("File not found.");
		} catch (IOException e1) {
			e1.printStackTrace();
		}		
	}
test.txt 내용
Hello by System.out

 

3. RandomAccessFile

RandomAccessFile 클래스는 하나의 클래스로 파일에 대한 입력과 출력을 모두할 수 있습니다.

 

RandomAccessFile의 상속 계층도

  • RandomAccessFile은 Object 클래스의 자식 클래스
  • RandomAccessFile은 DataInput, DataOutput 인터페이스를 구현함 : 기본자료형을 읽고 쓸수 있음
  • RandomAccessFile은 내부에 파일 포인터를 사용하여 포인터를 이동시켜 읽기 쓰기를 수행할 수 있습니다.

RandomAccessFile의 장점

  • 파일의 어느 위치에나 읽기 / 쓰기가 가능합니다. 다른 입출력 클래스들은 순차적으로 읽기 / 쓰기때문에 제한적입니다.

RandomAccessFile의 생성자 및 메서드

생성자 / 메서드 설명
RandomAccessFile(File file, String mode)
RandomAccessFile(String fileName, String mode)
- 주어진 file에 읽기 또는 읽기와 쓰기를 하기 위한 인스턴스 생성
- mode의 값은 "r", "rw", "rws", "rwd"가 지정 가능함
"r"     : 파일로부터 읽기만을 수행
"rw"  : 파일에 읽기와 쓰기 수행
"rws" : "rw"와 기능은 같으나 출력 내용이 파일에 지연없이 쓰이게 됨
"rwd" : 파일 내용만 지연없이 쓰이게 됨. "rws"는 메타 정보도 포함  

FileChannel getChannel() 파일의 파일 채널을 반환
FileDescriptor getFD() 파일의 파일 디스크립터를 반환
long getFilePointer() 파일 포인터의 위치를 알려줌
long length() 파일의 크기를 반환 (byte 단위)
void seek(long pos) 파일 포인터의 위치를 변경한다. 위치는 파일의 첫 부분부터 pos 크기만큼 떨어진 곳이다. (byte 단위)
void setLength(long newLength) 파일의 크기를 지정된 길이로 변경 (byte 단위)
int skipBytes(int n) 지정된 수만큼의 byte를 건너뜀
	@Order(1)
	@Test
	void filePointMethodTest() {
		printMethodName("filePointMethodTest");
		
		String filePath = "src/ch15/ex_13_RandomAccessFile/test.dat";
		try (RandomAccessFile raf = new RandomAccessFile(filePath, "rw")){
			System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());
			raf.writeInt(100);
			System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());
			raf.writeLong(100L);
			System.out.println("파일 포인터의 위치 : " + raf.getFilePointer());		
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
==========filePointMethodTest==========
파일 포인터의 위치 : 0
파일 포인터의 위치 : 4
파일 포인터의 위치 : 12

 

4. File

File 클래스의 생성자와 경로와 관련된 메서드

생성자 / 메서드 내용
File(String fileName) 주어진 문자열(fileName)을 이름으로 갖는 파일을 위한 File 인스턴스를 생성합니다. 파일 뿐만 아니라 디렉토리도 같은 방법으로 다룹니다.
여기서 fileName은 주로 경로(path)를 포함해서 지정해주지만, 파일 이름만 사용해도 되는데 이 경우 프로그램이 실행되는 위치가 경로(path)로 간주됩니다.
File(String pathName, String fileName)
File(File    pathName, String fileName)
파일의 경로와 이름을 따서 분리해서 지정할 수 있도록 한 생성자, 이 중 두번째 것은 경로를 문자열이 아닌 File 인스턴스인 경우를 위해서 제공된 것입니다.
File(URL uri) 지정된 uri로 파일을 생성
String getName() 파일의 이름을 String으로 반환
String getPath() 파일의 경로(path)를 String으로 반환
String getAbsolutePath()
File getAbsoluteFile()
파일의 절대경로를 String으로 반환
파일의 절대경로를 File로 반환
String getParent()
File getParentFile()
파일의 조상 디렉토리를 String으로 반환
파일의 조상 디렉토리를 File로 반환
String getCanonicalPath()
File getCanonicalFile()
파일의 정규경로를 String으로 반환
파일의 정규경로를 File로 반환

 

경로와 관련된 File 클래스의 멤버변수

멤버변수 설명
static String pathSeparator OS에서 사용하는 경로(path) 구분자. 윈도우=";", 유닉스=":"
static char pathSeparatorChar OS에서 사용하는 경로(path) 구분자. 윈도우=";", 유닉스=":"
static String separator OS에서 사용하는 이름구분자 구분자. 윈도우="\", 유닉스="/"
static char separatorChar OS에서 사용하는 이름구분자 구분자. 윈도우="\", 유닉스="/"
  • 절대 경로(absolute path) : 파일 시스템의 루트로부터 시작하는 파일의 전체 경로를 의미함
    • "C:\jdk1.8\work\ch15\FileEx1.java"의 또다른 절대 경로 "C:\jdk1.8\work\ch15\. \FileEx1.java"
  • 정규 경로(canonical path) : 기호나 링크 등을 포함하지 않은 유일한 경로를 의미함
    • 정규경로는 "C:\jdk1.8\work\ch15\FileEx1.java" 단 하나뿐

File의 메서드

순서
반환타입
메소드 이름
설명
1
boolean
canExecute()
어플리케이션이 해당 파일을 실행할 수 있는지 테스한다.
2
boolean
canRead()
어플리케이션이 해당 파일을 읽을 수 있는지 테스트한다.
3
boolean
canWrite()
어플리케이션이 해당 파일을 변경할 수 있는지 테스트한다.
4
int
compareTo(File pathname)
파일경로를 사전식으로 비교한다.
결과(0 : 일치, 음수 : 파일경로가 사전식으로 작은경우, 양수 : 파일경로가 사전식으로 큰경우)
** 경로는 UNIX 시스템에서 대문자가 중요하다. WIN은 무관하다.
5
boolean
createNewFile()
동일한 이름의 파일이 존재하지 않은 경우, 이 파일의 파일경로를 가지는 파일을 생성한다.
6
static File
createTempFile(String prefix, String suffix)
지정된 임시 파일 디렉토리에 새 빈(empty) 파일을 생성한다. 파라미터 접두사와 접미사를 사용해 그 파일 이름을 생성한다.
7
static File
createTempFile(String prefix, String suffix,File directory)
파라미터 디렉토리에 새 빈(empty) 파일을 생성한다.
파라미터 접두사와 접미사를 사용해 그 파일 이름을 생성한다.
8
boolean
delete()
이 파일의 파일 경로에 파일 또는 디렉토리를 삭제한다.
9
void
deleteOnExit()
이 파일의 파일 경로에 파일 또는 디렉토리를 가상머신 종료 시 삭제요청한다.
10
boolean
equals(Object obj)
이 파일의 파일 경로와 파라미터 객체가 동일한지 여부 확인.
11
boolean
exists()
이 파일의 파일 경로의 파일 또는 디렉토리의 존재 여부 확인.
12
File
getAbsoluteFile()
이 파일의 파일 경로에 절대형을 반환한다.
13
String
getAbsolutePath()
이 파일의 파일 경로 중 절대 경로를 문화열로 반환한다.
14
File
getCanonicalFile()
이 파일의 파일 경로에 정규 형식을 반환한다.
15
String
getCanonicalPath()
이 파일의 파일 경로 중 정규 경로를 문자열로 반환한다.
16
long
getFreeSpace()
이 파일이 속한 파티션 내 미할당 크기(바이트)를 반환한다.
17
String
getName()
이 파일의 파일이름 또는 디렉토리 이름을 반환한다.
18
String
getParent()
이 파일의 파일경로의 부모 경로를 반환한다. 또는 디렉토리 이름이 아닌 경우 NULL.
19
File
getParentFile()
이 파일의 파일 경로의 부모 경로를 반환한다. 또는 NULL
20
String
getPath()
이 파일의 파일 경로를 문자열로 반환한다.
21
long
getTotalSpace()
이 파일이 속한 파티션의 파티션 크기를 반환한다.
22
long
getUsableSpace()
이 파일이 속한 파티션의 사용가능한 바이트 수를 반환한다.
23
int
hashCode()
이 파일의 파일경로를 해시코드로 계산한다.
24
boolean
isAbsolute()
이 파일의 파일경로가 절대인지 여부 확인.
25
boolean
isDirectory()
이 파일의 파일경로가 디렉토리(파일)인지 여부 확인.
26
boolean
isFile()
이 파일의 파일경로가 파일(디렉토리)인지 여부 확인.
27
boolean
isHidden()
이 파일의 숨김 속성인지 여부 확인.
28
long
lastModified()
이 파일의 마지막 변경시각을 반환한다.
29
long
length()
이 파일의 파일 길이를 반환한다.
30
String[]
list()
이 파일의 파일경로에 디렉토리 내 파일 및 디렉토리를 나타내는 캐릭터 라인을 배열로 반환한다.
31
String[]
list(FilenameFilter filter)
지정된 필터를 채우는 파일경로를 나타내는 디렉토리 내 파일 및 디렉토리를 나타내는 캐릭터 라인을 배열로 반환한다.
32
File[]
listFiles()
이 파일의 파일경로에 디렉토리 내 파일의 경로를 반환한다.
33
File[]
listFiles(FileFilter filter)
이 파일의 파일경로에 디렉토리 내 파일과 디렉토리경로를 반환한다.
34
File[]
listFiles(FilenameFilter filter)
이 파일의 파일경로에 디렉토리 내 파일과 디렉토리경로를 반환한다.
35
static File[]
listRoots()
사용가능한 파일 시스템 경로를 반환한다.
36
boolean
mkdir()
이 파일의 파일시스템 경로의 디렉토리를 생성한다.
37
boolean
mkdirs()
이 파일의 파일시스템 경로의(존재하지 않은경우) 부모,하위 디렉토리 포함해 디렉토리를 생성한다.
38
boolean
renameTo(File dest)
이 파일의 파일이름을 수정한다.
39
boolean
setExecutable(boolean executable)
이 파일의 실행 권한에 (소유자) 사용권한을 설정한다.
40
boolean
setExecutable(boolean executable, boolean ownerOnly)
이 파일의 실행 권한에 (소유자, 사용자) 사용권한을 설정한다.
41
boolean
setLastModified(long time)
이 파일의 파일 및 경로 디렉토리의 최종수정시각을 설정한다.
42
boolean
setReadable(boolean readable)
이 파일의 읽기 권한에 (소유자) 사용권한을 설정한다.
43
boolean
setReadable(boolean readable, boolean ownerOnly)
이 파일의 읽기 권한에 (소유자, 사용자) 사용권한을 설정한다.
44
boolean
setReadOnly()
이 파일의 파읽 읽기권한 및 경로의 디렉토리 읽기권한을 읽기만 가능하도록 설정한다.
45
boolean
setWritable(boolean writable)
이 파일의 쓰기 권한에 (소유자) 사용권한을 설정한다.
46
boolean
setWritable(boolean writable, boolean ownerOnly)
이 파일의 쓰기 권한에 (소유자, 사용자) 사용권한을 설정한다.
47
Path
toPath()
파일경로(추상패스)를 java.nio.file.Path 로 반환한다.
48
String
toString()
파일경로(추상패스)를 문자열로 반환환다.
49
URL
toURI()
파일경로(추상패스)를 URI 로 구축하여 반환한다.
50
URL
toURL()
지원되지 않음.
toURI() 사용해 URI 만든 후 URL 로 변경하는 방법을 권장한다.

 

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch15
[도서] Java의 정석, 남궁 성 지음
[java.io.File]File 클래스의 메소드 정리_자주쓰는 API 문서