9. 프린트 스트림
◎ PrintStream과 PrintWriter
▷ 프린터와 유사하게 출력하는 print(), println(), printf() 메소드를 가진 보조 스트림
▷ PrintStream은 바이트 출력 스트림과 연결되고, PrintWriter는 문자 출력 스트림과 연결
PrintStream/PrintWriter | |||
void | print(boolean b) | void | println(boolean b) |
void | print(char c) | void | println(char c) |
void | print(double d) | void | println(double d) |
void | print(float f) | void | println(float f) |
void | print(int i) | void | println(int i) |
void | print(long l) | void | println(long l) |
void | print(Object obj) | void | println(Object obj) |
void | print(String s) | void | println(String s) |
void | println() |
◎ 프린트 스트림 예제
1. printStreamExample 메인 클래스
import java.io.FileOutputStream; import java.io.PrintStream; public class PrintStreamExample { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("C:/Temp/printstream.txt"); PrintStream ps = new PrintStream(fos); ps.print("마치 " ); ps.println("프린트가 출력하는 것처럼 "); ps.println("데이터를 출력합니다."); ps.printf("| %6d | %-10s | %10s | \n", 1, "홍길동", "도적"); ps.printf("| %6d | %-10s | %10s | \n", 2, "감자바", "학생"); ps.flush(); ps.close(); } }
2. printstream.txt 출력
마치 프린트가 출력하는 것처럼 데이터를 출력합니다. | 1 | 홍길동 | 도적 | | 2 | 감자바 | 학생 |
10. 객체 스트림
◎ 직렬화와 역직렬화
▷ 자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력
▷ 직렬화(serialization) : 메모리에 생성된 객체를 출력하려면 필드값을 일렬로 늘어선 바이트로 변경해야 한다.
▷ 역직렬화(deserialization) : 직렬화된 바이트를 객체의 필드값으로 복원하는 것입니다.
◎ Serializable 인터페이스
▷ 멤버가 없는 빈 인터페이스이지만, 객체를 직렬화할 수 있다고 표시하는 역할
▷ 인스턴스 필드값은 직렬화 대상. 정적 필드값과 transient로 선언된 필드값은 직렬화에서 제외되므로 출력되지 않음
◎ SerialVersionUID 필드
▷ 직렬화할 때 사용된 클래스와 역직렬화할 때 사용된 클래스는 동일한 클래스여야합니다.
▷ 클래스 내용이 다르더라도 두 클래스가 동일한 serialVersionUID 상수값을 가지면 역직렬화 가능
◎ 객체 스트림 예제
1. Member 클래스
import java.io.Serializable; public class Member implements Serializable { private static final long serialVersionUID = -622284561026719240L; private String id; private String name; public Member(String id, String name) { this.id = id; this.name = name; } @Override public String toString() { return id + ": " + name; } }
2. Product 클래스
import java.io.Serializable; public class Product implements Serializable { private static final long serialVersionUID = -621812868470078544L; private String name; private int price; public Product(String name, int price) { this.name = name; this.price = price; } @Override public String toString() { return name + ": " + price; } }
3. ObjectInputOutputStreamExample 메인 클래스
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Arrays; public class ObjectInputOutputStreamExample { public static void main(String[] args) throws Exception { // FileOutputStream에 ObjectOutputStream 보조 스트림 연결 FileOutputStream fos = new FileOutputStream("C:/Temp/object.dat"); ObjectOutputStream oos = new ObjectOutputStream(fos); // 객체 생성 Member m1 = new Member("fall", "단풍이"); Product p1 = new Product("노트북", 1500000); int[] arr1 = { 1, 2, 3 }; // 객체를 직렬화해서 파일에 저장 oos.writeObject(m1); oos.writeObject(p1); oos.writeObject(arr1); oos.flush(); oos.close(); fos.close(); // FileInputStream에 ObjectInputStream 보조 스트림 연결 FileInputStream fis = new FileInputStream("C:/Temp/object.dat"); ObjectInputStream ois = new ObjectInputStream(fis); // 파일을 읽고 역질력화해서 객체로 복원 Member m2 = (Member) ois.readObject(); Product p2 = (Product) ois.readObject(); int[] arr2 = (int[]) ois.readObject(); ois.close(); fis.close(); // 복원된 객체 내용 확인 System.out.println(m2); System.out.println(p2); System.out.println(Arrays.toString(arr2)); } } // 출력 : // fall: 단풍이 // 노트북: 1500000 // [1, 2, 3]
11. File/Files 클래스
◎ File 클래스
▷ File 클래스로부터 File 객체를 생성
▷ exists() 메소드가 false를 리턴할 경우, 다음 메소드로 파일 또는 폴더를 생성
NO | 리턴 타입 | 메소드 | 설명 |
1 | boolean | createNewFile() | 새로운 파일을 생성 |
2 | boolean | mkdir() | 새로운 디렉토리를 생성 |
3 | boolean | mkdirs() | 경로상에 없는 모든 디렉토리를 생성 |
▷ exists() 메소드의 리턴값이 true라면 다음 메소드를 사용
NO | 리턴 타입 | 메소드 | 설명 |
1 | boolean | delete() | 파일 또는 디렉토리 삭제 |
2 | boolean | canExecute() | 실행할 수 있는 파일인지 여부 |
3 | boolean | canRead() | 읽을 수 있는 파일인지 여부 |
4 | boolean | canWrite() | 수정 및 저장할 수 있는 파일인지 여부 |
5 | String | getName() | 파일의 이름을 리턴 |
6 | String | getParent() | 부모 디렉토리를 리턴 |
7 | File | getParentFile() | 부모 디렉토리를 File 객체로 생성 후 리턴 |
8 | String | getPath() | 전체 경로를 리턴 |
9 | boolean | isDirectory() | 디렉토리인지 여부 |
10 | boolean | isFile() | 파일인지 여부 |
11 | boolean | isHidden() | 숨김 파일인지 여부 |
12 | long | lastModified() | 마지막 수정 날짜 및 시간을 리턴 |
13 | long | length() | 파일의 크기 리턴 |
14 | String[ ] | list() | 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 String 배열로 리턴 |
15 | String[ ] | list(FilenameFilter filter) | 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴 |
16 | File[ ] | listFiles() | 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부를 File 배열로 리턴 |
17 | File[ ] | listFiles(FilenameFilter filter) | 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중에 FilenameFilter에 맞는 것만 File 배열로 리턴 |
◎ File 예제
import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; public class FileExample { public static void main(String[] args) throws Exception { // File 객체 생성 File dir = new File("C:/Temp/images"); File file1 = new File("C:/Temp/file1.txt"); File file2 = new File("C:/Temp/file2.txt"); File file3 = new File("C:/Temp/file3.txt"); // 존재하지 않으면 디렉토리 또는 파일 생성 if(dir.exists() == false) { dir.mkdirs();} if(file1.exists() == false) { file1.createNewFile();} if(file2.exists() == false) { file2.createNewFile();} if(file3.exists() == false) { file3.createNewFile();} // Temp 폴더의 내용을 출력 File temp = new File("C:/Temp"); File[] contents = temp.listFiles(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm"); for(File file : contents) { System.out.printf("%-25s", sdf.format(new Date(file.lastModified()))); if(file.isDirectory()) { System.out.printf("%-10s%-20s", "<DIR>", file.getName()); } else { System.out.printf("%-10s%-20s", file.length(), file.getName()); } System.out.println(); } } } // 출력 : // 2023-01-31 오후 14:30 0 file1.txt // 2023-01-31 오후 14:30 0 file2.txt // 2023-01-31 오후 14:30 0 file3.txt // 2022-12-05 오후 12:29 629 hello2022.class // 2022-12-05 오후 12:29 127 hello2022.java // 2023-01-31 오후 14:30 <DIR> images // 2023-01-31 오후 14:07 193 object.dat // 2023-01-31 오전 11:33 46 primitive.db // 2023-01-31 오후 12:24 172 printstream.txt // 2023-01-31 오전 10:36 664489 targetFile1.jpg // 2023-01-31 오전 10:36 664489 targetFile2.jpg // 2023-01-27 오후 19:54 67167 test.jpg // 2023-01-31 오전 09:29 43 test.txt // 2023-01-30 오후 16:25 3 test1.db // 2023-01-30 오후 16:43 3 test2.db // 2023-01-30 오후 17:25 67167 test2.jpg // 2023-01-30 오후 16:51 3 test3.db // 2023-01-30 오후 17:51 67167 test5.jpg
◎ Files 클래스
▷ Files 클래스는 정적 메소드로 구성되어 있기 때문에 File 클래스처럼 객체로 만들 필요 없습니다.
▷ Files의 정적 메소드는 운영체제의 파일 시스템에게 파일 작업을 수행하도록 위임합니다.
NO | 기능 | 관련 메소드 |
1 | 복사 | copy |
2 | 생성 | createDirectories, createDirectory, createFile, createLink, createSymbolicLink, createTempDirectory, createTempFile |
3 | 이동 | move |
4 | 삭제 | delete, deleteIfExists |
5 | 존재, 검색, 비교 | exists, notExists, find, mismatch |
6 | 속성 | getLastModifiedTime, getOwner, getPosixFilePermissions, isDirectory, isExecutable, isHidden, isReadable, isSymbolicLink, isWritable, size, setAttribute, setLastModifiedTime, setOwner, setPosixFilePermissions, probeContentType |
7 | 디렉토리 탐색 | list, newDirectoryStream, walk |
8 | 데이터 입출력 | newInputStream, newOutputStream, newBufferedReader, newBufferedWriter, readAllBytes, lines, readAllLines, readString, readSymbolicLink, write, writeString |
◎ Files 예제
import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileExample { public static void main(String[] args) { try { String data = "" + "id: winter\n" + "email: winter@mycompany.com\n" + "tel: 010-123-1234"; // Path 객체 생성 Path path = Paths.get("C:/Temp/user.txt"); // 파일 생성 및 데이터 저장 Files.writeString(Paths.get("C:/Temp/user.txt"), data, Charset.forName("UTF-8")); // 파일 정보 얻기 System.out.println("파일 유형: " + Files.probeContentType(path)); System.out.println("파일 크기: " + Files.size(path) + "bytes"); // 파일 읽기 String content = Files.readString(path, Charset.forName("UTF-8")); System.out.println(content); } catch (IOException e) { e.printStackTrace(); } } } // 출력 : // 파일 유형: text/plain // 파일 크기: 56bytes // id: winter // email: winter@mycompany.com // tel: 010-123-1234
입출력의 마지막까지 보았습니다. 아직 모르는 부분이 많아서 복습을 좀 해봐야겠어요!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 이것이 자바다 ch19 네트워크 입출력(UDP, 동시 요청 처리) (0) | 2023.02.01 |
---|---|
[java] 이것이 자바다 ch19 네트워크 입출력(IP, TCP) (0) | 2023.02.01 |
[java] 이것이 자바다 ch18 데이터 입출력 2 (Writer, Reader) (0) | 2023.01.31 |
[java] 이것이 자바다 ch18 데이터 입출력 1 (Writer, Reader) (0) | 2023.01.30 |
[java] 이것이 자바다 ch17 스트림(reduce, 병렬) (0) | 2023.01.30 |