JAVA

이것이 자바다 18장 확인 문제 풀이 (IO 기반 입출력 및 네트워킹)

Adev 2022. 9. 21. 06:44

1. 입출력 스트림 - 프로그램을 기준으로 데이터가 들어오면 입력 스트립이고, 데이터가 나가면 출력 스트림이다.
답 : 1
하나의 스트림으로 입력과 출력이 동시에 가능하지 않다.
//스트림의 특성이 단방향이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없다.


2. Reader - 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.
답 : 1
이미지 데이터는 InputStream으로 읽을 수 있으나 Reader로는 읽을 수 없다.
//바이트 기반 스트림(InputStream)은 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보낼 수 있으나, 문자 기반 스트림(Reader)은 오로지 문자만 받고 보낼 수 있도록 특화되어 있다.


3. InputStream의 read(byte[], b, int off, int len) 메소드 
답 : 4
세 번째 매개값 len은 첫 번째 매개값 b에서 데이터가 저장될 마지막 인덱스가 아니다.
//입력 스트림부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다.


4. flush() - 버퍼에 잔류하는 모든 바이트를 출력한다.
답 : 1

 


5. 보조 스트림 - 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 말한다.
답 : 3
DataInputSream은 기본 데이터 타입의 값을 입출력하기 위한 보조 스트림이다.


6. ObjectInputStream, ObjectOutputStream - ObjectInputStream은 바이트 출력 스트림과 연결되어 객체를 직렬화하는 역할을 하고, ObjectInputStream은 바이트 입력 스트림과 연결되어 객체로 역직렬화하는 역할을 한다.
답 : 3
클래스의 serialVersinUID는 입출력할 때 모두 같아야 한다.


7.

package verify.exam07;

import java.io.BufferedReader;
import java.io.FileReader;

public class AddLineNumberExample2 {
public static void main(String[] args) throws Exception {
String filePath = "C:\Users\new\Desktop\NCS JAVA\origin thisjava ex\chap18\src\sec05\exam04_bufferedreader\BufferedReaderExample.java";

FileReader fr = new FileReader(filePath);
BufferedReader br = new BufferedReader (fr);

//방법1
int rowNumber = 0;
String rowData;
while((rowData = br.readLine())!=null) {
System.out.println(++rowNumber + ": " + rowData);

}
br.close(); fr.close();
}
}

//방법 2
                            int rowNumber = 1;
String rowData;
while((rowData = br.readLine())!=null) {
System.out.println(rowNumber++ + ": " + rowData); 

}
br.close(); fr.close();
}
}



8. TCP와 UDP - TCP는 연결 지향적 프로토콜이고, UDP는 비연결 지향적 프로토콜이다.
답 : 2
UDP는 데이터가 순서대로 전달되지 않으며, 데이터 손실이 발생한다.
//UDP는 연결 과정이 없기 때문에 TCP보다는 빠른 전송을 할 수 있지만 데이터 전달의 신뢰성은 떨어진다. 먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 도착할 수 있으며 일부 패킷은 잘못된 선로로 전송되어 잃어버릴 수도 있다.


9. TCP 클라이언트읭 연결 요청과 수락
답 : 
Soket socket = new Socket("localhost", 5001);
Soket socket = serverSocket.accept();


10. TCP 서버 연결 후 Socket으로 데이터를 입출력 하는 과정
답 : 
InputStream(읽음)      OutputStream(보냄)
OutputStrean(읽음)     InputStream(보냄)


11.

package verify.exam11;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Arrays;


public class ClientExample2 {
	public static void main(String[] args) throws Exception {		
		Socket socket = new Socket("localhost", 5001);
		OutputStream os = socket.getOutputStream();	
		
		String filePath = "C:\\Users\\new\\Desktop\\NCS JAVA\\origin thisjava ex\\chap18\\src\\sec04\\exam03_fileoutputstream\\house.jpg";
		File file = new File(filePath);
		
		String fileName = file.getName();
		byte[] fileNameBytes = fileName.getBytes("UTP-8");
		fileNameBytes = Arrays.copyOf(fileNameBytes, 100);
		os.write(fileNameBytes);
		
		System.out.println("[파일 보내기 시작] " + fileName);
		FileInputStream fis = new FileInputStream(file);
		byte[] bytes = new byte[1000];
		int readByteCount = -1;
		while((readByteCount = fis.read(bytes)) != -1) {
			os.write(bytes, 0, readByteCount);
		}
		
		os.flush();
		System.out.println("[파일 보내기 완료]");		
		
		fis.close();
		os.close();
		socket.close();
	}
}
package verify.exam11;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerExample2 {
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket();		
		serverSocket.bind(new InetSocketAddress("localhost", 5001));

		System.out.println("[서버 시작]");
		
		while(true) {
			try {
				Socket socket = serverSocket.accept();
	
				InputStream is = socket.getInputStream();

				byte[] bytes = new byte[1000];
				int readByteCount = -1;
				
				is.read(bytes, 0, 100);
				String fileName = new String(bytes, 0, 100, "UTF-8");
				fileName = fileName.trim();
				
				System.out.println("[파일 받기 시작] " + fileName);				
				FileOutputStream fos = new FileOutputStream("C:Temp/" + fileName);
				while(((readByteCount = is.read(bytes))) != -1) {
					fos.write(bytes, 0, readByteCount);
				}
				fos.flush();
				
				System.out.println("[파일 받기 완료]");
				
				fos.close();
				is.close();	
				socket.close();
			} catch(Exception e) {
				break;
			}
		}
		
		serverSocket.close();
		System.out.println("[서버 종료]");	
	}
}