카테고리 없음

230119

Berylly 2023. 1. 21. 20:46

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

 

230118

T.김동식 맵 리듀스 MapReduce *Reduce 축약하다 *하둡, 빅데이터 솔루션 구글에서 대용량 데이터처리를 목적으로 발표한 소프트웨어 프레임 워크 자바로 이루어짐. 예) A, A, B, C -> A 2, B 1, C 1 stream().red

sanghee.tistory.com

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("이것은 로그입니다.");