무거운 스트림을 가볍게 쓰기 위해 나온 것이 이것이다!
new 없이 인스턴스화 가능하다.
내가 있는 경로를 "" 이렇게 해서 상대경로로 볼 수 있다.
파일 및 디렉토리 생성의 예
public class Path_file {
public static void main(String[] args) throws Exception{
Path fp = Paths.get("C:\\JavaStudy\\empty.txt");
fp = Files.createFile(fp);//파일생성
Path dp = Paths.get("C:\\JavaStudy\\empty");
dp = Files.createDirectory(dp);//디렉토리생성
Path dp2 = Paths.get("C:\\JavaStudy2\\empty");
dp2 = Files.createDirectories(dp2);//경로의 모든 디렉토리 생성
//경로 출력
System.out.println("file : " + fp);
System.out.println("dir1 : " + dp);
System.out.println("dir2 : " + dp2);
}
}
그럼 진짜 경로에 생겼는지 확인해보자~
이렇게 경로에 들어가서 확인 해보면 파일이 생겨난 것을 볼 수 있다.
이렇게 보면 파일 클래스의 dir, dirs 과 비슷한 것을 볼 수 있다.
이론적인 이야기이고 직접 실습을 해보자~!!
간단한 입력 및 출력의 예
public class Path_Byte {
public static void main(String[] args) throws Exception {
Path fp = Paths.get("C:\\JavaStudy\\simple.bin");
//파일 생성, 같은 이름의 존재하면 예외발생
fp = Files.createFile(fp);
byte buf1[] = {0x13,0x14,0x15}; //파일에 쓸 데이터
for(byte b : buf1) //저장할 데이터의 출력을 위한 반복문
System.out.print(b+"\t");
System.out.println();
//파일에 데이터 쓰기 위에서 보았던 옵션 파일 끝에 데이터 추가
Files.write(fp, buf1,StandardOpenOption.APPEND);
//파일로 부터 데이터 읽기
byte buf2[] = Files.readAllBytes(fp);
for(byte b : buf2) //읽어 들인 데이터 확인을 위한 반복문
System.out.print(b+"\t");
System.out.println();
}
}
결과값
파일 저장하기 전에 찍어주었던 19 20 21 과 저장 후에 출력한 19 20 21 잘 찍히고 파일도 만들어진다.
문자 데이터의 간단한 입력 및 출력
public class Path_String {
public static void main(String[] args) throws Exception {
// 파일경로
Path fp = Paths.get("C:\\JavaStudy\\simple.text");
String st1 = "첫째 아옳이";
String st2 = "둘째 아옳이";
// 스트링도 클래스 이므로 리스트에 담아주고
List<String> list = Arrays.asList(st1, st2);
// 예외 처리하기위해 위에 throws 던져주기
Files.write(fp, list);
//리스트에 다시 불러오기
List<String> list2 = Files.readAllLines(fp);
System.out.println(list2);
}
}
이렇게 문자도 패스로 간단하게 입출력해줄 수 있다.
중요한 포인트는 파일경로를 설정해줄 때 new 를 안 쓰고 인스턴스를 생성해주었다~ 하지만 그렇게 생성을 했다고 실제로 파일이 생성된 것이 아니라는 점이다. 실제 파일은 Files.write(fp,list) 할 때 생겨난다는 거 잊지 말아라
파일 및 디렉토리의 복사와 이동의 예
여기서 헷갈리는 점은 파일의 속성까지 복사한다고 하는데 저부분은 숨김, 읽기 전용 등등의 속성까지 복사한다고 한다
그런데 사실 잘 사용안한다고 하니... 그냥 보고 넘어가자
A 텍스트와 빈 B 텍스트이다 . 이제 코드로 복사를 해보자
public class Path_Copy {
public static void main(String[] args) throws IOException {
Path src = Paths.get("C:\\JavaStudy\\A.txt");
Path src2 = Paths.get("C:\\JavaStudy\\B.txt");
//sec가 지시하는 파일을 dst가 지시하는 위치와 이름으로 복사
Files.copy(src, src2,StandardCopyOption.REPLACE_EXISTING);
}
}
이렇게 실행을 하고 나면 어떻게 될까? (사실 나도 실수한 게 따로 B는 안 만들어도 되는데 하나 만들어버렸어... ㅋ )
이렇게 텍스트 파일이 하나 생기고 A텍스트가 복사되어 B가 생겨난것을 볼 수 있다.
코드는 거의 똑같지만 이동도 한번 보자
public class Path_Copy {
public static void main(String[] args) throws IOException {
Path src = Paths.get("C:\\JavaStudy\\Dir1");
Path src2 = Paths.get("C:\\JavaStudy\\Dir2");
//src가 지시하는 디렉토리를 src2가 지시하는 디렉토리로 이동
Files.move(src, src2,StandardCopyOption.REPLACE_EXISTING);
}
}
이건 내일 한번 여쭤봐야할거 같다 단순 이동인 줄 알았는데... 이동인지 뭔지 하나가 삭제돼버린다....
기타 자료들 ...
나머지 부분들이 있는데 똑같은 내용들이 너무 반복하는 거 같아서 자료만 참조하겠다
NIO란 New IO 방식이라는 말이다. Path와 Paths 가 New Io 1번이라고 생각하면 된다.
여기도 new 를 안 쓰고 Files. 으로 해준 것을 볼 수 있다.
NIO의 채널과 버퍼 (스트림에 대응)
예제의 이해를 돕기 위한 그림
여기서 보면 하나의 버퍼에서 flip 이라는 것으로 모드를 변경해 사본에 넣어주는 것처럼 보인다
(예제랑 그림이랑 보면 이해가 될 것이다. )
이렇게 했을 때 성능이 향상 포인트는 어디일까
이렇게 파일 입출력도 마무리가 된 거 같다~~ 이제 안드로이드 파일 입출력에 대해 알아볼 것이다.
수고했다옳!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 무야호~~~~~~~~~~~~~~~
'아옳옳의 코딩공부 > 아옳옳 자바코딩공부' 카테고리의 다른 글
2021-05-20자바공부(네트워크 시험) (0) | 2021.05.20 |
---|---|
2021-05-17안드로이드공부(네트워크 프로그래밍) (0) | 2021.05.18 |
2021-05-11자바공부(파일 클래스) (0) | 2021.05.11 |
2021-05-10자바공부(파일과 I/O 스트림) (0) | 2021.05.10 |
2021-05-03자바공부(스레드 Thread3) (8) | 2021.05.03 |