文件输入输出流

来源:互联网 发布:app源码下载论坛 编辑:程序博客网 时间:2024/06/05 09:55

package servlet;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;


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


import model.CommodityType;
import net.sf.json.JSONObject;


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


import dao.imp.CommodityDao;


public class UploadHandleServlet extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


CommodityType comm = new CommodityType();
CommodityDao commDao=new CommodityDao();
JSONObject json=new JSONObject();
ArrayList<String[]> result=new ArrayList<String[]>();  
PrintWriter ou = response.getWriter();
// 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = "G:\\MyEclipse\\taopai\\WebRoot\\upload";
File file = new File(savePath);
// 判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + "目录不存在,需要创建");
// 创建目录
file.mkdir();
}
// 消息提示
String message = "";
try {
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String s[]=new String[2];
s[0] = item.getFieldName();
// 解决普通输入项的数据的中文乱码问题
s[1] = item.getString("UTF-8");
// value = new String(value.getBytes("iso8859-1"),"UTF-8");
result.add(s);
System.out.println(s[0] + "=" + s[1]);

} else {// 如果fileitem中封装的是上传文件
// 得到上传的文件名称,
String filename = item.getName();
System.out.println(filename);
if (filename == null || filename.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename
.substring(filename.lastIndexOf("\\") + 1);
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 创建一个文件输出流
comm.setTypeid(result.get(0)[1]);
comm.setTypename(result.get(1)[1]);
comm.setTypeimag(savePath + "\\" + filename);
FileOutputStream out = new FileOutputStream(savePath + "\\"
+ filename);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// + filename)当中
out.write(buffer, 0, len);    
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
System.out.println("文件上传成功");
}
} //for结束
   if(commDao.insert(comm)){
    message="添加成功";
    json.put("success", true);   
   }else{
    message="添加失败";
    System.out.println("json传输失败");
json.put("success", false);
   }
   request.setAttribute("message",message);
   request.getRequestDispatcher("/message.jsp").forward(request, response);
/*    ou.print(json);
ou.flush();
ou.close();*/


} catch (Exception e) {
message = "文件上传失败!";
e.printStackTrace();


}
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


doGet(request, response);
}
}

这是一个完整的上传文件实例。



下面这是文件上传原理的简介简写。

读取步骤:

1. 创建源对象

2.创建文件字节输入流对象(FileInputStream),并接在源上

3.进行IO操作(具体的读取操作)

4.关闭文件(必不可少的一步,如果操作文件,就得开通一个流对象关联我们得磁盘文件,如果不关闭资源,那么磁盘的文件一直被程序所引用着,不能删除,也不能更改.)

[java] view plain copy
  1. //文件字节输入流  
  2. public class FileInputStreamDemo {  
  3.   
  4.     public static void main(String[] args) throws IOException {  
  5.         //1 创建源对象  
  6.         File srcFile = new File("file/src.txt");  
  7.         //2 创建文件字节输入流对象,并接在源上  
  8.         InputStream in = new FileInputStream(srcFile);  
  9.         //3 IO操作(具体的读取操作)  
  10.         /* 
  11.          * 如果读到最后没有数据。则返回-1 
  12.          * int read() 读取一个字节,并返回读取的字节 
  13.          * int read(byte[] b) 读取多个字节,并存储到数组b中,从数组b的索引为0的地方开始存储,返回读取了几个字节 
  14.          * int read(byte[] b,int off,int len)读取len个字节,从数组b的索引为off的地方开始存储 
  15.          */  
  16.         //int data = in.read();获取src.txt 文件中第一个字节  
  17.         byte[] buffer = new byte[5];  
  18.         int len = -1;  
  19.         while((len = in.read(buffer)) != -1){  
  20.             String str = new String(buffer,0,len);  
  21.             System.out.println(str);  
  22.         }  
  23.         //4 关闭文件  
  24.         in.close();  
  25.     }  
  26. }  

0 0
原创粉丝点击