티스토리 뷰
네트워크 프로그래밍에서 제일 중요한 요소 중 하나가 바로 입출력(I/O)이다. 우리가 사용하는 네트워크는 앞서 본대로 총 7개의 계층 사이에서 데이터의 송수신을 의미한다. 그렇기 때문에 네트워크 프로그래밍을 하기 위해선 해당 프로그램의 입출력에 대해 완벽하게 알고 있어야 한다. 이전에도 한번 소개를 한 적이 있었지만, 다시 한번 Java의 입출력에 대해서 알아 볼 것이고. 대표적인 입출력 방식인 스트림을 기반으로 알아 볼 것이다. 만약 Java가 아닌 다른 언어로 네트워킹 프로그램을 만들어야 하는 사람들에게 이번 글을 그리 중요하지 않을 것이다.
1. 출력 스트림
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Scanner; public class Soiution { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String input = sc.nextLine(); char[] CharInput = input.toCharArray(); try { OutputStream out = new FileOutputStream("output.txt"); getCharacters(out,CharInput); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void getCharacters(OutputStream out, char[] input) throws IOException{ byte[] line = new byte[100]; // size 100 for(int i=0; i<input.length; i++){ line[i]=(byte) input[i]; } out.write(line); System.out.print(line); } } | cs |
2. 입력 스트림
- close() : InputStream을 종료시키는 메소드
앞에서 Java가 버퍼로 동작한다는 것을 이해했다면 위의 메소드들을 쉽게 이해가 될 것이다. skip의 경우 프로그램 상에서 일부 데이터 전송을 원하지 않는다면 오버라이딩 작업을 통해 쉽게 누락 시킬 데이터와 보낼 데이터를 구성할 수 있다. 또한, Available()을 사용하면 입력스트림이 기다림 없이 바로 읽을 수 있는 최소 바이트수를 얻어 데이터 손실이 적은 프로그램을 만들 수 있다. 두 메소드 모두 네트워크 프로그래밍에서 크게 쓸 일은 없는 작업이다.
이번엔 파일을 읽어 Java 콘솔로 출력되는 프로그램을 만들어보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.io.FileNotFoundException; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Scanner; public class Soiution { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub try { InputStream in = new FileInputStream("output.txt"); getCharacters(in); in.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void getCharacters(InputStream in) throws IOException{ byte line; // size 100 int i = 0; while(in.read()!=-1){ int a = in.read(); line = (byte) a; System.out.print(line); i++; } } } |
이 프로그램을 실행시킨다면 출력 값이 아스키 코드로 나오는 것을 확인 할 수 있다. 우리는 네트워크 프로그램을 통해 아스키 코드로 작성된 데이터를 네트워크 환경으로 올리게 된다.
3. Reader, Writer 클래스
Reader와 Writer를 사용한다면 아래와 같이 더욱 쉽게 입출력을 구현 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Soiution { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Reader w = new FileReader("input.txt"); StringBuilder sb = new StringBuilder(); int c; while((c = w.read())!= -1){ sb.append((char) c); } System.out.println(sb); w.close(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Soiution { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Writer w = new FileWriter("output.txt"); w.write("Network"); w.close(); } } | cs |
'Skill > Programming - Network' 카테고리의 다른 글
6. 스레드 폴링, 콜백 (0) | 2019.05.07 |
---|---|
5. 스레드(Thread) (0) | 2019.04.27 |
4. 프로세스 관리 (Process Control) (1) | 2019.04.07 |
3. 프로세스(Process) (0) | 2019.03.27 |
1. OSI 7계층 (1) | 2019.02.17 |