使用io流实现文件拷贝,form表单提交,文件上传与下载

前言:
文件是存放在硬盘上的,要实现从一个地方拷贝到另一个地方,就要实现将文件流化放到内存中,在从内存中流化放到指定地方
慢速拷贝

		//得到文件,注意要在这个目录下要有这个Test.img文件
		File file = new File("E:\\work\\Test.img");
		try {
			//创建并绑定输入流
			InputStream in=new FileInputStream(file);
			//创建并绑定输出流
			OutputStream out=new FileOutputStream("E:\\workspace\\Test.img");
			int temp=-1;
			//每次通过输入流读出4个字节内容(temp为int类型)放到temp中
			while ((temp=in.read())!=-1) {
				//通过输出流将temp内的内容写到输出流绑定的位置
				out.write(temp);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

快速拷贝

//得到文件
		File file = new File("E:\\work\\Test.img");
		try {
			//创建并绑定输入流
			InputStream in=new FileInputStream(file);
			//创建并绑定输出流
			OutputStream out=new FileOutputStream("E:\\workspace\\Test.img");
			//创建数组容器,方便每次搬运1024字节(1KB)
			byte[] temp=new byte[1024];
			//每次通过输入流读出1024个字节内容(temp为int类型)放到temp中
			while ((in.read(temp))!=-1) {
				//通过输出流将temp内的内容写到输出流绑定的位置
				out.write(temp);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

文件上传与form表单提交

文件上传与文件拷贝原理相同,不同之处在于上传需要确定form表单编码与接收后解析数据属性

servlet接收,注意创建核心解析器工厂要导他的jar包

		//创建核心解析器工厂
		DiskFileItemFactory diskFileItemFactory= new DiskFileItemFactory();
		//创建解析器
		ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
		try {
			//接收页面数据
			List parseRequest = servletFileUpload.parseRequest(request);
			for (FileItem fileItem : parseRequest) {
				//判断是否为文本数据
				if(fileItem.isFormField()){
					//判断文本数据名是否与input内name一致
					if (fileItem.getFieldName().equals("stu_id")) {
						stu_id=fileItem.getString("UTF-8");
					}
				}else {
					//用否则判断为文件数据
					//得到文件名,注意部分情况下可能会得到一个完整的文件路径,建议截取下字符串
					String file_name=fileItem.getName();
					//文件数据关联输入流
					InputStream inputStream=fileItem.getInputStream();
					//输出流关联目标文件
					OutputStream outputStream=new FileOutputStream("D:\\ABC\\"+file_name);
					//从输入流内获取数据放入输出流
					byte[] b=new byte[1024];
					while ((inputStream.read(b))!=-1) {
						outputStream.write(b);
					}
					//释放资源
					outputStream.flush();
					outputStream.close();
					inputStream.close();
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

文件下载

文件下载原理基本类似于上面所诉,重点在于如何获取源文件

//file_name是通过ShowServlet查询出来后,又通过jsp页面传过来的
		//下载
		String file_name = request.getParameter("file_name");
		//获取文件
		File file = new File("D:\\ABC\\"+file_name);
		// 输入流绑定了源文件
		InputStream in = new FileInputStream(file);
		// 弹出附加格式下载框
		response.setContentType(getServletContext().getMimeType(file_name));
		// 创建附件格式下载文件
		response.setHeader("Content-Disposition", "attachment;filename="+ file_name);
		// 输出流关联目标位置
		OutputStream out = response.getOutputStream();
		byte[] b = new byte[1024];
		while ((in.read(b)) != -1) {
			out.write(b);
		}
		//释放资源
		out.flush();
		out.close();
		in.close();

你可能感兴趣的:(java,web)