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();
}
}
}
}
}
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으로 처리하여 외부로부터의 데이터 읽기에 활용.
댓글