Java Day 18 IO - File
30 Dec 2020 | JavaJava Day 18 IO - File
-
스트림
- 데이터를 목적지로 입출력하기 위한 방법 * 스트림에서 데이터를 쓰고 읽을 수 있다
- 연결하고자 하는 Device에 따라 다양한 스트림이 존재 * FIFO(First In First Out) 데이터 구조로 데이터의 순서가 바뀌지 않는다
- 읽기, 쓰기 동시에 못한다 * 스트림은 넣어진 데이터가 처리되기 전까지는 스레드가 지연상태에 빠진다. 즉, 네트워크 내에서 데이터가 모두 전송되기 전까지는 네트워크 스레드가 지연상태가 됨
- 용도에 따른 분류
* 1차 스트림 : Device에 직접적으로 연결되는 스트림
- 2차 스트림 : Device와 직접 연결하지 않고 1차 스트림과 연결을 통해서 Device에 접근, 부가적인 기능들을 가지고 있음
- 데이터 전송 방향에 따른 분류
- 입력 스트림 : Device로부터 데이터를 읽어오는 스트림
- 출력 스트림 : Device에 데이터를 기록하는 스트림
- 2차 스트림 : Device와 직접 연결하지 않고 1차 스트림과 연결을 통해서 Device에 접근, 부가적인 기능들을 가지고 있음
- 데이터 전송 단위에 따른 분류
- 바이트 스트림 : 한 byte 단위로 읽고 쓰는 스트림
- 문자 스트림 : 한 문자(2 byte) 단위로 읽고 쓰는 스트림
-
File 클래스
- File 클래스는 파일 혹은 디렉토리의 등록정보를 표현하는 클래스
- File 클래스는 실제 파일의 내용을 포함하지 않는다
- File 객체는 실제 파일의 존재여부와 상관없이 생성됨
/* * 생성자 * File(String path-name) : 문자열 path-name을 경로로 File 객체 생성 * File(String parent, String child) : parent와 child를 연결한 경로로 File 객체 생성 * File(File parent, String child) : parent 객체 경로와 child를 연결해서 객체 생성 * * 메소드 * exists() : 파일,디렉토리가 존재하면 true, 아니면 false * isFile() : 파일이면 true, 아니면 false * isDirectory() : 디렉토리면 true, 아니면 false * getPath() : 상대경로 반환, getAbsolutePath() : 절대경로 반환 * getName() : 파일 혹은 디렉토리의 이름 반환 * length() : 파일의 길이를 바이트로 반환 * lastModified() : 파일의 마지막 수정날짜 반환(1970/01/01부터 현재까지의 밀리초) * createNewFile() : 파일을 생성하면 true, 못하면 false * mkdir() : 디렉토리 생성하면 true, 생성하지 못하면 false * delete() : 파일을 지우면 true, 못지우면 false * list() : 모든 파일과 디렉토리를 String 배열로 반환 * renameTo(File dest) : dest 파일 객체로 이름을 바꾸면 true, 아니면 false */ //Main 메소드 생략 File directory = new File("c:/"); if(directory.isDirectory()) { String[] fileNameList = directory.list(); //list 배열로 전달 for(String fileName : fileNameList) { //향상된 for문으로 요소 출력 System.out.println("이름 : " + fileName); } }//C드라이브의 모든 파일과 폴더가 출력된다 (숨김파일,폴더도) File f1 = new File("c:/newFile.txt"); f1.createNewFile(); //파일 생성 File f2 = new File("c:/newDirectory/dest.txt"); f1.renameTo(f2); //f1의 파일이 f2로 이름이 바뀌어 이동된다
-
Byte Stream
- InputStream과 OutputStream의 상속관계
- InputStream과 OutputStream의 주요 메소드
-
FileInputStream과 FileOutputStream
- 생성자
- 메소드는 부모 클래스인 Input,OutputStream의 메소드를 주로 사용함
//메인 메소드 생략 byte read[] = new byte[100]; byte console[] = new byte[100]; System.out.println("파일경로 : "); System.in.read(console); // c:/new/test.txt 텍스트 폴더로 가정 String file = new String(console).trim(); FileInputStream fis = new FileInputStream(file); fis.read(read,0,read.length); //0~100바이트 만큼 읽어옴 System.out.println(new String(read).trim()); if(fis != null) fis.close(); //사용 후 반드시 닫아줘야함 // c:/new/test.txt의 내용을 100바이트만큼 console창에 출력
// 메인 메소드 생략 FileOutputStream fos = new FileOutputStream("c:/myProject/123.txt"); String msg = "안녕?"; fos.write(msg.getBytes()); //문자열을 바이트코드로 변환해야한다 if(fos != null) fos.close(); // 123.txt 텍스트 파일에 '안녕?' 이라고 작성되어 있다
- FileInputStream과 FileOutputStream으로 파일 복사도 가능하나 byte 배열의 길이를 [1024*8] = 8kb만큼 지정해주고 파일을 옮겨쓰기 하면 속도면에서 훨씬 차이가 난다.
-
DataInputStream과 DataOutputStream
- 특정 데이터 타입과 포맷을 유지한 채 데이터를 읽고 쓸 수 있는 스트림
- 특정 데이터 타입과 포맷에 맞는 메소드 제공
// 메인 메소드 생략 DataOutputStream dos = new FileOutputStream("c:/myProject/123.txt"); FileOutputStream fos = new DataOutputStream(fos); int i = 10; double d = 3.14; String s = "안녕?"; dos.writeInt(i); // 데이터 타입에 맞는 메소드 dos.writeDouble(d); dos.writeUTF(s); if(fos != null) fos.close(); if(dos != null) dos.close(); // 123.txt에 인코딩된 언어로 적혀있다 FileInputStream fis = new FileInputStream("c:/myProject/123.txt"); DataInputStream dis = new DataInputStream(fis); int i = dis.readInt(); // * 기록한 순서대로 읽어야한다 double d = dis.readDouble(); String s = dis.readUTF(); System.out.println("i : " + i); System.out.println("d : " + d); System.out.println("s : " + s); // 기록한 순서대로 10, 3.14, 안녕? 이 출력
-
문자 스트림
- 바이트 스트림에 추가로 Reader, Writer 클래스를 제공하는데 2byte를 입출력 할 수 있는 문자기반 스트림이다.
- 1 byte를 입출력하는 바이트 스트림은 영어로 구성된 파일, 동영상, 음악 파일 등이 적합
- 2 byte를 입출력하는 문자 스트림은 영어 이외의 세계 모든 언어로 된 파일 입출력이 적합
- 문자 스트림의 상속관계
- Reader 클래스의 주요 메소드
- Writer 클래스의 주요 메소드
-
FileReader와 FileWriter
- Reader, Writer 계열의 스트림은 버퍼를 내장하고 있다. 버퍼가 가득 채워지면 스트림으로 내보내는데 flush()는 버퍼가 가득차지 않아도 내보낸다.
// 메인 메소드 생략 FileWriter writer = new FileWriter("c:/myProject/123.txt"); String s = "안녕하세요?"; writer.write(s); //한 글자 단위로 기록 writer.flush(); //내장된 버퍼가 가득 if(writer != null) writer.close(); //123.txt에 '안녕하세요?'가 작성되어 있다 FileReader reader = new FileReader("c:/myProject/123.txt"); int value = 0; //read()를 저장할 저장소 while((value = reader.read()) != -1) { System.out.print((char)value); }//'안녕하세요?'가 출력된다
-
BufferedWriter와 BufferedReader
- 스트림의 읽고 쓰는 성능을 개선하기 위해 내부에 버퍼를 가지고 있는 스트림
// 메인 메소드 생략 FileWriter fw = new FileWriter("c:/myProject/123.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write("테스트"); bw.newLine(); //한 줄 띄우기 bw.write("입니다" + System.getProperty("line.separator")); ////한 줄 띄우기 bw.write("안녕?"); bw.flush(); //버퍼 비우기 //123.txt에 한 줄씩 입력 FileInputStream fis = new FileInputStream("c:/myProject/123.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String str = null; while((str = br.readLine()) != null) { //한 줄씩 읽어오기 System.out.println(str); } //테스트 //입니다 //인녕? //한 줄씩 출력된다
-
PrintStream과 PrintWriter
- 모든 자료형을 출력 할 수 있는 print(), println() 메소드가 있다
- 다른 스트림과 다르게 생성자로 Auto Flush 기능을 사용 할 수 있다
참고 자료
KG아이티뱅크 자바 강의자료