jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Java

JAVA 자바 웹 개발 Day13 (Note): 입출력, 파일 클래스, 스트림, 스레드

2022. 2. 23. 21:55

 

2022/2/23

 

입출력

: java.io
io== I/O == Input/Output
개발자 입장에서 input: 사용자가 업로드-> 자바 안으로 가져온다
output: 자바에서 내보내기 -> download


File 클래스

: java.io.file
크기, 생성, 삭제, 변경 등등 파일에 관련된 내용을 관리하는 기능.
입출력 기능 x

 

1.  생성자
File​(String pathname): pathname 파일 전체 경로명을 작성하여 객체 생성
File​(String parent, String child): parent 디렉터리에 child 이름으로 서브 디렉터리나 파일을 작성하며 객체 생성

 

2.  객체 생성
File 변수 명 = new File(“전체 경로”); //파일에 해당하는 전체 경로를 문자로 넣어주기
File 변수 명 = new File(“디렉터리 경로”, “파일 명”);
*경로나 파일명 작성 시 확장자 명까지 꼭! 포함해서 작성

 

3.  주요 메서드
boolean mkdir(): 메이크 디렉터리(폴더)의 약자. 새로운 폴더 생성
String [] list(): 디렉터리 내 파일과 서브 디렉터리 리스트(이름)를 배열로 리턴
File [] listFiles(): 해당 디렉터리 내의 파일과 서브 디렉터리를 File 배열로 리턴
String getPath(): 경로 문자열로 리턴
String getAbsolutePath(): 절대 경로를 문자열로 리턴
String getParent(): 파일이나 디렉터리의 부모 디렉터리 이름 리턴
String getName(): 파일 또는 디렉터리의 이름 리턴
boolean isFile(): 파일이면 true
boolean isDirectory(): 디렉터리면 true
long lenth(): 파일이나 폴더의 크기 리턴
boolean exists(): 파일 또는 디렉터리가 존재하면 true
boolean createNewFile(): 빈 파일 생성. 위에 boolean exists()으로 존재 여부를 확인하고 생성하는 게 좋다.
boolean delete(): 파일 또는 디렉터리 삭제
boolean renameTo(File dest): dest 경로명으로 파일 이름 변경
long lastModified(): 마지막 변경 시간 리턴

*경로
절대 경로: C 또는 D드라이브부터 시작하는 전체 경로 (이게 훨씬 더 정확)
상대 경로: 내 현재 파일을 기준으로 말하는 경로
./  현재 폴더. 내가 속해있는 나의 위치. 지금 현재 폴더
../  상위
/ 안에~ 밑으로 내려갈 때~
위로 올라가고 들어가고.. 현재 내가 있는 폴더 기준으로 나갔다 들어갔다..


Stream 스트림

: 연속적인 데이터의 흐름. 데이터를 전송하는 소프트웨어 모듈. 이진수 데이터들이 돌아다니는 통로(선). -> 데이터를 목적지로 i/o 하기 위한 방법 중에 하나. 스트림이 없으면 무작위로 데이터를 던지는 것. 예를 들자면 물이 흐르는 수도관. 물이 원하는 곳으로 안전하게 잘 보내기 위해 사용하는 수도관…… 인터넷 쓸 때 데이터를 흩뿌리는 건 와이파이. 랜선 꼽아서 쓰는 게 스트림 (비유). 안 써도 되지만 데이터를 전송할 때 안정성이 높고 응용 프로그램 작성할 때 수용성이 높아진다.


-스트림은 단방향. 인풋 스트림 / 아웃풋 스트림 따로 있어야 함. ex) 애플 워치 워키토키, 무전기. 읽기 쓰기가 동시에 안된다.
-자바 응용프로그램은 입력 스트림과 출력 스트림과만 연결하고, 입출력 장치 제어하고 실질적인 입출력을 담당하는 것은 입출력 스트림이다.

입력장치 or 파일 ------> 입력 스트림-----> 자바 응용 프로그램
입력장치 or 파일 <-----출력 스트림 <-----자바 응용 프로그램

-자바에서 스트림을 통해 흘러가는 데이터의 기본 단위는 바이트나 문자이다.
자바 스트림 객체는 바이트 단위로 입출력하는 바이트 스트림과 문자 단위로 입출력하는 문자 스트림으로 나뉜다. 바이트 스트림을 다루는 클래스는 공통적으로 뒤에 Stream이 붙고 문자 스트림을 다루는 클래스는 뒤에 Reader/Write를 붙여 구분한다.

-FIFO: First In, First Out 선입선출 (큐)
-LIFO: Last In, First Out 후입 선출 (스택)

-스트림 쓰고 난 뒤에 꼭! close() 해주기.

스트림을 열었으면 사용 후 반드시 닫아줘야 누수가 안된다. 특히나 일대다로 연결했을 때는 반드시 닫아주기.

 

바이트 스트림

: 바이트 단위로 데이터 전송
파일을 바이트 단위로 나눠서 쪼개서 보낸다. 쪼갰다고 1바이트씩 보내는 게 아니라 하나의 바이트에 대한 정보들을 포함해서 같이 전송. 그래서 1 바이트를 보낼 때 2 바이트씩 같이 보내짐.

-다양한 클래스 제공으로 용도에 맞게 골라 사용
-이미지, 동영상 전송 가능 (바이트 단위라서)

 

1.   FileOutputStream
: 파일에 출력을 하기 위한 클래스
파일에 바이너리 데이터 저장.

①   생성자
FileOutputStream(File file) 파일 객체에 출력/ 저장 (기본이 덮어쓰기)
FileOutputStream(File file, boolean append) 파일 객체에 파일의 마지막부터 데이터 출력/ 저장

②   주요 메서드
void write(int b) 출력
void write(byte [] b)
void flush() 출력 스트림에 남아있는 바이너리 데이터 모두 출력. //변기 물 내리는 거 생각.
void close() 출력 스트림 닫고 관련된 시스템 자원 해제

2.   FileInputStream
: 데이터를 바이트 스트림으로 파일 읽는 스트림 클래스

①   생성자 (문서 참조)

②   주요 메서드
int read() //바이트니까 숫자로 리턴. 한 바이트 읽어서 int로 리턴
int read(byte [] b): b의 크기만큼 바이트 읽음. 읽는 도중 EOF (End of File)을 만나면 실제 읽은 바이트 수 리턴
int read(byte [] b, int off, int len) 바이트 크기만큼 off부터 시작해서 len까지 읽어라
void close()

EOF: Enf Of File 파일의 끝: read()할 때 EOF를 만다면 -1을 리턴한다.
byte 0xFF --> int 0x000000FF
EOF -1 int -> OxFFFFFFFF

문자 스트림

: 2바이트의 유니코드 문자를 단위로 입출력하는 스트림.
-문자화 되지 않는 바이너리 바이트 값들을 처리 불가 (이미지, 동영상 같은 것 처리 불가)
-input은 reader가 되고 output은 writer가 됨

 

1.  InputStreamReader
: 바이트 스트림을 문자 스트림으로 연결시켜주는 역할을 하는 보조 클래스
바이트 스트림의 데이터를 지정된 인코딩의 문자 데이터로 변환하는 작업을 수행
보조역할임. 바이트 스트림을 먼저 쓰고 문자 스트림으로 감싼다.
#인코딩
MS949 MS사에서 만든 한글 인코딩 체계.
윈도우에서 기본적으로 MS949를 사용함. 자바는 유니코드를 사용. 메모장에서 작성된 한글 파일을 자바에서 쓰려면 MS949로 인코딩을 해줘야 함. 특히 웹에서는 UTF로 통일해야..??

 

2.  OutputStreamWriter
: 파일에 텍스트 데이터를 저장할 때 원하는 인코딩으로 지정하여 저장. 인코딩 지정 안 하면 OS에서 사용하는 인코딩으로 데이터 저장 (eclipse에 지정한 인코딩)

Thread 스레드

1.  프로세스 process
프로그램을 수행하는데 필요한 데이터와 메모리 등 자원 + 스레드
싱글 프로세스: 하나의 프로그램을 돌리기 위해 한 개의 프로세스가 실행
멀티 프로세스: 하나의 프로그램을 돌리기 위해 여러 개의 프로세스가 실행

2.  멀티 태스킹
태스크 task: 프로세스가 하는 일 / 태스킹: 프로세스가 일을 하는 것
멀티 태스킹: 하나의 프로세스가 여러 일을 하는 것.

3.  스레드 Thread
하나의 테스크를 수행하는 일꾼
프로세스 = 공장(자원+일꾼), 스레드 = 일꾼
싱글 스레드 = 자원 + 일꾼
멀티 스레드 = 자원 + 일꾼 + 일꾼…… (일꾼이 여러 명)

4.  멀티 태스킹과 멀티 스레딩
멀티 태스킹을 실현하기 위한 2가지 방법
-멀티 프로세싱: 공장 여러 개 돌리기. 프로세스 간의 변수 공유가 다이렉트로 안된다. 이 공장에 이 자원.. 저 공장에 저 자원.. 통신으로 보내줄 수 있지만 데이터가 왔다 갔다 과도한 작업량 발생할 수 있다.
-멀티 스레딩: 하나의 응용 프로그램을 작업을 분할해서 작업의 개수만큼 스레드를 생성. 공장 하나에 일꾼이 여러 명. 자원과 메모리 공유가 쉽다.

5.  자바의 멀티 스레딩
JVM은 멀티 스레딩만 제공. 하나의 JVM은 하나의 자바 응용 프로그램만 돌림. 응용 프로그램은 하나 이상의 스레드를 생성할 수 있다. JVM 하나가 프로세스 하나다. 우리가 스레드를 여러 개 사용하도록 코드를 짤 수 있다. 개발자 입장에서 스레드를 만들기 위해선 스레드로 실행될 코드를 작성 JVM에 등록. 스레드 하나 만들 때 그 코드가 무슨 일하는지 작성하고 JVM에서 스레딩 요청

스레드 만들기
#개발자가 할 일
1. 스레드가 할 일 코드 작성
2. 스레드 생성해서 JVM에게 일하도록

#구현 방법

Thread 클래스 상속: 제어에 필요한 기능들을 이미 많이 가지고 있어서 이 방법을 많이 씀.

Runnable 인터페이스 구현: 문법적으로는 이게 더 확장성이 좋음.

 

1.  Thread 클래스 상속받아 스레드 만들기
주요 메서드
void run(): 중요! JVM에 의해 호출되는 핵심 메서드. 스레드가 실행할 코드 오버 라이딩하여 작성
void start(): JVM에게 스레드 실행하도록 요청
void interrupt(): 스레드 강제 종료
static void yield(): 다른 스레드에게 실행을 양보
String getName(): 스레드 이름 리턴
int getPriority(): 스레드 우선순위 값 리턴. 1~10 사이.
void setPrioority(int n): 우선순위를 n으로 지정
Thread.State getState(): 스레드의 상태 값 리턴
static void sleep(long millis): millis 시간 동안 스레드 멈추기
static Thread currentThread(): 현재 실행 중인 스레드 객체 리턴
void join(): 스레드 종료할 때까지 기다림

 

2.  Runnable 인터페이스로 스레드 만들기
Runnable 인터페이스는 run() 메서드 한 개만 가지고 있다.

 

3.  스레드 상태

 

4.  스레드 종료시키는 방법
#1. run() 종료
#2. interrupt() 호출

 

5.  스레드 동기화 Synchronization
멀티 스레드에서 공유 자원 혹은 공유 데이터에 동시 접근할 때 문제점 발생할 수 있다.
스레드 동기화 방법
-Synchronized로 동기화 블록 지정
-wait() –notify() 메서드로 스레드 실행 순서 제어

#1. 메서드 전체를 임계 영역으로 지정
synchronized void add(){
……
}
#2. 코드 블록을 임계 영역으로 지정
void execute(){
……
synchronized(this){
}
…
}

네트워크

1.  네트워크: 데이터 전송을 할 수 있는 통신망, 전자 장비들의 집합
노드 Node: 네트워크에 연결된 장비(장치)들
호스트 Host: 노드에게 하나 이상의 서비스를 제공해주는 노드

 

2.  OSI 7 계층 (정처기 준비하면 꼭 암기..) 모든 네트워크 통신에서 생기는 여러 가지 충돌 문제를 완화하기 위해 국제표준기구(IOS)에서 표준화된 네트워크 구조를 제시한 기본 모델.
7 응용층
6 표현층
5 세션층
4 전송층
3 네트워크층
2 데이터 링크층
1 물리층

 

3.  네트워크 유형
LAN: Local Area Network: 나와 같은 네트워크 간의 통신 -> 스위치를 통함
WAN: Wide Area Network

 

4.  IP(Address)
통신을 하는 기계의 네트워크상 주소
내 pc ip 주소 확인: cmd > ipconfig> IPv4

http://www.naver.com: 도메인 -> DNS에 의해 숫자로 구성된 ip 주소로 자동 변환.
http://ip:port

 

5.  port: 데이터를 주고받는 통로, 여러 개의 서비스를 해줄 때 서로 충돌이 나지 않도록 포트를 구분해서 만들어 놓음.
ip = 은행 지점/ port = 은행 안에 창구
포트 번호는 개발자가 임의로 선택 사용할 수 있으나 기존 응용 프로그램에서 사용하는 번호나 시스템 포트 번호는 피하는 것이 좋다.
잘 알려진 포트 번호: HTTP =80, HTTPS = 443, FTP = 21, Telnet =23 등
0~1023 사이의 번호를 사지며, 사용자 지정은 이 범위 피해서 선택하도록
내 pc에서 사용 중인 port번호 확인: cmd > netstat –a> 뒤에 포트번호 확인

 

6.  Protocol: 통신/ 전송 규칙
: IP 프로토콜 위에서 동작

JAVA.net

1.  InetAddress

    'Java' 카테고리의 다른 글
    • JAVA 자바 웹 개발 Day14 (Note): 람다식
    • JAVA 자바 웹 개발 Day13 (Code)
    • JAVA 자바 웹 개발 Day12 (Code)
    • JAVA 자바 웹 개발 Day12 (Note): 컬렉션 (ArrayList, Vector, Iterator, HashMap)

    티스토리툴바