[Java][I/O] 표준입출력과 File
2022. 6. 28. 11:54ㆍJAVA/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 문서
'JAVA > Language' 카테고리의 다른 글
[Java][Thread] 프로세스와 쓰레드 (0) | 2022.06.28 |
---|---|
[Java][I/O] 직렬화(Serialization) (0) | 2022.06.28 |
[Java][I/O] 문자기반의 보조스트림 (0) | 2022.06.27 |
[Java][I/O] 문자기반 스트림 Reader와 Writer (0) | 2022.06.23 |
[Java][I/O] 바이트기반의 보조 스트림 (0) | 2022.06.23 |