이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함
다시 JAVA로...🤷♀️
-
Java 에서는 System 외부로부터의 Data 도 다룰 수 있다.
-
우리는 system 안으로 또는 밖으로 이동하는 Data 의 흐름을 Stream 이라고 한다.
-
Java.io package 는 크게 Input Stream 과 Output 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
- action 속성의 이름이 "mkdirs"인 form 생성.
- name 이 path 이고 value 가 c:/img/temp 인 텍스트 박스 출력+전송 버튼
- action 속성의 이름이 "createNewFile" 인 form 생성.
- name 이 path 이고 value 가 c:/img/temp/test.txt 인 텍스트 박스 출력+전송 버튼
- action 속성의 이름이 "fileList" 인 form 생성
- name 이 path 이고 value 가 c:/ 인 텍스트 박스 출력+ 전송 버튼
- msg 변수에 EL 태그로 msg 값을 가져옴
- 만약 msg 가 공백이 아닐 시 경고메시지로 msg 띄움
- webservlet 어노테이션 통해서 경로가 "/mkdirs", "/createNewFile", "/fileList" 것들을 처리할 수 있게 함
- httpservlet 을 상속받아 doGet 메서드를 오버라이드해옴
URI 를 요청해와 uri 변수에 담음
contextPath 를 가져와 ctx 에 담음
uri 에서 ctx 길이부터 잘라 sub 변수에 담음
- FileModel 클래스를 model 로 객체화해옴
- page 변수에 index.jsp 를 담음(나중에 page 를 통해 index로 보내기 위해)
- name이 path인 애의 값을 변수 path 에 담음
- String 변수 msg 를 미리 선언해둠(아래서 msg 변수 사용 예정)
- 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 를 담음
- 변수 dis 에 page 로 보내는 메서드 담음
- forward 통해서 값을 dis 로 보냄
- makeFolder 메서드는 Srting 타입 path 를 매개변수로 받음
- File 클래스를 path 를 매개변수로 받아 객체화해옴
- msg 에는 "이미 존재하는 폴더입니다." 라고 담겨 있음
- 만약 folder 값이 false 면 (디렉토리가 존재하지 않으면)
folder 객체의 mkdirs 매서드를 실행해, 값이 true 가 되면 "폴더가 생성되었습니다.", 아니라면 "다시 시도해 주세요!" 를 msg 변수에 담음
반환값 msg;
- createNewFile 변수는 String 타입 매개변수 path 를 받고 예외가 일어나면 IOException 로 던짐
File 클래스에 매개변수 path 를 넣어 file 로 객체화
msg 에는 "이미 존재하는 파일입니다." 담음
만약 file 값이 false 면(파일이 존재하지 않으면)
file 객체의 createNewFile 메서드를 실행한 값이 true 면 "파일이 생성되었습니다." 아니면 "다시 시도해 주세요!" 가 msg 에 담김
반환값 msg;
- 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
- 테이블 스타일 지정
- 현재 경로를 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 키에 담긴 값을 보여줘
- InputStream 은 외부에서 파일을 읽어올 때 사용하고
- OutputStrem 은 파일을 외부로 내보낼 때 사용한다.
- InputStream 과 OutputStream 과정을 손님 맞이 후 함께 외출할 때와 비교해 보면 아래와 같다.
- 밖으로 내보낼 (Output) 때는 사용 후 반드시 모두 내보내 준다.
- 그리고 사용한 자원 (Stream) 은 반드시 닫아 줘야 한다.
File I/O
File reader
- FileReader 를 이용하여 텍스트 파일을 읽어와 출력하는 순서
testRead
File Writer
- 이번에는 FileWriter 를 사용해 사용자가 입력한 내용을 저장해 보자.
- Writer 는 내보내는 기능이므로 반드시 flush 해줘야 한다.
textWrite
요약
- System 의 들어가고 (input) 나가 (output) 는 모든 data 는 Stream 을 이용한다
- Text 파일을 읽고 쓸 때는 Reader 와 Writer 를 활용 한다
- 모든 Stream 은 사용 후 반드시 close 해 줘야 한다.
- OutputStream 은 추가로 flush 도 필수로 해줘야 한다.
File Upload & OutputStream
- 사용자 PC 에서 서버로 파일을 전송하는 것을 upload 라고 한다.
- Upload 된 파일은 서버 PC 에 저장되어야 한다.
- 얻어온 InputStream 으로부터 데이터를 읽어와
- OutputStream 을 사용해서 서버 PC 에 파일을 저장하는 순서
- action 속성이 write 인 form 생성/ get 방식으로 보낼 수 있는 크기에 한계가 있어서 post 타입으로 보냄 / 콘텐츠 타입이 문자 외에도 여러 가지로 구성되어 있음을 미리 요청
- name 속성이 title 인 텍스트 박스 출력 / name 속성이 content 인 텍스트박스 출력/
name 속성이 file 인 file 입력버튼 출력/
저장 버튼 출력
- 변수 msg 에 EL 태그로 msg 를 가져옴
만약 msg 가 공백이 아니면 경고 메시지로 띄움
-
webservlet 어노테이션 통해서 경로가 "/write" 인 것들을 처리할 수 있게 함
-
멀티 파트 콘피그 어노테이션으로 / 파일사이즈쓰레스홀드를(파일이 디스크에 기록될 때까지의 임계값을) 10mb로 설정 / 맥스파일사이즈(업로드될 파일의 최대 허용 크기)를 20mb 로 설정 / 맥스리퀘스트사이즈(파일을 포함한 요청의 최대 허용 크기) 를 50mb 로 설정
-
HttpServlet 을 상속받은 클래스
getPost를 오버라이드 받음
post 방식으로 받으면 한글이 깨지는 현상을 방지하기 위해 캐릭터 인코딩을 UTF-8로 설정
-
PartsUploadUtil 클래스를 util 로 객체화 해옴(파일, 파일명, 파라메터 등을 추출할 수 있는 클래스)
-
업로드된 사진의 파일명을 "file" 키로 가져와서 util 객체의 getFileName 메서드를 실행해서 값을 fileName 에 담음(파일명을 알아낼 수 있음)
-
업로드된 사진의 값을 "file" 키로 util 객체의 getStream 메서드를 실행해서 InputStream 타입의 is 변수에 담음 (파일을 읽어오기 위한 스트림을 얻어올 수 있음)
(왜 fileInput 이 아닌지? : 특정 파일 위치를 지정할 수 없다)
-
FileOutputStream 클래스에 파일 경로(c:/img/ 경로에 위에서 알아낸 파일명으로)를 담아 fos 로 객체화함 // file 로 내보내야 하니까
(
8. 클라에서 보내온 것을 받기 위해 변수 data 선언
9. data 변수에 is에 read 메서드를 사용해서 읽어옴 -1이 될 때까지
10. 읽어온 데이터를 fos 에 write 메서드를 사용해서 data를 내보냄
)
-
파일을 좀 더 빠르게 이동하기 위해 byte 배열에 1024 담아 한 번에 1024byte 만큼 이동할 수 있게 하여 cup 변수에 담음
-
while 문을 이용해서 is 객체의 read 메서드에 변수 cup 을 넣고 이게 -1 이 아닐 동안 실행문을 반복함
(read(byte) 사용 시 읽어들인 바이트 수와 -1 만 반환함)
is 객체를 InputStream 통해 read로 읽어옴
-
fos 객체의 write 메서드로 바이트들을 FileOutputStream 내보냄
-
읽어온 스트림 is 를 닫아주고
-
내보낸 스트림 fos 를 flush 로 완전히 빼낸 후 close 로 닫아줌
-
fileName이 저장되었습니다, 를 msg 키에 세팅해줌 / index.jsp 로 보냄
중간에 정리 못 한 것들은 SQL이 끝나고 다시 하자꾸나..