[IT국비지원] 개발자 교육 30일 차 : JAVA(2023.09.06)fit.구디아카데미,김지훈 강사님

Nicole Gold·2023년 9월 6일
0

K-digital training

목록 보기
31/60

이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함

다시 JAVA로...🤷‍♀️

JAVA Input Output

  • Java 에서는 System 외부로부터의 Data 도 다룰 수 있다.

  • 우리는 system 안으로 또는 밖으로 이동하는 Data 의 흐름을 Stream 이라고 한다.

  • Java.io package 는 크게 Input Stream 과 Output Stream 으로 나뉜다.

  • 그리고 바이트 기반과 문자 기반으로 분류된다.

Input Stream

  • Input Stream 은 byte 기반 최상위 class 이다.
  • 하위 클래스들은 각 특화된 분야가 있다.
  • 그래서 Input Stream 을 직접 사용하는 경우는 드물다.

Output Stream

  • Output Stream 은 byte 기반 최상위 class 이다.
  • 하위 클래스는 각 특화된 분야가 있다.
  • 그래서 Out Stream 을 직접 사용하는 경우는 드물다.

File 객체

  • File 은 I/O 에 해당하는 클래스는 아니다.
  • java 에서 file/directory 등을 다룰 수 있게 해주는 객체이다.
  • File 에 Data 를 읽고 쓰는 기능은 Stream 을 통해 이루어진다.

fileSystem

  1. action 속성의 이름이 "mkdirs"인 form 생성.
  2. name 이 path 이고 value 가 c:/img/temp 인 텍스트 박스 출력+전송 버튼
  3. action 속성의 이름이 "createNewFile" 인 form 생성.
  4. name 이 path 이고 value 가 c:/img/temp/test.txt 인 텍스트 박스 출력+전송 버튼
  5. action 속성의 이름이 "fileList" 인 form 생성
  6. name 이 path 이고 value 가 c:/ 인 텍스트 박스 출력+ 전송 버튼
  7. msg 변수에 EL 태그로 msg 값을 가져옴
  8. 만약 msg 가 공백이 아닐 시 경고메시지로 msg 띄움

  1. webservlet 어노테이션 통해서 경로가 "/mkdirs", "/createNewFile", "/fileList" 것들을 처리할 수 있게 함
  2. httpservlet 을 상속받아 doGet 메서드를 오버라이드해옴
    URI 를 요청해와 uri 변수에 담음
    contextPath 를 가져와 ctx 에 담음
    uri 에서 ctx 길이부터 잘라 sub 변수에 담음
  3. FileModel 클래스를 model 로 객체화해옴
  4. page 변수에 index.jsp 를 담음(나중에 page 를 통해 index로 보내기 위해)
  5. name이 path인 애의 값을 변수 path 에 담음
  6. String 변수 msg 를 미리 선언해둠(아래서 msg 변수 사용 예정)
  7. sub 변수를 넣었을 때
    경로가 mkdirs 라면 : model 객체의 makeFolder 메서드에 path 를 넣어 실행한 값을 msg 에 담음
    "msg"라는 이름으로 msg 값을 넣음
    경로가 createNewFile 이라면 : model 객체의 createNewFile 메서드에 path 를 넣어 실행한 값을 msg 에 담음
    "msg"라는 이름으로 msg 값을 넣음
    경로가 fileList 라면 : model 객체의 fileList 메서드에 path 를 넣어 실행한 값을 List<Map<String, Object>> list 에 담음
    "list"라는 이름으로 list 값을 넣음
    "path"라는 이름으로 path 값을 넣음
    page 변수에 result.jsp 를 담음
  8. 변수 dis 에 page 로 보내는 메서드 담음
  9. forward 통해서 값을 dis 로 보냄

  1. makeFolder 메서드는 Srting 타입 path 를 매개변수로 받음
  2. File 클래스를 path 를 매개변수로 받아 객체화해옴
  3. msg 에는 "이미 존재하는 폴더입니다." 라고 담겨 있음
  4. 만약 folder 값이 false 면 (디렉토리가 존재하지 않으면)
    folder 객체의 mkdirs 매서드를 실행해, 값이 true 가 되면 "폴더가 생성되었습니다.", 아니라면 "다시 시도해 주세요!" 를 msg 변수에 담음
    반환값 msg;
  5. createNewFile 변수는 String 타입 매개변수 path 를 받고 예외가 일어나면 IOException 로 던짐
    File 클래스에 매개변수 path 를 넣어 file 로 객체화
    msg 에는 "이미 존재하는 파일입니다." 담음
    만약 file 값이 false 면(파일이 존재하지 않으면)
    file 객체의 createNewFile 메서드를 실행한 값이 true 면 "파일이 생성되었습니다." 아니면 "다시 시도해 주세요!" 가 msg 에 담김
    반환값 msg;
  6. List<Map<String, Object>> : 반환값은 map 데이터를 list 에 삽입한 형태
  • 리스트(List)란 저장된 요소들의 순서가 있고 데이터에 중복이 가능하고 인덱스(index) 번호에 의해서 정렬된다. (배열과 비슷한 동작)
  • Map<String, Object> = 키 값은 String 형태, value 는 Object 형태
    매개변수 path 를 넣는 fileList 메서드가 실행되면
    File 클래스에 path 를 담아 file로 객체화 해옴
    file 객체의 listFiles 매서드를 실행해 값을 배열 변수 files 에 담음
    ArrayList 클래스를 list 로 객체화
    변수 map 이미 선언해둠(for 문에서 쓰기 위해)
    files 배열을 f 에 하나씩 담음
    HashMap 클래스를 map 으로 객체화 해옴
    map 변수에 put 으로 f의 디렉토리 여부를 넣음
    map 변수에 put 으로 f 의 파일/디렉토리 이름을 넣음
    map 변수에 put 으로 f 의 kb 길이를 넣음
    map 변수에 put 으로 f 의 숨김 여부를 넣음
    list 에 map 을 추가함
    반환값은 list

  1. 테이블 스타일 지정
  2. 현재 경로를 EL 태그로 가져온 path 로 보여줘라

(테이블 두 번째 행부터)
3. c 의 forEach 문으로 덩어리 list 들을 보여줘
4. file 객체의 hidden 키 값이 false 일 때만
(첫 번째 td 에는)
5. 만약 file 객체의 dir 키값이 true 면 /
링크 fileList 가 path 일 때 path /file 객체의 name 키값으로 이동하는 링크를 file 객체의 name 키값을 보여줘
6. 만약 file 객체의 메서드 isDirectory 의 값이 false 면 /
file 객체의 name 키값을 보여줘(링크x)
7.(두 번째 td 에는) file 객체의 size 키에 담긴 값을 보여줘

Input & Output

  • InputStream 은 외부에서 파일을 읽어올 때 사용하고
  • OutputStrem 은 파일을 외부로 내보낼 때 사용한다.
  • InputStream 과 OutputStream 과정을 손님 맞이 후 함께 외출할 때와 비교해 보면 아래와 같다.
  • 밖으로 내보낼 (Output) 때는 사용 후 반드시 모두 내보내 준다.
  • 그리고 사용한 자원 (Stream) 은 반드시 닫아 줘야 한다.

File I/O

File reader

  • FileReader 를 이용하여 텍스트 파일을 읽어와 출력하는 순서

testRead

File Writer

  • 이번에는 FileWriter 를 사용해 사용자가 입력한 내용을 저장해 보자.
  • Writer 는 내보내는 기능이므로 반드시 flush 해줘야 한다.

textWrite

요약

  1. System 의 들어가고 (input) 나가 (output) 는 모든 data 는 Stream 을 이용한다
  2. Text 파일을 읽고 쓸 때는 Reader 와 Writer 를 활용 한다
  3. 모든 Stream 은 사용 후 반드시 close 해 줘야 한다.
  4. OutputStream 은 추가로 flush 도 필수로 해줘야 한다.

File Upload & OutputStream

  • 사용자 PC 에서 서버로 파일을 전송하는 것을 upload 라고 한다.
  • Upload 된 파일은 서버 PC 에 저장되어야 한다.
  • 얻어온 InputStream 으로부터 데이터를 읽어와
  • OutputStream 을 사용해서 서버 PC 에 파일을 저장하는 순서

  1. action 속성이 write 인 form 생성/ get 방식으로 보낼 수 있는 크기에 한계가 있어서 post 타입으로 보냄 / 콘텐츠 타입이 문자 외에도 여러 가지로 구성되어 있음을 미리 요청
  2. name 속성이 title 인 텍스트 박스 출력 / name 속성이 content 인 텍스트박스 출력/
    name 속성이 file 인 file 입력버튼 출력/
    저장 버튼 출력
  3. 변수 msg 에 EL 태그로 msg 를 가져옴
    만약 msg 가 공백이 아니면 경고 메시지로 띄움

  1. webservlet 어노테이션 통해서 경로가 "/write" 인 것들을 처리할 수 있게 함

  2. 멀티 파트 콘피그 어노테이션으로 / 파일사이즈쓰레스홀드를(파일이 디스크에 기록될 때까지의 임계값을) 10mb로 설정 / 맥스파일사이즈(업로드될 파일의 최대 허용 크기)를 20mb 로 설정 / 맥스리퀘스트사이즈(파일을 포함한 요청의 최대 허용 크기) 를 50mb 로 설정

  3. HttpServlet 을 상속받은 클래스
    getPost를 오버라이드 받음
    post 방식으로 받으면 한글이 깨지는 현상을 방지하기 위해 캐릭터 인코딩을 UTF-8로 설정

  4. PartsUploadUtil 클래스를 util 로 객체화 해옴(파일, 파일명, 파라메터 등을 추출할 수 있는 클래스)

  5. 업로드된 사진의 파일명을 "file" 키로 가져와서 util 객체의 getFileName 메서드를 실행해서 값을 fileName 에 담음(파일명을 알아낼 수 있음)

  6. 업로드된 사진의 값을 "file" 키로 util 객체의 getStream 메서드를 실행해서 InputStream 타입의 is 변수에 담음 (파일을 읽어오기 위한 스트림을 얻어올 수 있음)
    (왜 fileInput 이 아닌지? : 특정 파일 위치를 지정할 수 없다)

  7. FileOutputStream 클래스에 파일 경로(c:/img/ 경로에 위에서 알아낸 파일명으로)를 담아 fos 로 객체화함 // file 로 내보내야 하니까

(
8. 클라에서 보내온 것을 받기 위해 변수 data 선언
9. data 변수에 is에 read 메서드를 사용해서 읽어옴 -1이 될 때까지
10. 읽어온 데이터를 fos 에 write 메서드를 사용해서 data를 내보냄
)

  1. 파일을 좀 더 빠르게 이동하기 위해 byte 배열에 1024 담아 한 번에 1024byte 만큼 이동할 수 있게 하여 cup 변수에 담음

  2. while 문을 이용해서 is 객체의 read 메서드에 변수 cup 을 넣고 이게 -1 이 아닐 동안 실행문을 반복함
    (read(byte) 사용 시 읽어들인 바이트 수와 -1 만 반환함)
    is 객체를 InputStream 통해 read로 읽어옴

  3. fos 객체의 write 메서드로 바이트들을 FileOutputStream 내보냄

  4. 읽어온 스트림 is 를 닫아주고

  5. 내보낸 스트림 fos 를 flush 로 완전히 빼낸 후 close 로 닫아줌

  6. fileName이 저장되었습니다, 를 msg 키에 세팅해줌 / index.jsp 로 보냄


중간에 정리 못 한 것들은 SQL이 끝나고 다시 하자꾸나..

profile
JAVA 개발자로 가는 길

0개의 댓글

관련 채용 정보