본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-05-12자바공부(paths 와 path)

반응형

무거운 스트림을 가볍게 쓰기 위해 나온 것이 이것이다!

 

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 이라는 것으로 모드를 변경해 사본에 넣어주는 것처럼 보인다 

(예제랑 그림이랑 보면 이해가 될 것이다. ) 

이렇게 했을 때 성능이 향상 포인트는 어디일까

 

이렇게 파일 입출력도 마무리가 된 거 같다~~ 이제 안드로이드 파일 입출력에 대해 알아볼 것이다. 

수고했다옳!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 무야호~~~~~~~~~~~~~~~

반응형