44일차 java 연산(2023-02-23)

권단비·2023년 2월 23일
0

IT

목록 보기
83/139

[Eclipse 연습]

[계산]
package CollectionF;
import java.util.*;
public class Test11 {
	public static void main(String[] args) {
//		5. 아래의 TreeMap의 Value를 확인 하기 위한 소스를 짜시오.(필수)
		TreeMap<Integer, String> map = new TreeMap<>();
		map.put(45, "Brown");
		map.put(37, "James");
		map.put(23, "Martin");

		Set<Integer> ks = map.keySet();

		for (Integer n : ks)
			System.out.print(n.toString() + ": " + map.get(n) + '\n');
	}
}
[결과값]
23: Martin
37: James
45: Brown

[I/O 스트림(개울)에 대한 이해]

보조 스트림 = 필터 스트림
스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있는 스트림.
보완하는 용도이기 때문에 실제 데이터를 주고 받지 않고, 데이터를 입출력할 수 있는 기능은 없다.

DataOutputStream > BufferedOutputStream > FileOutputStream의 순서로 사용한다.

[스트림]
바이트 기반 스트림

입력스트림출력스트림입출력 대상 종류
FileInputStreamFileOutputStream파일

문자 기반 스트림

입력스트림출력스트림입출력 대상 종류
FileReaderFileWriter파일

[보조스트림]
바이트 기반 보조 스트림

입력스트림출력스트림설명
FilterInputStreamFilterOutputStream필터를 이용한 입출력 처리
BufferedInputStreamBufferedOutputStream버퍼를 이용한 입출력 성능향상
DataInputStreamDataOutputStreamint, float과 같은 기본형 단위로 데이터를 처리하는 기능
ObjectInputStreamObjectOutputStream데이터를 객체 단위로 읽고 쓰는데 사용. 주로 파일일을 이용하며 객체 직렬화와 관련된다.

문자 기반 보조 스트림

입력스트림출력스트림설명
InputStreamReaderOutputStreamWriter바이트 기반 스트림을 문자 기반 스트림으로 연결
BufferedReaderBufferedWriter버퍼를 이용한 입출력 효율 향상

BufferedReader : readLine()을 사용하면 데이터를 라인 단위로 읽을 수 있다.
BufferedWriter : newLine()을 사용하면 줄바꿈을 할 수 있다.


java 1.8의 스트림과 I/O 스트림은 완전히 다른 것

스트림 = 빨대

입력(read) 출력(write)
파일 입력(hello 읽기)
파일 출력(hello1으로 바꿔쓰기)

입력 스트림(Input Stream) : 실행 중인 자바 프로그램으로 데이터를 읽어 들이는 스트림
출력 스트림(Output Stream) : 실행 중인 자바 프로그램으로부터 데이터를 내보내는 스트림

  [ex:카카오톡]
・출력 : 네트워크에서 상대방에게 메시지를 보내는 것
・입력 : 네트워크에서 상대방의 메시지를 받는 것

반드시 스트림을 종료해야 함.
out.close(); // 출력 스트림 종료
in.close(); // 입력 스트림 종료

상기 사진 경로로 들어가면 data파일이 생성되어 있다.

[계산]
// 출력 스트림
package IOStream;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Write7ToFile {
	public static void main(String[] args) throws IOException {
		OutputStream out = new FileOutputStream("data.dat"); // 출력 스트림 생성
		// OutputStream : data.dat이라는 파일에 빨대를 꽂아서 데이터를 출력한다.
		out.write(7); // 데이터 7을 파일에 전달
		out.close(); // 스트림 종료
	}
}

-----------------------------------------------------------------------
// 입력 스트림
package IOStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Read7FromFile {
	public static void main(String[] args) throws IOException {
		InputStream in = new FileInputStream("data.dat"); // 입력 스트림 생성
		// InputStream : data.dat에 빨대를 꽂아서 데이터를 한 바이트 읽어 들이고 빨대는 사라진다.
		int dat = in.read(); // 데이터 읽음
		in.close(); // 입력 스트림 종료
		System.out.println(dat);
	}
}
[결과값]
7

[계산]
// 1 바이트 단위 파일 복사 프로그램!
package IOStream;
import java.io.*;
import java.util.Scanner;
public class IOFileCopyByte {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("대상 파일: ");
		String src = sc.nextLine();
		System.out.print("사본 이름: ");
		String dst = sc.nextLine();

		try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) {
			int data;
			while (true) {
				data = in.read(); // 파일로부터 1 바이트를 읽는다.
				if (data == -1) // 더 이상 읽어 들일 데이터가 없다면,
					break;
				out.write(data); // 파일에 1 바이트를 쓴다.
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
[결과값]
대상 파일: data.dat
사본 이름: kdb.afefdvae

대상 파일: C:\Users\USER\Documents\workspace-sts-3.9.11.RELEASE\EX\src\IOStream\Read7FromFile.java
사본 이름: C:\Users\USER\Documents\workspace-sts-3.9.11.RELEASE\EX\src\IOStream\Read7FromFileCopy.java

하기 사진과 같이 data파일이 kdb라는 이름으로 복사되었다.

[계산]
// 1K바이트 버퍼 기반 파일 복사 프로그램!
// Byte[] 만큼 읽기 때문에 속도가 훨씬 빠르다
package IOStream;
import java.io.*;
import java.util.Scanner;
public class IOFileCopyByte2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("대상 파일: ");
		String src = sc.nextLine();
		System.out.print("사본 이름: ");
		String dst = sc.nextLine();

		// java 1.7ver 부터 try안에 선언할 수 있다. 이렇게 사용하면 close를 할 필요가 없다.
		try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) {
			byte buf[] = new byte[1024];
			int len;
			while (true) {
				len = in.read(buf); // 배열 buf(1024K바이트)로 데이터를 읽어 들이고, (더 이상 읽어 들일 데이터 없으면 -1 반환)
				if (len == -1)
					break;
				out.write(buf, 0, len); // len 바이트만큼 데이터를 저장한다.
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
// public int read(byte[] b) throws IOException
//→파일에 저장된 데이터를 b로 전달된 배열에 저장

//public void write(byte[] b, int off, int len) throws IOException
//→b로 전달된 배열의 데이터를 인덱스 off에서부터 len 바이트 만큼 파일에 저장
[결과값]
대상 파일: C:\Users\USER\Documents\IT\열혈자바(ppt)\열혈 Java Chapter 33.pptx
사본 이름: C:\Users\USER\Documents\IT\열혈자바(ppt)\열혈 Java Chapter 33 복사본.pptx

하기 사진과 같이 열혈 Java Chapter 33파일이 열혈 Java Chapter 33 복사본이라는 이름으로 복사되었다.


[입출력 필터 스트림의 이해2]

필터 스트림 = 보조 스트림

[계산]
package IOStream;
import java.io.*;
public class B_WriteFilterStream {
	public static void main(String[] args) {
		try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data.dat"))) {
			// DataOutputStream : 필터(보조) 스트림
			out.writeInt(370); // int형 데이터 저장
			out.writeDouble(3.14); // double형 데이터 저장
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
// OutputStream out = new FileOutputStream(dst))
// write int형만 쓸 수 있다.

-----------------------------------------------------------------------
package IOStream;
import java.io.*;
public class B_ReadFilterStream {
	public static void main(String[] args) {
		try (DataInputStream in = new DataInputStream(new FileInputStream("data.dat"))) {
			int num1 = in.readInt(); // int형 데이터 꺼냄
			double num2 = in.readDouble(); // double형 데이터 꺼냄
			System.out.println(num1);
			System.out.println(num2);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
[결과값]
370
3.14

[버퍼링 기능을 제공하는 필터 스트림]

버퍼링 : 임시 저장 공간을 의미
속도가 빨라진다.

DataOutputStream > BufferedOutputStream > FileOutputStream의 순서로 사용한다.

[계산]
package IOStream;
import java.io.*;
import java.util.Scanner;
public class C_IOFileBufferFilterStream {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("대상 파일: ");
		String src = sc.nextLine();
		System.out.print("사본 이름: ");
		String dst = sc.nextLine();

		try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
				BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst))) {
			int data;
			while (true) {
				data = in.read();
				if (data == -1)
					break;
				out.write(data);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
[결과값]
대상 파일: ~~

[바이트 스트림과 문자 스트림의 차이]

문자를 입출력할 때에는 약간의 데이터 수정이 필요!
그래서 자바에서는 '문자 스트림' 이라는 것을 별도로 지원(이 스트림은 데이터 수정을 자동화 해준다.)

・바이트 스트림 :
①CPU가 알아듣는 파일 (.exe / .class)
②Byte 단위로 읽고 출력하는 스트림
→ OutputStream(=Writer out)
・문자 스트림 : 
①개발자가 알아듣는 파일 (.java / .txt)
②문자 단위로 읽고 출력하는 스트림
→ Writer(=OutputStream out)
[계산]
package IOStream;
import java.io.*;
public class D_WriterStream {
	public static void main(String[] args) {
		try (Writer out = new FileWriter("data.txt")) { // 문자 출력 스트림 생성
			out.write('A'); // 문자 'A' 저장
			out.write('한'); // 문자 '한' 저장
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

-----------------------------------------------------------------------
package IOStream;
import java.io.*;
import java.util.Scanner;
public class D_ReaderStream {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("읽을 파일: ");
		String src = sc.nextLine();

		try (Reader in = new FileReader(src)) {
			int ch;
			while (true) {
				ch = in.read();
				if (ch == -1)
					break;
				System.out.print((char) ch);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
[결과값]
읽을 파일: data.txt
A한

[계산]
package IOStream;
import java.io.*;
import java.util.Scanner;
public class IOWRStream {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("파일 생성: ");
		String ndt = sc.nextLine();

		System.out.print("내용 입력: ");
		String input = sc.nextLine();

		System.out.print("읽을 파일: ");
		String src = sc.nextLine();

		try (Writer out = new FileWriter(ndt)) {
			out.write(input);
		} catch (IOException e) {
			e.printStackTrace();
		}
		try (Reader in = new FileReader(src)) {
			int ch;
			while (true) {
				ch = in.read();
				if (ch == -1)
					break;
				System.out.print((char) ch);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
[결과값]
파일 생성: Test2.txt
내용 입력: 2023년 02월 23일입니다.
읽을 파일: Test2.txt
2023년 02월 23일입니다.

0개의 댓글