GDJ 9/6

Yongha Hwang·2023년 9월 6일
0

JAVA I.O

JAVA 에서는 System 외부로부터의 Data도 다를 수 있으며, system 안으로 또는 밖으로 이동하는 Data의 흐름을 Stream 이라고 한다.

1.Java Input&Output

Java.io package는 크게 InputStream 과 OutputStream 으로 나뉜다.

2.Input Stream & Output Stream

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

  • InputStream : 외부에서 파일을 읽어올 때
  • OutputStream : 파일을 외부로 내보낼 때

3.File 객체

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

public class FileModel {

	public String makeFolder(String path) {
		// 파일, 디렉토리 등을 다룰때는 무조건 File 객체를 사용한다.
		File folder = new File(path);
		String msg = "이미 존재하는 폴더 입니다.";
		
		if(folder.exists()==false) { // 디렉토리가 존재하지 않으면
			msg = folder.mkdirs()==true?"폴더가 생성 되었습니다.":"다시 시도해 주세요.";
		}
		return msg;
	}

	public String createNewFile(String path) throws IOException {
		
		File file = new File(path);
		String msg = "이미 존재하는 파일 입니다.";
		
		if(file.exists()==false) {
			msg = file.createNewFile()==true?"파일이 생성 되었습니다.":"다시 시도해 주세요.";
		}
		return msg;
	}

	public List<Map<String, Object>> fileList(String path) {
		File file = new File(path);
		File[] files = file.listFiles();
		
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		Map<String, Object> map = null;
		
		for (File f : files) {
			map = new HashMap<String, Object>();
			map.put("dir",f.isDirectory()); // 디렉토리 여부
			map.put("name",f.getName()); // 파일/디렉토리 이름
			map.put("size",f.length()/1024); // kb
			map.put("hidden",f.isHidden()); // 숨김 여부
			list.add(map);
		}
		return list;
	}

4. File I/O

		// 1. 읽을 위치 지정 + 2. 건드릴 파일을 객체화
		File file = new File("C:/img/temp/news.txt");
		
		// 3. 읽어올 빨대를 준비(InputStream | Reader).
		FileReader reader = new FileReader(file);
		
		// 4. 읽어온다.
		// read() 는 숫자를 반환(문자의 경우는 ASCII CODE 반환)
		// 더 이상 읽을 내용이 없으면 -1(End Of File)
		int data = 0;
		StringBuilder builder = new StringBuilder();
		while((data = reader.read()) != -1) {
			//System.out.print((char)data);
			builder.append((char)data);
		}		
		// 5. 다 사용한 자원은 닫는다.
		reader.close();

		// 1. 저장할 위치 지정 + 2. 파일 객체 생성
		File file = new File("C:/img/temp/user001.txt");
		// 3. 내보낼 스트림 준비(OutputStream, Writer)
		FileWriter fw = new FileWriter(file, true); // 쓸 파일과, 이어쓰기 여부
		// 4. 저장할 내용 입력
		fw.write(content+"\r\n"); // new line : 줄바꿈
		// 5. 내보내기+자원반납
		fw.flush();
		fw.close();        

5.File Upload & OutputStream

Upload : 사용자PC -> 서버 파일을 전송하는것

  • 규칙1 : POST로 보낼것 (get 방식의 제한된 크기를 넘기는 경우가 생기기 때문)
  • 규칙2 : 보내는 파라메터 콘텐츠타입이 문자 외에도 여러가지(Multipart)로 구성되어 있음을 알려야 한다.
<form action="write" method="post" enctype="multipart/form-data">
  • 규칙3 : 들어오는 파일의 크기를 제한해 줘야 한다.
@MultipartConfig(fileSizeThreshold = 10*1024*1024,maxFileSize = 20*1024*1024,maxRequestSize = 50*1024*1024)
// fileSizeThreshold  : 파일이 디스크에 기록될 때 까지의 크기 임계값
// maxFileSize          : 업로드 될 파일의 최대 허용 크기
// maxRequestSize   : 파일을 포함한 요청의 최대 허용 크기(multipart/form-data)

업로드중..

	    // 외부라이브러리의 힘을 빌려, 파일, 파일명, 파라메터 등을 추출 한다.
		PartsUploadUtil util = new PartsUploadUtil(req);

		System.out.println(util.getParams()); // 일반 파라메터 확인
		String fileName = util.getFileName("file"); // 파일명 알아내기
		
		InputStream is = util.getStream("file"); // 1. input stream 얻어 오기
		// 2. 밖으로 내보낼 OutputStream 준비 + 저장위치 설정
		FileOutputStream fos = new FileOutputStream("c:/img/"+fileName);
		
		/* 3. 파일의 데이터 읽기(기본적인 방식) - 네트워크에서 파일 전송시 이방법을 쓴다.
		int data = 0;
		while((data=is.read())!= -1) {
			System.out.println("저장중...");
			fos.write(data); // 4. 읽을 내용 쓰기			
		}
		*/
		// 조금 더 큰 숟가락으로 데이터를 이동해 보자
		// read(byte) 사용시 읽어들인 바이트수와 -1 만을 반환 한다.
		byte[] cup = new byte[1024];
		while(is.read(cup)!= -1) {
			System.out.println("저장중...");
			fos.write(cup);
		}				
		// 5. 자원 반납
		is.close();
		fos.flush();
		fos.close();

0개의 댓글

관련 채용 정보