입출력 스트림 Stream _1

하히호호·2024년 4월 18일
0

입출력 스트림

자바에서 데이터는 Stream을 총해 입출력된다.
스트림은 FIFO 형식으로 단일 방향으로 연속적으로 흘러간다.
위치에 따라 달라진다.

java.io

java.io 패키지에는 여러가지 종류의 스트림 클래스를 제공하고 있다.
크게 2가지 종류로 구분된다.

  • 바이트 byte기반 스트림
    :그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
  • 문자 character 기반 스트림
    : 문자 데이터를 읽고 출력할 때 사용

📝구별하는 방법은 최상위 클래스를 보면 된다.

바이트 기반 스트림

입력스트림 InputStream

InputStream 클래스를 상속받아서 만들어진다.

출력스트림 OutputStram

OutputStram 클래스를 상속받아서 만들어진다.

문자 기반 스트림

입력스트림 Readr

Readr 클래스를 상속받아서 만들어진다.

출력스트림 Writer

Writer 클래스를 상속받아서 만들어진다.

console과 file을 통한 입력

1. InputStreamReader와 BufferedReader 사용

package io;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class IoTest {
	public static void main(String[] args) throws Exception {
		//console과 file을 통한 입력
		//1. console을 통한 입력 (예전 방식)
		InputStreamReader in = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(in); //속도 조절
		System.out.print("이름은 ");
		String ir = br.readLine(); //Unhandled exception type IOException //예외처리
		System.out.println("이름은 " + ir);
		br.close();
		in.close();
	}
}

2. Scanner 사용


package pack5io;

import java.io.BufferedReader;
import java.io.InputStreamReader; //scanner가 없을때
import java.util.Scanner;

public class Ex34IoTest {
	public static void main(String[] args) throws Exception {
		//console과 file을 통한 입력
		
		//scnner 클래스
		Scanner scanner = new Scanner(System.in);
		System.out.print("이름은");
		String ir= scanner.nextLine();
		System.out.print("몸무게는");
		double w = scanner.nextDouble();
		System.out.println(ir+"님의 몸무게는 "+w);
		scanner.close();
	}
}

파일 데이터 가져와 읽어보자.

파일을 가져올때 반드시 저작권에 주의하자.

🔧사용할 데이터 준비

나라에서 제공하는 정보인 공공 데이터포털이 있다.
https://www.data.go.kr/
다양한 데이터들이 존재하는데, 전국 도서관 정보를 가져와보자.
(다른 데이터여도 상관없다.)

전국 도서관 표준데이터 검색 > csv를 다운 >

엑셀 파일이 다운로드 되었을 거다.
해당 파일을 메모장으로 열어보자.

메모장에는 csv 파일답게 데이터들이 ,(쉼표)로 되어있을 것이다.

(공공데이터이지만 혹시 몰라 색칠했다.)
중요한 것은 하단에 UTF-8로 되어 있는지 확인하는 것이다.
만약 UTF-8로 저장되지 않는다면
상단파일 > 다른이름으로 저장 > utf-8로 설정

위의 사진처럼 다시 저장을 해주면 된다 (덮어쓰기 OK)

✏️ 파일 읽기

System.out.println("전국 도서관 정보 파일 일부 읽기 =--=-=-=-=");
		//파일위치를 알려준다.
		File file = new File("c:/work/전국도서관표준데이터.csv");
        //파일에서 입력을 받는다.
		FileReader fr2 = new FileReader(file);
		BufferedReader br2 = new BufferedReader(fr2);
        
		int count = 0;
        //한 줄씩 값을 읽고 객체에 전달한다.
		String ss = br2.readLine();
		while (true) {
			count++;
			ss = br2.readLine();
			if (ss == null || count >= 10)
				break;
            //받은 파일을  ,(쉼표)단위로 잘라 입력해준다.
			StringTokenizer tok = new StringTokenizer(ss, ",");
			String s1 = tok.nextToken();
			String s2 = tok.nextToken();
			String s3 = tok.nextToken();
			String s4 = tok.nextToken();

			System.out.println(s1 + "\t" + s2 + "\t" + s3 + "\t" + s4);
		}
		System.out.println("건수: " + count);

BufferedReader

: Scanner와 유사gkek

Scanner보다 속도가 훨씬 빠르다.
왜냐하면 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성이 높인다.
BufferedReader는 많은 양의 데이터를 처리할 때 유리하다.

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글