[계산] 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
보조 스트림 = 필터 스트림
스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있는 스트림.
보완하는 용도이기 때문에 실제 데이터를 주고 받지 않고, 데이터를 입출력할 수 있는 기능은 없다.
DataOutputStream > BufferedOutputStream > FileOutputStream의 순서로 사용한다.
[스트림]
바이트 기반 스트림
입력스트림 | 출력스트림 | 입출력 대상 종류 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
문자 기반 스트림
입력스트림 | 출력스트림 | 입출력 대상 종류 |
---|---|---|
FileReader | FileWriter | 파일 |
[보조스트림]
바이트 기반 보조 스트림
입력스트림 | 출력스트림 | 설명 |
---|---|---|
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 처리 |
BufferedInputStream | BufferedOutputStream | 버퍼를 이용한 입출력 성능향상 |
DataInputStream | DataOutputStream | int, float과 같은 기본형 단위로 데이터를 처리하는 기능 |
ObjectInputStream | ObjectOutputStream | 데이터를 객체 단위로 읽고 쓰는데 사용. 주로 파일일을 이용하며 객체 직렬화와 관련된다. |
문자 기반 보조 스트림
입력스트림 | 출력스트림 | 설명 |
---|---|---|
InputStreamReader | OutputStreamWriter | 바이트 기반 스트림을 문자 기반 스트림으로 연결 |
BufferedReader | BufferedWriter | 버퍼를 이용한 입출력 효율 향상 |
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 복사본이라는 이름으로 복사되었다.
필터 스트림 = 보조 스트림
[계산] 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일입니다.