-
10일차 - Java I/O프로그래밍 언어/자바(JAVA) 2024. 2. 5. 17:12
주요 용어 정리
스트림(stream)은 어느 한 쪽에서 다른 쪽으로 데이터를 전달할수 있도록 해주는 연결 통로같은 것이다.
스트림은 단방향통신만 가능하기때문에 입력과 출력을 동시에 처리하기 위해서는 입력을 위한 스트림과 출력을 위한 스트림, 2개의 스트림이 있어야한다.
채널(Channel)은 스트림과 달리 양방향으로 입력과 출력이 가능하다.
버퍼(buffer)는 byte, char, int 등 기본 데이터 타입을 저장할 수 있는 저장소로서, 배열과 마찬가지로 제한된 크기에 순서대로 데이터를 저장한다. 버퍼는 데이터를 저장하기 위한 것이지만 실제로 버퍼가 사용되는 것은 채널을 통해서 데이터를 주고 받을 때 쓰인다.
1. 핵심 정리
그림으로 정리해두기 그림으로 정리해두기
그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기 그림으로 정리해두기
2. Scan
// system 으로부터 받아온 것을 Scanner 로 받겠다 Scanner scan = new Scanner(System.in); // system 으로부터 밖으로 내보낸다 // print 할 내용을 (ln 은 줄바꿈을 의미한다) System.out.print("문자열 입력>"); // 입력받은 문자열을 변수에 저장한다 String inputStr = scan.nextLine(); System.out.println(inputStr); System.out.println(); // 아무 의미 없는 공백 출력 후 콘솔 줄바꿈 // 정수 System.out.print("정수 입력>"); int inputInt = scan.nextInt(); System.out.println(inputInt); System.out.println(); // 실수 System.out.print("실수 입력>"); double doubleInt = scan.nextDouble(); System.out.println(doubleInt); System.out.println();
3. File I/O
스캐너로 입력받은 내용을 텍스트 파일에 저장하자
String src = "C:/img/temp/sample.txt"; // Scanner 입력 받은 내용을 문자열 Text 에 저장한다 Scanner scan = new Scanner(System.in); // text 리스트에 한줄씩 입력 받은 내용을 저장한다 // 공백을 입력 받게 되면 멈춘다 List<String> text = new ArrayList<String>(); String temp = " "; System.out.println(""); while (temp.equals("") == false) { temp = scan.nextLine(); text.add(temp); } // sample.txt 저장 // 1. 파일 경로 지정 File inputFile = new File(src); // 2. 파일이 존재 하지 않으면 생성 if (inputFile.exists() == false) { inputFile.createNewFile(); } // 3. 빨대 만들기 FileWriter writer = new FileWriter(inputFile, true); for (String t : text) { // 4. 문자열 배열 text 에 저장된 내용을 한줄씩 writer 로 통해 파일에 작성한다 // 이때 writer 객체 생성자에서 true 이므로 이어쓰기이다 writer.write(t + " \r\n"); } // 5. 자원 반납(flush+close) scan.close(); writer.flush(); writer.close();
4. 주 스트림과 보조 스트림
주 스트림은 디바 즉 사람, 보조 스트림은 디바의 메카이다
사람이 차에 탑승 함으로써 사람이 낼 수 있는 속력보다 훨씬 큰 속도를 가진다
다른 기능이 필요하면 다른 차에 탑승해서 이용할 수 있다
1. 보조스트림은 주스트림이 없는 기능을 제공해준다
2. 보조스트림은 탑승의 개념이다
4.1 자바의 고유 데이터 타입을 저장하자, DataStream
■ 데이터 타입에 맞게 읽어 와야한다 꼭 반드시!!!
// 특정한 데이터를 저장하고 내보내기 // 1. 읽거나 쓸 파일의 경로를 저장 String src = "C:/img/temp/data.dat"; // 2. 경로를 바탕으로 File 객체를 생성 // 3. 원하는 스트림으로 File 객체를 입력을 넣어 생성한다 FileOutputStream fos = new FileOutputStream(new File(src)); // 3-1. 보조 스트림 생성 (쓰기 성능 증가 + java 고유 데이터 타입을 저장한다) BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); // 4. 스트림을 통해 읽기 또는 쓰기 작업한다 // 쓰기 작업 dos.writeUTF("김정원"); dos.writeInt(1); dos.writeBoolean(true); // 읽기 작업 FileInputStream fis = new FileInputStream(new File(src)); BufferedInputStream bos = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bos); // 4. ★★★★★ 데이터 타입에 맞게 한줄 한줄 읽어와야한다 String name = dis.readUTF(); int salary = dis.readInt(); boolean promotion = dis.readBoolean(); System.out.println(name + "/" + salary + "/" + promotion); // 5. 스트림을 close 해준다 dis.close(); // 5. 스트림을 flush 와 close 해준다 dos.flush(); dos.close(); // 6. 결과를 사용자에게 출력한다
5. 오늘의 핵심, 파일 스트림의 작동과정
// 1. 원본과 복사본 파일의 경로를 src, src_copy 에 저장한다 // 2. src, src_copy 저장된 경로를 통해 주 스트림 객체 fis, fos를 생성한다 // 3. 주스트림을 버퍼스트림에 탑승시켜 객체를 생성한다. // 3-1. 버퍼스트림을 왜 사용하는가? // 주스트림은 직접 디스크에 접근해서 상대적으로 읽고 쓰는 속도가 느리다 하지만 // 버퍼 스트림은 내부에 버퍼를 가지고 있어 실제로 디스크에 접근하는 횟수를 줄여 속도가 빠르다 // 4. bis의 read() 메소드는 원본 데이터를 읽어와 data에 저장한 다음, bos의 writer() 에 data 값을 입력하여 복사본의 데이터로 전달된다 // 5. 마지막으로 스트림을 flush 로 bos의 버퍼 내부를 비워주고, close 로 스트림을 닫는다 // 5-1. 스트림의 자원을 반납하고, 닫지 않아주면 계속 열려 있어 다른 프로그램에서 수정이 불가능하다 String src = "C:/img/ascil.txt"; String src_copy = "C:/img/temp/ascil_copy.txt"; FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(src_copy); BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); int data = 0; while ((data = bis.read()) != -1) { bos.write(data); System.out.println(data); } bis.close(); bos.flush(); bos.close();
직렬화 (serialize)
문제 : 왼쪽의 Object 가 너무 커서 파이프에 안들어간다
해결 : 직렬화로 여러 조각으로 쪼개서 일렬로 쭉 나열한다
수신 쪽에서는 쪼개진 조각을 받으면 설명서를 참고해서 다시 조각을 맞춘다
=> 클래스를 전송하기 위해서는 직렬화(잘개 쪼개 일렬로 보내는 것)가 필요하다
다시 맞추기 위해서는 설명서(인터페이스)가 필요하다
Properties
■ Properties 는 Map 자료구조와 매우 비슷하다 key-value 의 형태는 Object로 저장된다
■ Map 자료구조를 사용하듯이 향상된 for 문으로 읽어오면 된다
NIO, java.nio
■ JAVA 1.8 이상부터 사용가능하다 환경에 따라서 호환되지 않을 수 있다
■ 스트림이 아니고 채널를 사용하고, 버퍼가 탑재되어있어 편리하다
■ 파일 경로, 파일 정보, 파일 다루기를 클래스를 따로 따로 구분지어놔서 불편하다
'프로그래밍 언어 > 자바(JAVA)' 카테고리의 다른 글
2일차-연산자 (0) 2024.02.05 1일차-변수, 메서드 (0) 2024.02.05 9일차 - Iterator (0) 2024.02.02 8일차 - 컬렉션 프레임워크 (0) 2024.02.01 8일차 - 예외, 에러 (0) 2024.02.01