java.io.File
- File 클래스는 파일 또는 폴더에 대한 정보를 제공하는 클래스.
- 파이썬에서 os 클래스와 비슷하다고 보면됨.
- File 클래스의 객체는 정보를 조회하고자 하는 파일이나 폴더의 경로에 대한 문자열을 생성자 파라미터로 전달하는 형태로 만들 수 있음.
- 이 때 파라미터로 전달되는 경로가 실제로 존재하지 않더라도 File 객체의 생성이 가능함.
경로 설정하기
- 운영체제간의 호환성 유지를 위한 '/' 의 사용
- 경로 설정시 윈도우에서는 역슬래시()를 사용하지만 이 경우 '\'의 형식으로 사용해야하고, 가급적 다른 운영체제와의 호환성을 위해 '/' 를 사용하는것이 좋음.
- 절대 경로
- 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
- 리눅스 예시 : /etc/httpd/conf/httpd.conf
- 윈도우 예시 : C:/Windows/System32/driver/etc/hosts
- 상대 경로
- 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
- 리눅스 예시 : ./conf/httd.conf
- 윈도우 예시 : ../drivers/etc/hosts
import java.io.File;
public class Main01 {
public static void main(String[] args) {
// 절대경로나 상대경로를 생성자 파라미터로 전달한다.
// 이클립스에서 상대경로를 사용할 경우, 현재 프로젝트가
// 기준이 된다.
File f1 = new File("src/Main01.java");
// isFile - 전달된 경로가 파일인지 검사
// --> 존재하지 않는 파일로 검사할 경우 무조건 false
boolean is_file = f1.isFile();
// isDirectory - 전달된 경로가 디렉토리(폴더)인지 검사
// --> 존재하지 않는 디렉토리(폴더)로 검사할 경우 무조건 false
boolean is_dir = f1.isDirectory();
// isHidden - 전달된 경로가 숨김형태인지 검사
// --> 존재하지 않는 파일,디렉토리로 검사할 경우 무조건 false
boolean is_hidden = f1.isHidden();
// getAbsolutePath - 절대경로 값을 추출
String abs = f1.getAbsolutePath();
// exists - 생성자에 전달된 파일이나 디렉토리가 물리적으로 존재하는지를 검사
boolean is_exist = f1.exists();
// 디렉토리 정보 객체 생성
File f2 = new File("a/b/c/target");
System.out.println("isFile: " + f2.isFile());
System.out.println("isDirectory: " + f2.isDirectory());
System.out.println("isHidden: " + f2.isHidden());
System.out.println("절대경로: " + f2.getAbsolutePath());
System.out.println("존재여부: " + f2.exists());
// 경로에 따른 디렉토리 생성
// mkdir - 최종폴더만 생성
// mkdirs - 중간경로에 없는 폴더도 같이 생성.
f2.mkdirs();
// File f1 = new File("src/Main01.java")
// File f2 = new File("a/b/c/target")
// 마지막 "/" 이후 단어를 리턴 -> 파일(폴더)명 추출
System.out.println(f1.getName()); // Main01.java
System.out.println(f2.getName()); // target
// 처음부터 마지막 "/" 직전까지 리턴
System.out.println(f1.getParent()); // src
System.out.println(f2.getParent()); // a/b/c
// 삭제 시도 --> 성공시 true, 실패시 false
boolean del_ok = f2.delete();
}
}
IuputStream / OutputStream
문자 인코딩(character encoding)
- 문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신의 목적으로 부호화 하는방법
- 모스부호 : 전건을 길게, 또는 짧게 두드려서 라틴 알파벳을 표현.
- 아스키(ASCII) : 라틴 알파벳, 숫자, 특수문자 등을 정수와 그에 대응하는 7비트 이진수로 표현.
- UTF-8 : 8비트 이진수로 표현하는 방법.
스트림(Stream)
- 입출력에서 stream이란 디바이스의 입출력 방식이 1바이트씩 연속적으로 전달되는 형태로, 추상화된 상태를 의미
- 입출력 장치(키보드, 모니터, 프린트 등)는 개별적인 특성이 있어 읽고 쓰는 단위가 각각다르지만 스트림은 이러한 일련의 과정을 추상화하여 모든 디바이스를 character 단위로만 사용하도록 함.
- 즉, 입출력 디바이스의 특성을 무시하고 하나의 단일한 입출력 인터페이스로 다룰수 있도록 하는것이 스트림(stream) 이다.
파일 저장 과정
- 저장을 위한 빈파일 생성
- OutputStream의 객체 생성
- 파일에 내용 쓰기
- 저장할 내용을 byte 배열로 변환
- 변환된 배열을 OutputStream의 write()메서드에게 파라미터로 전달.
- 파일 닫기
- OutputStream 객체로 close()메서드를 호출하여 스트림을 닫는다.
- 파이썬과 달리 자동으로 파일을 닫아주지 않아 입력해야 함.
- 입력하지 않으면 컴퓨터에서 계속 작업중인 상태로 띄워져 삭제 불가능.
파일 저장시 유의사항
- OutputStream은 각각 단계하다 예외처리를 강제적으로 요구함.
- try ~ catch 블록이 형성되는 과정에서 변수의 유효성 범위에 대한 처리에 유의
파일 저장하기
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
public class Main02 {
public static void main(String[] args) {
// 저장할 파일의 경로
final String PATH = "./test.txt";
// 파일에 저장할 내용
String write_string = "가나다라마바사nabcd";
/** 특정 인코딩 방식 적용 */
// 다른블록에서도 buffer을 인식하기 위해서 블록 밖에서 선언.
// 할당되지 않은 빈 영역임을 표시하기 위해 null로 초기화
byte[] buffer = null;
try {
buffer = write_string.getBytes("utf-8");
}
// 인코딩 형식을 지원하지 않을 수 있는것과 오타 방지를 위해 예외처리
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
/** 파일 저장 절차 시작 */
// finally 블록에서도 out을 인식하기 위해서 블록 밖에서 선언.
// 할당되지 않은 빈 영역임을 표시하기 위해 null로 초기화
OutputStream out = null;
try {
out = new FileOutputStream(PATH);
// 파일쓰기
out.write(buffer);
System.out.println("[INFO] 파일 저장 성공 >> " + PATH);
}
// 파일의 경로를 못찾았을때 예외처리
catch (FileNotFoundException e) {
System.out.println("[ERROR] 지정된 경로를 찾을 수 없음. >>" + PATH);
e.printStackTrace();
}
// 파일이 저장 되지 않았을경우 예외처리
catch (IOException e) {
System.out.println("[ERROR] 파일 저장 실패 >> " + PATH);
e.printStackTrace();
}
// 그 이외의 예외처리
catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러 >> " + PATH);
e.printStackTrace();
}
finally {
if(out!=null) {
try {
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
파일 읽기 과정
- 파일을 읽기 위한 InputStream 객체 생성
- 읽은 내용을 담기위한 빈 byte 배열 생성
- 파일의 용량 크기 만큼 배열의 사이즈 지정
- 파일의 내용 읽기
- 읽은 내용을 담기위한 byte 배열을 InputStream 객체의 read() 메서드를 호출하여 스트림을 닫는다.
- 스트림 닫기
- InputStream 객체의 close() 메서드를 호출하여 스트림을 닫는다.
- 읽은 내용을 문자열로 변환
- byte 배열을 String 클래스의 생성자에게 전달하여 문자열로 변환
- 이 과정에서 어떤 인코딩을 사용할지 함께 설정해야함.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
public class Main03 {
public static void main(String[] args) {
// 읽을 파일의 경로
final String PATH = "./test.txt";
// 읽은 내용이 담겨질 스트림
byte[] data = null;
// 읽은 내용이 변환될 문자열
String read_string = null;
/** 파일 읽기 */
InputStream in = null;
try {
in = new FileInputStream(PATH);
// 읽은 내용을 담기 위한 배열은 파일의 용량만큼 사이즈를 할당한다.
// in.abailable() --> 열고있는 파일의 크기
data = new byte[in.available()];
// 파일 읽기 - 파라미터로 전달된 배열 안에, 파일의 내용을 담아준다.
in.read(data);
System.out.println("[INFO] 파일 읽기 성공 >> " + PATH);
}
// 파일의 경로를 찾지 못한 예외상황
catch (FileNotFoundException e) {
System.out.println("[ERROR] 지정된 경로를 찾을 수 없음 >> " + PATH);
e.printStackTrace();
}
// 파일을 읽어오지 못한 예외상황
catch (IOException e) {
System.out.println("[ERROR] 파일 읽기 실패 >> " + PATH);
e.printStackTrace();
}
// 그 이외의 예외상황
catch (Exception e) {
System.out.println("[ERROR] 알 수 없는 에러 >> " + PATH);
e.printStackTrace();
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
// data 배열에 내용이 있다면, 문자열로 변환하여 출력
if (data != null) {
// 문자열로 변환시에는 저장된 인코딩으로 지정해준다.
try {
read_string = new String(data, "utf-8");
System.out.println(read_string);
}
catch (UnsupportedEncodingException e) {
System.out.println("[ERROR] 인코딩 지정 에러");
e.printStackTrace();
}
}
}
}
JSON(Javascript Object Notation)
- JSON은 경량의 데이터교환형식으로 원래는 Javascript에서 객체 지향을 구현하기 위하혀 사용되는 문법적 표현
JSON 표기법의 중요성
- JSON은 특정 프로그래밍 언어에 종속되지 않고 언어로부터 독립적으로 존재가능, 여러개의 데이터를 구조적으로 표현할 수 있는 가장 간결한 표현법.
- JAVA 언어에서는 프로그램 외부에 저장된 파일의 내용을 JSON형식으로 구성하거나 통신을 통해 수신하는 데이터를 JSON으로 처리하여 외부로부터의 데이터 읽기에 활용.
- 최근 웹, 모바일 등을 중심으로 서로 다른 플랫폼간의 데이터 교환을 위해 활용됨.
'JAVA' 카테고리의 다른 글
JAVA(DAO패턴) (0) | 2020.06.24 |
---|---|
JAVA(MySQL연동, JDBC) (0) | 2020.06.23 |
JAVA(예외처리, 날짜처리, 컬렉션) (0) | 2020.06.15 |
JAVA (Static, 익명클래스) (0) | 2020.06.11 |
JAVA(추상화, 인터페이스) (0) | 2020.06.10 |
댓글