IO流、文件流;文件上传下载

1. 字节流IO

//1、创建文件输入流
FileInputStream fis = new FileInputStream(realPath);
//2、创建缓冲区
byte[] buffer = new byte[1024];
int len;
//3、获取OutputStream对象
ServletOutputStream os = resp.getOutputStream();
//4、将FileInputStream文件输入流写入到缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
while ((len = fis.read(buffer)) != -1) {
    os.write(buffer,0,len);
}
//5、关闭流资源
os.close();
fis.close();

2. 字符流IO

File file = new File("C:\\Users\\acer\\Desktop\\Hello1.txt");//绝对路径
// 创建文件
//        file.createNewFile();
// creates a FileWriter Object
FileWriter writer = new FileWriter(file,false);
// 向文件写入内容
writer.write("我是最帅的\n");
writer.flush();
writer.close();
// 创建 FileReader 对象
FileReader fr = new FileReader(file);
char[] a = new char[50];
fr.read(a); // 从数组中读取内容
for (char c : a)
    System.out.print(c); // 一个个打印字符
fr.close();

3. 文件上传FileUpload

  • 文件上传的注意事项
    1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下, 比如放于WEB-INF目录下。
    2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
    3.要限制上传文件的最大值。
    4.可以限制.上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
  • 上传文件过程思路

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个Fileltem对象, 在使用ServletFileUpload对象解析请 求时需要DiskFileltemFactory对象。所以,我们需要在进行解析工作前构造好DiskFiletemFactory对象,通过SerletFileUpload对象的构造方法或setFileltemFactory()方法设置SerletFileUpload对象的fileltemFactory属性。

  • ServletFileUpload
    ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个Fileltem对象中 .使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个Fileltem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。

菜鸟教程:https://www.runoob.com/servlet/servlet-file-uploading.html

public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "./WEB-INF/upload";

    // 上传配置
    private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB

    /**
     * 上传数据及保存文件
     */
    @Override
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response) throws ServletException, IOException {
        // 检测是否为多媒体上传
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            PrintWriter writer = response.getWriter();
            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
            writer.flush();
            return;
        }
        // 1、配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // 设置临时存储目录
        //System.getProperty("java.io.tmpdir")--->获取操作系统缓存的临时目录
        /*
        不同操作系统的缓存临时目录不一样,
        在Windows的缓存目录为:C:\Users\登录用户~1\AppData\Local\Temp\
        Linux:/tmp
         */
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        //2、设置上传文件配置
        ServletFileUpload upload = new ServletFileUpload(factory);
        //监听文件上传进度:
        upload.setProgressListener((long p1, long p2, int Items) ->
                System.out.println("总大小:" + p2 + "已上传:" + p1));
        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);
        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        // 中文处理
        upload.setHeaderEncoding("UTF-8");
        // 构造临时路径来存储上传的文件
        // 这个路径相对当前应用的目录
        //request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY
        String uploadPath = request.getServletContext().getRealPath(UPLOAD_DIRECTORY) ;

        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();//创建目录
        }

        try {
            // 3、解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {//判断表单属性是否为文件类型
                        String uploadFileName = item.getName();//获取上传文件名
                        String fileName = new File(uploadFileName).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在控制台输出文件的上传路径
                        System.out.println(filePath);
                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message",
                                "文件上传成功!");
                    }
                }
            }
        } catch (Exception e) {
            request.setAttribute("message",
                    "错误信息: " + e.getMessage());
            e.printStackTrace();
        }
        // 跳转到 message.jsp
        request.getServletContext().getRequestDispatcher("/message.jsp").forward(
                request, response);
    }
}

你可能感兴趣的:(IO)