[Day27] I/O(입출력) , Reader, NetWork

NA YE SOM·2023년 8월 4일
0

java.io.Reader 클래스

ex05_Reader



-> 문자를 읽어들일때 쓴다


-> 이파일을 읽겠다

파일입력스트림 이름 : FileReader


-> 이렇게 선언하면 안됨


-> -1값을 정상적으로 표현하려면 4바이트 필요해서

-> 파일을 반환값 없으면 -1
전산의 보수값? 공부


-> import 안되는 자바 lang 패키지


-> 읽어들인 문자 추가하겠다 이렇게 하면
코드값으로 저장되는 타입 int로 써서
나중에 숫자로 쫘륵 써있음

ch 누적시킬때 char로 바꿔서 누적시키기


-> filenotfoundexception 만들필요없음

-> 부모가 ioexception

filenoitfoundexception 발생해도 IOexception 이 처리함

->한글자씩 읽어드리기
-> 성능상 문제만 없다면 이 버전으로 써도 괜찮음

서버로부터 (고객)으로부터 읽어들일 것 문자형식
txt 형식의 데이터를 보내주는 경우가 대부분

★★★txt 읽어들이는 방법 익히기 -> reader() 쓰기

read()

: 입력스트림으로부터 한개의 문자(2바이트)를 읽고
4바이트 int 타입으로 리턴 ->
리턴된 4바이트 중 끝에 있는 2바이트에 문자 데이터가 들어있음
(ex) 입력 스트림에 3개의 문자(6바이트)가 들어오면 read()메서드로 문자 하나씩 3번 읽을 수 있음

read()가 리턴한 int값을 char타입으로 변환하면 읽은 문자를 읽을 수 있음
char charData = (char)read();
더 이상 입력 스트림으로부터 문자를 읽을 수 없으면 read()를 -1을 리턴
-> 읽을 수 있는 마지막 문자까지 루프를 돌며 한 문자씩 읽을 수 있음
Reader r = new FileReader("파일경로");
int readData;
while((readData=r.read()) != -1){
char charData = (char) readData;
}

read(char[] cbuf)
: 입력스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장, 읽은 문자 수 리턴, 읽은 문자 수가 배열 길이보다 작으면 읽은 수만큼 리턴
(ex) 입력 스트림에 5개의 문자가 들어온다면 길이가 2인 문자 배열로 3번 읽을 수 있음 - 2,2,1개씩 읽음
-> 이 메서드 또한 더 이상 입력 스트림으로부터 문자를 읽을 수 없으면 read()는 -1을 리턴
-> 읽을 수 있는 마지막 문자까지 루프를 돌며 한 문자씩 읽을 수 있음
Reader r = new FileReader("파일경로");
int readCharNo;
char[] cbuf = new char[2];
while((readCharNo = r.read(cbuf)) != -1){...}
입력스트림으로부터 200개의 문자가 들어온다면 read()는 200번 루핑해서 읽어야 한다. 하지만 read(char[] cbuf)는 한번 읽을 때 주어진 배열 길이만큼 읽으므로 루핑횟수가 줄어듦.
-> 많은 양의 문자를 읽을때는 read(char[] cbuf)를 사용

read(char[] cbuf, int off, int len)
: 입력스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열 cbuf[off]부터 len까지 저장. 읽은 문자 수인 len개만큼 리턴하지만 읽은문자수가 len보다 작을 경우 읽은 수만큼 리턴
이 메서드도 역시 더 이상 입력 스트림으로부터 문자를 읽을 수 없으면 read()는 -1을 리턴
-> 읽을 수 있는 마지막 문자까지 루프를 돌며 한 문자씩 읽을 수 있음
Reader reader = new FileReader("파일 경로");
char[] cbuf = new char[100];
int readCharNo = is.read(cbuf, 0, 100);

출처 : [https://blog.naver.com/rain483/220627417522]

-> 문자기반으로 동작해서 한글, 영어 상관없이 다 한글자로 처리함

ex02_배열

ex01 복붙


-> 2글자읽기


-> readbyte[] 같은 애

배열은 덮어쓰기해서 재활용한다

실제로 읽어들인게 3글자인데 마지막 1글자는 이전 루프에서 읽었던 데이터임
-> 다시사용하면 안됨
-> 배열을 준비할때) 배열 처음부터 끝까지 읽어들인걸로 하면 안됨
-> 실제로 몇개를 읽어들인건지 counting해서 그만큼만 사용할 수 있게 해야함


-> 파라미터가 char[] 배열인 read 메소드


-> int를 반환하는


-> 못읽었을때는 0이 아니라 -1 반환

end of file의 정수값 : -1




readChar 배열길이 2개면 1,2글자
안녕/하세/요


-> 마지막에 글자가 없었을때는 -1읽음

ex03_BufferedReader


-> 반환값이 string이거나 string으로 전달받는 파라미터가 없음
File reader는 string을 반환함
-> string처리위해서 다른 애 씀



string 이름 line


-> 한줄전체를 통째로 반환하는 애들

-> String이 -1을 반환하는건 불가능
-> String이 "없다"라는 뜻 : null

-> 파일의 내용을 동일하게 만들어주고 싶다 하면

-> line뒤에다가 \n(줄바꿈) 추가하면 됨


★★★(추천) ex03() 속도가 제일 빠르고 쉬움

(BufferedReader 읽을때는 이걸로 하기!)

ex04



-> 어제했던거 한글의 경우 실패함


-> 서버가 보내주는 기본 스트림 환경(서버는 문자뿐 아니라 모든걸 다 보낼 수 있어야 해서 : byte Stream을 기본으로 씀)
-> byte로 보냈으니byte로 읽겠다 하면 한글의 경우 깨짐
-> 서버가 문자를 보내도 문자 스트림으로 바꿔서 보내면 성공할 수 있음

속도가 제일 좋은게 버퍼


-> BUFFED Import 하기


-> 한글 영어 섞어서 보내기


-> BYTE기반 스트림이라 그냥 보낼 수 없고 getBytes 로 바꿔서 보내야 함

getBytes
: 문자셋을 기준으로 문자열 byte[]로 분해해라
문자열 -> byte[]
문자열.getBytes(문자셋)



-> byte로 보낸것

InputStreamReader

inputstrea 바이트 입력 스트림
+(합친것)
reader 문자 입력 스트림


-> reader의 기반(문자입력스트림임)

문자 reader중에서 가장 성능이 좋음 -> BufferedReader(빠르고 사용법 쉬움)

  1. 바이트 기반의 데이터여서 바이트 스트림으로 읽고
  2. 리더로 바꾸고
  3. 버퍼를 끼워서 성능향상

server.dat은 byte기반이라 byte stream으로 읽는게 맞음


-> 원본에 줄바꿈 없음
-> 어제 한글은 깨져서 못읽던 것(inputstream reader끼우고 buffer까지 끼운것)

★★★ 많이 볼 코드!!

-> buffered생략가능

네트워크 서버에 필요한 Skill들 외우면 됨
(네트워크로 내려받을 수 있는 파일들은 입출력 스트림 써가면서 내려받아야 함)
-> 네트워크가 추가된 것

주소경로를 내려받는 작업을 할것
한시간에 한번씩 갱신되는 전국날씨 제공하는 엑셀 파일도 있음
주소를 제공되면 접속해서 내려받기!

19_Network

ex01

URL

웹접속시 사용할 수있는 코드 :

모양이 하나다 형태가 정해져있다. 정형화된 자원의 위치 표기법


-> 한글을 인코딩한것 받는쪽에서 디코딩

-> 폭염으로 바꾸기

호스트 컴퓨터(컴퓨터 주소)

serach.naver : 서버경로
?
?뒤 : 서버로 전송하는 데이터 : 파라미터=값
보낼것이 많을때는 : %로
파라미터 값을 연결해줌

초기주소로 'http;로 받을것
https는 돈주고 사는것
-> 우리 프로젝트는 임시프로젝트라서 돈주고 할필요없음


-> 하이퍼텍스트 : 인터넷 문서만들때 사용하는 언어
(ex) HTML (Hypertext MarkUP Image)


-> 호스트(서버주소)는 돈주고 삼
(ex) 삼성.com 같이 돈주고 삼

가비야 : 도메인

-> 1년에 500짜리도 있음
-> 이벤트로 세일하는 주소도 있음

-> 네이버검색 개발하는 팀에서 결정하는 것

-> search.naver라는 명칭을 쓰자 (우리가 만들어서 붙이는 주소)


-> 서버로 보낸 데이터(전달한 데이터)

-> 파라미터, URL MAPPING 등 분석할 수 있는 애


-> 웹 주소가 있을때 : 해당 웹 주소의 url 클래스를 가장 먼저 배치해서 필요하면 원하는 데이터 뽑고(2번) 아니면 3번 접속객체(url connection, 접속을 하기 위해서 접속객체 필요) 를 생성함

선언과 생성을 따로하는 이유는 try-catch때문임

-> checked exception 반드시 예외 필요

주소가 맞았는지 확인해서 틀리면 malformedURLexcpetion 발생하겠다


-> 예를들어 이렇게 //빠져있거나 하면 malformed(잘못된 형태)

(url에 생략된것 - 우리는 적을것)
호스트 뒤에 생략되면 기본포트(8080) 쓰고 있음(생략가능)

통신을 위해서 포트를 정하고 포트를 통해서 데이터 url를 주고받는것

만약 안적으면 -1값나옴

★★제일 중요

ex02()_접속해서 정보 확인하기

HttpURLConnection


openConnection

-URLConnection 생성은 url클래스가 하는것


-> 타입이 맞지않아서 바꾸고
connection이 null이아니라면 생성이 잘 될것

responseCode : 응답코드


400번대 오류, 500번대 오류

대표적으로 501번 코드 제일 많이 봄

-> 숫자를 못외워서 숫자를 필드값으로 바꾸는 경향이 있음
(ex) calendar 정수 추출값 기억 x -> year은 쉬움

-> 여기도 마찬가지로 httpurlconnection이 http 응답코드를 다 필드로 가지고 있음


-> 404 : 주소잘못쳤을때 발생 \


-> 파란색 필드값 : http_ok이면 200번(정상적으로 접속이 되는 상황)

-> 접속여부 확인해서 IF문으로 성공하면 작업할 수 있게 한다


-> 크롬이나 브라우저, 엣지로 접속했구나 확인하고싶을때 User-agent에 써있음

-> 정해진값

브라우저마다 다르게 동작하는 경우들
(코드값들을 확인하기 위해서)

요청헤더는 값이많음 그 중에 무엇으로 접속했는지 확인하기 위해서 씀


-> 지금 접속한 주소는 학원 홈피인데 이전에 접속한 주소는 뭘까?

-> null값 나올예정(이전에 접속한 것이없어서)

헤더값은 정해진 것들

★ User-Agent : 외우기

★ Referer : 외우기


-> 이것도 문서타입임(이 화면에 타입이 뭘로 되어있는가?-> 타입 : HTML


주소변경


-> 원했던 건 이것

요청메소드




-> get방식으로 요청이 들어갔다

★★★ (꼭 알아야함!! User-Agent!) 웹용어를 알아야 함

User-Agent(요청 헤더) : 무엇으로 접속했는가?

Refer(요청 헤더) : 이전 주소가 무엇인가?

Content-Type(요청 헤더) : 어떤 타입인가?

<요청 메소드>

1.GET : 주소(URL)를 이용한 데이터 전송

2.POST : 본문(Body)를 이용한 데이터 전송

라고 했을때 뜻을 알 수 있도록 공부하기
(자바코드보다는)

->컨텐트타입(아까 적은건 응답헤더) 은 다른데 있음 :요청헤더있다고 착각함

컨텐트타입꺼내는 메소드 : getContentType


-> 컨텐트 타입값이 나옴

-> 우리나라는 charset=UTF-8까지 적어야 함
text/html 정해진 값임
-> charset붙여서 통상작업함


-> 이미지를 화면에 나타내기 이전에 네모낳게 생긴 이미지 파일이 있을것임

-> 이미지 주소복사
https://ssl.pstatic.net/melona/libs/1456/1456783/898e76d144db9d4e9b18_20230803175043725.jpg

-> 이미지 content타입은 /(뒤에 슬래시가 붙음)

-> 여기까지 : 접속해서 확인하는 것 까지

읽기

ex03_웹상의 파일 읽기


읽을때는 입력스트림이 필요하다

그동안은 파일에 붙였고
지금은

int타입으로 읽든 byte[]단위로 읽든 (좋은 건 byte 배열 단위로 읽는것)
-> 이미지를 byte배열에 저장시키기


-> con 이미지파일 로부터 정보를 얻어낼수있는 getter로 이용해서 얻어내면 됌

(어제는 파일과 연결되는 것 : fileinputstream

오늘은 네트워크 접속하고 연결 : getInputStream )
-> 어제봤던 int단위로 읽거나 byte[] 단위로 읽는것

그림에다가 input이라는 내려받을(읽어들일) 통로를 뚫음



-> 길이알아내고 크기를 가져다 씀

-> 배열 b전달
반복문 없는 이유 : 한번에 다 안하고
길이를 그만큼 줘서

-> 읽어들일때는 finally를 해서 close를 잘하기


*접속해제
ex02_ 접속도 끝나면 접속해제 (생략할 수도 있지만)

ex03_finally에서 함

생성의 역순으로 닫기

-> close나 disconnect 닫는건 역순으로

connect이있어야 bin이 생김

-> byte배열에 저장만 해놓은거라서 눈에 보이는게 없음

byte배열에 있는걸 내보낼 것(바이트 배열에 있는걸 c드라이브 밑에 파일로 내보낼것)


-> 확장자 뺴기
-> /다음글자부터 끝까지

-> 통째로 가져가서 read읽기 밑에다가 두기


-> file로 만들기 위한 것


-> 보내는 행위가 여기서 시작




-> banner 옮기고


-> 메모리를 많이씀



-> 배운대로 1kyte씩 옮겨보기
(데이터가 짤려서 나옴, 데이터가 잘려서옴)


-> 여기서부터가 잘못됨(반복문없이 한번에 처리한다)

읽기, 쓰기 같이 해야함

실제로 읽은 바이트 수 필요

입력스트림 밑에다가 옮기기


읽기와 쓰기 합치기

-> bout으로 쓰는것 (읽어드린만큼, b배열의 0인덱스부터 readByte)만큼 write하겠다
(이방식이 맞음)

한번에 들어서 한번에 옮기는건 사용하지 x



-> 성공함

-> 주소만 알 수 있으면 다 받을 수 있음

네트워크 접속 이후 작업은 stream 작업임

profile
개발자 velog

0개의 댓글