본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch18 데이터 입출력 3 (Writer, Reader)

728x90
반응형

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

 

입출력의 마지막까지 보았습니다. 아직 모르는 부분이 많아서 복습을 좀 해봐야겠어요!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형