본문 바로가기
코딩도전기/I.O.

CODO Day26_JAVA_I.O(JAVA Input Output)

by 코도꼬마 2023. 3. 9.

JAVA I.O.(JAVA  Input Output)

  • Java에서는 System(STS) 외부의 data를 가져와서 다룰 수도 있음
  • Stream system 안과 밖으로 이동하는 Data의 흐름 또는 Data가 흐르는 통로
  • Java.io package는 크게 InputStreamOutputStream이 있음
    • 바이트 기반문자 기반으로 분류
JAVA I.O.
  Byte Base Character Base
input output input output
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 FileInputStream
BufferedInputStream
DataInputStream
FileOutputStream
BufferedOutputStream
DataOutputStream
FileReader
BufferedReader 
InputStreamReader
FileWriter
BufferedWriter
OutputStreamWriter


# 하위 클래스들은 각각 특화된 분야가 있어 최상위 클래스를 직접 사용 하는 경우는 드뭄

 

File 객체

  • java에서 file/directory 등을 다룰 수 있게 해주는 객체(I.O에 해당하는 클래스는 아님)
  • File에 Data를 읽고 쓰는 기능은 Stream을 통해 이루어
return method description
boolean createNewFile() 새 파일 생성
boolean mkdir() 새 디렉토리 생성(folder)
boolean mkdirs() 디렉토리 경로 생성
boolean delete() 파일 또는 디렉토리 삭제
boolean isDirectory() 디렉토리 여부
String getName() 이름을 가져옴
long length() 길이를 가져옴

 

  • index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style></style>
</head>
<body>
	<form action="mkdirs" method="post">
		특정 폴더 만들기 : <input type="text" name="path" value="C:/img/temp"/>
		<button>생성</button>
	</form>
	<form action="createNewFile" method="post">
		특정 파일 만들기 : <input type="text" name="path" value="C:/img/temp/test.txt"/>
		<button>생성</button>
	</form>
	<form action="fileList" method="get">
		파일 목록 보기 : <input type="text" name="path" value="C:/"/>
		<button>생성</button>
	</form>
</body>
<script>
	var msg = "${msg}"
	if(msg != ''){
		alert(msg);
	}
</script>
</html>

 

  • FileController
package kr.co.web.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.web.model.FileModel;

@WebServlet(urlPatterns = {"/mkdirs","/createNewFile","/fileList"})
public class FileController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
		dual(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
		dual(req, resp);
	}

	private void dual(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
		
		FileModel model = new FileModel(req,resp);

		String uri = req.getRequestURI();
		String ctx = req.getContextPath();
		String addr = uri.substring(ctx.length());
		String path = req.getParameter("path");

		switch (addr) {
		case "/mkdirs":
			//System.out.println("폴더 생성 요청 : " + path);
			model.makeFolder(path);
			break;

		case "/createNewFile":
			model.makeFile(path);
			break;

		case "/fileList":
			model.fileList(path);
			break;
		}
		
	}

}

 

  • FileModel
package kr.co.web.model;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileModel {
	
	HttpServletRequest req;
	HttpServletResponse resp;
	RequestDispatcher dis;

	public FileModel(HttpServletRequest req, HttpServletResponse resp) {		
		this.req = req;
		this.resp = resp;		
	}

	public void makeFolder(String path) throws ServletException, IOException {
		//java에서 File이나 Folder를 다룰 땐 File객체가 필요함
        //File객체를 객체화할 때는 경로를 지정해주어야함
		File folder = new File(path);
		String msg = "이미 존재하는 폴더입니다.";
		
		if(!folder.exists()) {
			folder.mkdirs();
			msg = "폴더가 생성되었습니다.";			
		}
		req.setAttribute("msg", msg);
		dis = req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);
	}

	public void makeFile(String path) throws IOException, ServletException {
		File file = new File(path);
		String msg = "이미 존재하는 파일입니다.";
		
		if(!file.exists()) {
			file.createNewFile();
			msg = "파일이 생성되었습니다.";		
		}
		req.setAttribute("msg", msg);
		dis = req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);
	}

	public void fileList(String path) throws ServletException, IOException {
		File dir = new File(path);		
		File[] files = dir.listFiles();
		
		HashMap<String, Object> map = null;
		List<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>();
		
		for(File file : files) {
			map = new HashMap<String, Object>();			
			map.put("dir", file.isDirectory());
			map.put("name", file.getName());
			map.put("size", file.length());
			list.add(map);
		}
		req.setAttribute("path", path);
		req.setAttribute("files", list);
		dis = req.getRequestDispatcher("result.jsp");
		dis.forward(req, resp);
	}

}

  #  java에서 File이나 Folder를 다룰 땐 File객체가 필요함
   File객체를 객체화할 때는 경로를 지정해주어야함

 

  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style>
	table, th, td{
	border: 1px solid black;
	border-collapse: collapse;
	padding: 5px 10px;
	text-align: center;
	}
</style>
</head>
<body>
	<h3>확인 경로 : ${path}</h3>
	<table>
		<tr>
			<th>이름</th>
			<th>크기(byte)</th>
		</tr>
		<c:forEach items="${files}" var="file">
			<tr>
				<td>
					<c:if test="${file.dir}">
						<a href="fileList?path=${path}/${file.name}">${file.name}</a>
					</c:if>
					<c:if test="${!file.dir}">${file.name}</c:if>
				</td>
				<td>${file.size}</td>
			</tr>
		</c:forEach>
	</table>
</body>
<script></script>
</html>

 

'코딩도전기 > I.O.' 카테고리의 다른 글

CODO Day29_JAVA_NIO(New Input / Output)  (0) 2023.03.14
CODO Day28_JAVA_I.O(SubStream)  (0) 2023.03.13
CODO Day27_JAVA_I.O(Stream/Upload)  (0) 2023.03.10