-> 문자를 읽어들일때 쓴다
-> 이파일을 읽겠다
파일입력스트림 이름 : FileReader
-> 이렇게 선언하면 안됨
-> -1값을 정상적으로 표현하려면 4바이트 필요해서
-> 파일을 반환값 없으면 -1
전산의 보수값? 공부
-> import 안되는 자바 lang 패키지
-> 읽어들인 문자 추가하겠다 이렇게 하면
코드값으로 저장되는 타입 int로 써서
나중에 숫자로 쫘륵 써있음
ch 누적시킬때 char로 바꿔서 누적시키기
-> filenotfoundexception 만들필요없음
-> 부모가 ioexception
filenoitfoundexception 발생해도 IOexception 이 처리함
->한글자씩 읽어드리기
-> 성능상 문제만 없다면 이 버전으로 써도 괜찮음
서버로부터 (고객)으로부터 읽어들일 것 문자형식
txt 형식의 데이터를 보내주는 경우가 대부분
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]
-> 문자기반으로 동작해서 한글, 영어 상관없이 다 한글자로 처리함
ex01 복붙
-> 2글자읽기
-> readbyte[] 같은 애
배열은 덮어쓰기해서 재활용한다
실제로 읽어들인게 3글자인데 마지막 1글자는 이전 루프에서 읽었던 데이터임
-> 다시사용하면 안됨
-> 배열을 준비할때) 배열 처음부터 끝까지 읽어들인걸로 하면 안됨
-> 실제로 몇개를 읽어들인건지 counting해서 그만큼만 사용할 수 있게 해야함
-> 파라미터가 char[] 배열인 read 메소드
-> int를 반환하는
-> 못읽었을때는 0이 아니라 -1 반환
end of file의 정수값 : -1
readChar 배열길이 2개면 1,2글자
안녕/하세/요
-> 마지막에 글자가 없었을때는 -1읽음
-> 반환값이 string이거나 string으로 전달받는 파라미터가 없음
File reader는 string을 반환함
-> string처리위해서 다른 애 씀
string 이름 line
-> 한줄전체를 통째로 반환하는 애들
-> String이 -1을 반환하는건 불가능
-> String이 "없다"라는 뜻 : null
-> 파일의 내용을 동일하게 만들어주고 싶다 하면
-> line뒤에다가 \n(줄바꿈) 추가하면 됨
(BufferedReader 읽을때는 이걸로 하기!)
-> 어제했던거 한글의 경우 실패함
-> 서버가 보내주는 기본 스트림 환경(서버는 문자뿐 아니라 모든걸 다 보낼 수 있어야 해서 : byte Stream을 기본으로 씀)
-> byte로 보냈으니byte로 읽겠다 하면 한글의 경우 깨짐
-> 서버가 문자를 보내도 문자 스트림으로 바꿔서 보내면 성공할 수 있음
속도가 제일 좋은게 버퍼
-> BUFFED Import 하기
-> 한글 영어 섞어서 보내기
-> BYTE기반 스트림이라 그냥 보낼 수 없고 getBytes 로 바꿔서 보내야 함
getBytes
: 문자셋을 기준으로 문자열 byte[]로 분해해라
문자열 -> byte[]
문자열.getBytes(문자셋)
-> byte로 보낸것
inputstrea 바이트 입력 스트림
+(합친것)
reader 문자 입력 스트림
-> reader의 기반(문자입력스트림임)
문자 reader중에서 가장 성능이 좋음 -> BufferedReader(빠르고 사용법 쉬움)
server.dat은 byte기반이라 byte stream으로 읽는게 맞음
-> 원본에 줄바꿈 없음
-> 어제 한글은 깨져서 못읽던 것(inputstream reader끼우고 buffer까지 끼운것)
★★★ 많이 볼 코드!!
-> buffered생략가능
네트워크 서버에 필요한 Skill들 외우면 됨
(네트워크로 내려받을 수 있는 파일들은 입출력 스트림 써가면서 내려받아야 함)
-> 네트워크가 추가된 것
주소경로를 내려받는 작업을 할것
한시간에 한번씩 갱신되는 전국날씨 제공하는 엑셀 파일도 있음
주소를 제공되면 접속해서 내려받기!
웹접속시 사용할 수있는 코드 :
모양이 하나다 형태가 정해져있다. 정형화된 자원의 위치 표기법
-> 한글을 인코딩한것 받는쪽에서 디코딩
-> 폭염으로 바꾸기
호스트 컴퓨터(컴퓨터 주소)
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값나옴
★★제일 중요
-URLConnection 생성은 url클래스가 하는것
-> 타입이 맞지않아서 바꾸고
connection이 null이아니라면 생성이 잘 될것
400번대 오류, 500번대 오류
대표적으로 501번 코드 제일 많이 봄
-> 숫자를 못외워서 숫자를 필드값으로 바꾸는 경향이 있음
(ex) calendar 정수 추출값 기억 x -> year은 쉬움
-> 여기도 마찬가지로 httpurlconnection이 http 응답코드를 다 필드로 가지고 있음
-> 404 : 주소잘못쳤을때 발생 \
-> 파란색 필드값 : http_ok이면 200번(정상적으로 접속이 되는 상황)
-> 접속여부 확인해서 IF문으로 성공하면 작업할 수 있게 한다
-> 크롬이나 브라우저, 엣지로 접속했구나 확인하고싶을때 User-agent에 써있음
-> 정해진값
브라우저마다 다르게 동작하는 경우들
(코드값들을 확인하기 위해서)
요청헤더는 값이많음 그 중에 무엇으로 접속했는지 확인하기 위해서 씀
-> 지금 접속한 주소는 학원 홈피인데 이전에 접속한 주소는 뭘까?
-> null값 나올예정(이전에 접속한 것이없어서)
헤더값은 정해진 것들
-> 이것도 문서타입임(이 화면에 타입이 뭘로 되어있는가?-> 타입 : HTML
주소변경
-> 원했던 건 이것
-> get방식으로 요청이 들어갔다
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타입은 /(뒤에 슬래시가 붙음)
-> 여기까지 : 접속해서 확인하는 것 까지
읽을때는 입력스트림이 필요하다
그동안은 파일에 붙였고
지금은
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 작업임