T.김동식
바이트스트림: 그림, 멀티미디어, 문자, 모든종류의 데이터 입출력
문자스트림: 문자 데이터 입출력
바이트스트림: fileinputstream, fileoutputstream, bufferedinputstream, bufferedoutputstream
문자스트림: filereader, filerwriter, bufferedreader, bufferedwriter
*바이트스트림은 끝에 Steam이 붙는경우가 많다.
기반스트림: fileinputstream, fileoutputstream, filereader, filerwriter
보조스트림: inputscteamreader, outputstreamreader, bufferedinputstream, bufferedoutpurstream
*직접읽거나쓰는 기느을 제공하는 스트림인가, 아니면 자료를 읽거나쓰는기능없이 다른 스트림에 부가기능을 제공하는가.
바이트를 읽을 수 없다면 read()메소드는 -1을 리턴한다.
읽을 수 있는 것은 마지막 바이트까지 반복해 한 바이트씩 읽을 수 있음.
Buffer가 들어가지않으면 기반
FileReader: 입력, 문자, 기반
FileOutPutStream: 출력, 바이트, 기반
BufferedReader:입력, 문자, 보조
File
import java.io.File;
File file = new File("src/chapter15/img0_copy.jpg");
//java.io.File 문자지원, 메모장을 상상
System.out.println(file.isFile()); //false
System.out.println(file.isDirectory()); //폴더인가 false
file.delete(); //delete지원
System.out.println(file.getAbsolutePath()); //절대경로 C:\Users\409\eclipse-workspace\advanced\src\chapter15\img0_copy.jpg
System.out.println(file.getName()); //파일이름 img0_copy.jpg
System.out.println(file.getParent()); //상위폴더 src\chapter15
System.out.println(file.getParentFile()); //상위폴더 src\chapter15
FileWriter
String str = "Hello, sanghee";
String arr[] = {"Hello,", "sanghee"};
try (FileWriter fos = new FileWriter("src/chapter15/output.txt")) {
//java.io.FileWriter
fos.write(str); //문자열 작성
fos.write('\n');
for(String i:arr)fos.write(i+ " "); //배열 작성
} catch (Exception e) {}
removeAttribute + 화면/console 출력
https://sanghee.tistory.com/91/#code_1674036270227
context.setAttribute("deleteKey", "deleteValue");
context.removeAttribute("deleteKey");
response.setContentType("text/html; charset=utf-8");
PrintWriter pw=response.getWriter();
try {
List list = (List) context.getAttribute("deleteKey");
System.out.println("try&catch문 삭제확인: "+list.get(0));
System.out.println("try&catch문 삭제확인: "+list.get(1));
} catch (Exception e) {
System.out.println("리스트객체가 없습니다.");
pw.print("리트스객체가없습니다.");
}
파일복사
FileInputStream & FileOutputStream = 3665밀리세컨드 소요
메모리에 1byte씩 전달
import java.io.FileInputStream;
import java.io.FileOutputStream;
long ms = 0;
ms = System.currentTimeMillis(); //현재시각을 밀리세컨드 단위로 반환
try(FileInputStream fis =new FileInputStream("src/chapter15/img1_2000x992.jpg");
//bytes로 파일을 읽어온다.
//java.io.FileInputStream, A FileInputStream obtains input bytesfrom a file in a file system
//파일을 읽어올때는 없을 경우를 대비하여, 예외처리를 강제한다.
//java.io.FileInputStream.FileInputStream(String name) throws FileNotFoundException
FileOutputStream fos =new FileOutputStream("src/chapter15/img2_2000x992.jpg");) {
//파일로 내보낸다.
//java.io.FileOutputStream
//A file output stream is an output stream for writing data to a File or to a FileDescriptor.
int i; //변수를 설정하여
while((i=fis.read()) != -1) { //읽어온 fis를 read()읽어 -1(파일의 끝)값이 나올때까지 while
fos.write(i); //읽어온 fis.read()를 출력
}
} catch (Exception e) {e.printStackTrace();} //없을경우 안내
ms = System.currentTimeMillis() - ms;
System.out.println(ms); //3856
FileInputStream & FileOutputStream & BufferedInputStream & BufferedOutputStream = 2079밀리세컨드 소요
Buffered 완충제, 중간역할
버퍼를 생성해서 버퍼가 File을 한번에 받아준 후 1byte씩 메모리에 전달
이동 경로가 단축되어 시간 cost가 현저히 줄어든다.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
long ms = 0;
ms = System.currentTimeMillis();
try(FileInputStream fis =new FileInputStream("src/chapter15/img1_2000x992.jpg");
BufferedInputStream bif =new BufferedInputStream(fis);
//FileInputStream 파일을 불러와 BufferedInputStream에 저장한다.
//java.io.BufferedInputStream
FileOutputStream fos =new FileOutputStream("src/chapter15/img2_2000x993.jpg");
BufferedOutputStream bof =new BufferedOutputStream(fos);) {
//FileOutputStream을 BufferedOutputStream로 수행
int i;while((i=bif.read()) != -1) {fos.write(i);}
} catch (Exception e) {e.printStackTrace();}
ms = System.currentTimeMillis() - ms;
System.out.println(ms); //2079
BufferedReader 파일내용 출력하기
1. 통신을 이용하려면 바이트 기반으로 문자변경과정을 거쳐야함.
2. 파일 내용이 많을 경우 네트워크 속도에 따라 한계가 있어 버퍼 기능을 추가해야.
1,2를 충족하는 것이 BufferedReader
//파일생성 a.txt
회원등록 회원조회 회원수정, 주문조회 주문수정 주문취소, 상품조회 상품등록 상품수정 상품삭제
ServletContext context = getServletContext();
InputStream fis = context.getResourceAsStream("/WEB-INF/bin/a.txt");
BufferedReader buffer=new BufferedReader(new InputStreamReader(fis));
String str = buffer.readLine();
System.out.println(str);
//회원등록 회원조회 회원수정, 주문조회 주문수정 주문취소, 상품조회 상품등록 상품수정 상품삭제
FileInputStream & InputStreamReader
FileInputStrea만 이용하면 test í ì¤í¸로 출력
FileInputStream이 바이트 단위로 읽어들인내용을 문자로 변환. // test 테스트
try(InputStreamReader isr = new InputStreamReader(new FileInputStream("src/chapter15/a.txt"))) {
// FileInputStream 바이트 단위로 읽어들인내용을 InputStreamReader 문자로 변환
// Itreads bytes and decodes them into characters using a specified charset.
int i;
while((i=isr.read()) != -1) {System.out.print((char)i); } //파일내용이 끝날때까지 변환해출력
} catch (Exception e) {System.out.println("해당파일이 경로에 위치해있지 않습니다.");}
Serializable
Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.
객체를 역정렬할때 직렬화할때의 상태와 다르면(수정/이동등의 이벤트) 오류가 발생
직렬화할때 자동으로 serialversionid를 비교하고 uniqueid를 생성해 저장하여 내용변경이 되었을때 오류를 출력
이클립스에서는 이 과정을 자동으로 수행.
import java.io.Serializable;
public class Person implements Serializable{
//Serializability of a class is enabled by the class implementing thejava.io.Serializable interface.
private String name;
private String job;
public Person(String name, String job) {this.name = name;this.job = job;}}
ObjectOutputStream을 통한 마샬링(marshalling), Object로 내보내기
Person person1 = new Person("박상희1", "학생1");
Person person2 = new Person("박상희2", "학생2");
try (FileOutputStream fos = new FileOutputStream("serial.out"); // serial.out 파일을 만들고
ObjectOutputStream oos = new ObjectOutputStream(fos);) // 객체넣기
// Creates an ObjectOutputStream that writes to the specified OutputStream.
//마샬링(marshalling), 데이터를 바이트의 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업
{
oos.writeObject(person1); // 직렬화
oos.writeObject(person2); //직렬화
} catch (Exception e) {e.printStackTrace();}
System.in
console창으로 값 받기
int num = 0;
try {num =System.in.read();
} catch (IOException e) {System.out.println("입출력예외발생");}
System.out.println(num);
Scanner, next(), nextInt..
import java.util.Scanner;
Scanner sc =new Scanner(System.in);
int num3 =sc.nextInt(); //Scanner객체를 만들어서 nextInt() 숫자만 쓸수있게 한다.
System.out.println(num3+8);// 1 = 9
try catch with
따로 자원 해제를 해줘야 하는 불편함을 개선
//try(참조변수 = new 객체생성) { } catch() { }
try(FileInputStream fis = new FileInputStream("src/chapter15/a.txt")) {
System.out.println("파일이 있습니다.");
int i;
while((i = fis.read()) != -1) {//-1은 파일의 끝System.out.print((char)i);}System.out.println();
} catch (Exception e) {System.out.println("파일이 없습니다.");return;
}finally {}
//Aíê¸ìë
FileReader
FileInputStream은 byte단위를 사용해 한글이 깨지나, FileReader는 문자, char단위를 사용해 출력에 용이하다.
try(FileReader fis = new FileReader("src/chapter15/a.txt")) {
System.out.println("파일이 있습니다.");
int i;
while((i = fis.read()) != -1) {//-1은 파일의 끝System.out.print((char)i);}System.out.println();
} catch (Exception e) {System.out.println("파일이 없습니다.");return;
}finally {}
//A한글작동
StringTokenizer
import java.util.StringTokenizer;
//token, 하나의 덩어리
String str="회원등록 회원조회 회원수정, 주문등록 주문조회 주문수정";
StringTokenizer a = new StringTokenizer(str);
System.out.println(a.countTokens()); //6, 덩어리를 카운트.
while(true) {System.out.print(a.nextToken()+" ");} //회원등록 회원조회 회원수정, 주문등록 주문조회 주문수정
Python
Twitter 데이터 가져오기
#!pip install tweepy #tweepy설치
#안될경우 제거 후 설치 반복 !pip uninstall tweepy, !pip install tweepy
import tweepy #트위터 api에 접근할 수 있는 파이썬 패키지
tweepy.__version__ #버전 확인 '4.12.1'
# https://developer.twitter.com/en/portal/dashboard
# projects & apps - 프로젝트생성 - 프로젝트 - keys and tokens - Consumer Keys - regenerate - consumer_key/consumer_secret 복붙
# projects & apps - 프로젝트생성 - 프로젝트 - keys and tokens - Authentication Tokens - Access Token and Secret - access_token/access_token_secret 복붙
consumer_key="consumer_key"
consumer_secret="consumer_secret"
access_token="access_token"
access_token_secret="access_token_secret"
# 차후 사용을 위해 접근토큰을 저장하는 과정
# onsumer_key와 Secret을 전달해 OAuthHandler 인스턴스를 생성
auth=tweepy.OAuthHandler(consumer_key,consumer_secret)
# access_token와 access_token_secret를 전달해 OAuthHandler를 실핼할 수 있도록함.
auth.set_access_token(access_token, access_token_secret)
# api 인스턴스 생성
api=tweepy.API(auth)
api # api확인
# https://developer.twitter.com/en/portal/products
# twitter api v2 메뉴에 들어가 서술작성하여 제출해야 이용할 수 있다.
# screen_name 계정이름으로 timeline에서 게시물 불러오기
status = api.user_timeline(screen_name = 'sangheesuntae', count=1)[0]
status.text //'첫게시물, 트위터에서 직접 작성'
# tweet 작성자의 정보 가져오기
print("아이디: ",status.user.id) # ID
print("이름: ",status.user.name) # 이름
print("@이름: ",status.user.screen_name) # screen name (@뒤에 붙은 이름)
print("계정소개: ",status.user.description) # description
print("팔로워 수: ",status.user.followers_count) # 팔로워 수
print("팔로잉 수: ",status.user.friends_count) # 팔로잉하는 사람 수
계정이름으로 데이터 가져오기
# https://twitter.com/bok_hub 한국은행 트위터가 깔끔하게 잘 되어있다.
# @bok_hub
status = api.user_timeline(screen_name = 'bok_hub', count=1)[0]
status.text #첫번째 게시물이 출력된다.
# 리스트를 만들어 출력해보자.
tweet_list=[]
# tweepy.Cursor
# tweepy에서는 새로운 방식인 Cursor를 이용하는 방법을 권장하고있다.
# Cursor를 활용하면 limit없이 원하는 만큼의 tweet을 수집할 수 있다
# .items()수집을 원하는 양
for status in tweepy.Cursor(api.user_timeline, screen_name='bok_hub').items(2):
temp_list = [
status.text, #게시물
status.created_at, # 게시 일자
status.retweet_count, # retweet된 횟수
status.favorite_count # 좋아요 받은 횟수
]
tweet_list.append(temp_list)
#1번째 게시물 확인
tweet_list[0]
#2번째 게시물 확인
tweet_list[1]
#3번째 게시물 확인
tweet_list[2]
#3번째 게시물의 내용은 아래와 같다.
#[<BOK경제연구 제2023-2호> 소득동질혼과 가구구조가 가구소득 불평등에 미치는 영향: 국제비교를 중심으로]
# 출력된 결과는 tweet_list[0], 첫번째 게시물.
# tweepy.Cursor와 for문을 이용해 출력해보자.
for status in tweepy.Cursor(api.user_timeline, screen_name='bok_hub').items(3):
temp_list = [
status.text, #게시물
status.created_at, # 게시 일자
status.retweet_count, # retweet된 횟수
status.favorite_count # 좋아요 받은 횟수
]
tweet_list.append(temp_list)
for i in range(3):
print(tweet_list[i][0])
print("----------------------------------------------------------------------")
geocode
# 특정 geocode에서 트윗만 검색해 올 수 도 있다.
# geo코딩: 사람에게 익숙한 주소나 서술적인 지명을 지리적 수치좌표로 변환하는것
bok_hub = "%s,%s,%s" % ("35.95", "128.25", "1000km")
# q 포함된 tweet만 수집
statuses = api.search_tweets(q='한국은행', geocode=bok_hub, count=1)
status = statuses[0]
print(status.text) # tweet 내용
공공데이터 가져오기
# 마이페이지 - 오픈api - 개발계정 - 선택 - 계발계정상세보기
# 서비스정보 - 일반 인증키(Encoding) 복붙 - 미리보기 확인 - url 복사 - https를 http로 변경
url = 'http://apis.data.go.kr/B551177/AviationStatsByAirline/getTotalNumberOfFlight?serviceKey=5XuPPV5VGDCFRkKLKpJjPtOaFQ40BBH1EntSpoBLqgCOpx4cDwrpf6vQFAY%2B6wWQREdyS%2B%2FBH6MdmJsSjVKBCQ%3D%3D&from_month=201405&to_month=201405&periodicity=0&pax_cargo=Y&domestic_foreign=I&type=xml'
#url의 content를 가져온다.
import requests
requests.get(url).content
# xmltodict, json 형태(OrderedDict)로 xml을 파싱하는 라이브러리
!pip install xmltodict
import xmltodict
# xml을 파싱
xmltodict.parse(requests.get(url).content)
data = xmltodict.parse(requests.get(url).content)
data['response'] // 전체를 출력해 코드구조를 확인 한 후 반복문을 돌린다.
jsonData = data['response']['body']['items']['item']
두가지 방법으로 출력할 수 있다.
for x in range(20):
for y,z in jsonData[x].items():
print(y," :", z)
[print(y," :", z) for x in range(20) for y,z in jsonData[x].items()]
servlet
log
System.out.println("\n"+"\n"+"로그 출력하기");
context.log("이것은 로그입니다.");