java中写文件操作时FileOutputStream和FileWriter的不同
发布时间:2025-05-25 07:29:24 发布人:远客网络
一、java中写文件操作时FileOutputStream和FileWriter的不同
1、FileOutputStream、FileInputStream和FileWriter、FileReader是常用的文件输入输出流,
2、其中FileOutputStream、FileInputStream是单字节写入和读取的,即每次读取和写入的单位为一个字节;
3、而FileWriter、FileReader是单字符写入和读取的,即每次读取和写入的单位为一个字符,
4、这个字符可能是一个字节,也可能是2个字节,如汉字,当然还要根据文件的编码格式。
二、Java中的FileInputStream,FileOutputStram,BufferedWriter
1、public class FileInputStream extends InputStream FileInputStream从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
2、public class FileOutputStream extends OutputStream文件输出流是用于将数据写入 File或 FileDescriptor的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。 3、public class BufferedWriter extends Writer将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
该类提供了 newLine()方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator定义。并非所有平台都使用新行符('\n')来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。通常 Writer将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter包装所有其 write()操作可能开销很高的 Writer(如 FileWriters和 OutputStreamWriters)。例如,
PrintWriter out= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
将缓冲 PrintWriter对文件的输出。如果没有缓冲,则每次调用 print()方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
三、有关java上传和File以及FileInputStream的区别
1、1:PostUploadInfo的js是页面<ai:fileupload标签自动加载的AIFileUpload.js里的方法
2、这里的ActionDocumentInfo.java注意与FtpUtilPro.java(它的一个upload方法有bug)的对比能
3、从这个bug要看出File与FileInputStream的区别,File不属于流,它只是用来屏闭不同文件系统,用来统一
4、描述文件的实体BEAN,new File时给它传入文件名称或是路径,它就会去根据参数查找对应的文件属性然后封装
5、成实体。用来处理判断该路径是一个文件还是路径,文件或路径的权限,修改时间等等,路径的子路径list等等目录操作。
6、File不属于文件流,只能代表一个文件或是目录的路径名而已.
7、而FileInputStream关注的是文件的内容,是用来进行文件读写等操作的二进制流类。大多数情况下,构造FileInputStream
8、时传递一个File对象做参数,也可以直接传递String的文件路径。
9、这个容易混淆的问题在FTP时候很容易出现,因为客户端点击浏览本地文件后在上传时在服务器端如果直接把客户端的
10、文件名称拿到,然后用new File(“文件名称路径”),再用new InputStream(File)来上传到FTP的话,其实就是相当于服务器
11、端在服务器本地找File(“文件名称路径”),然后往FTP上传,这是错误的。我们希望的是上传客户端的文件,而不是
12、服务器端的文件,所以这里应该是直接用apache的FileItem.getInputStream的结果直接upload,如下:
13、InputStream fileIn= item.getInputStream();////如果直接写成这样new FileInputStream(filePath);就会出现在服务器本机找file上传的问题
14、//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。
15、public void doUpload(HttpServletRequest request, HttpServletResponse response) throws Exception{
16、CustomProperty cp= CustomProperty.getInstance();
17、//调用apache控件上传文件,返回数组,第一个存放文件对象,第二个存放参数对象
18、Object obj[]= ApacheUploadTool.getUploadFileInfo(request);
19、if(fileList== null|| fileList.size()==0){
20、cp.set("MESSAGE","找不到上传的文件");
21、String editMode= HttpUtil.getParameter(request,"edit_mode");
22、String objectId= HttpUtil.getParameter(request,"OBJECT_ID");
23、String busiType= HttpUtil.getParameter(request,"BUSI_TYPE");
24、// System.out.println("================"+editMode);
25、for(int i=0;i<fileList.size();i++){
26、FileItem item=(FileItem)fileList.get(i);
27、String fileName= fixFileName(item.getName());
28、IDocumentInfoSV idao= CommonService.getIDocumentInfoSV();
29、docSize= String.valueOf(item.getSize());
30、String codetype= String.valueOf(StaticValue.CFG_FTP_PATH_CODE);
31、String ftpPathName= BaseDataCodeAction.getCodeName(codetype, busiType);
32、if(null==ftpPathName||"".equals(ftpPathName)){
33、throw new Exception("没有该业务对应的FTP路径配置!");
34、// System.out.println("ftpPathName="+ftpPathName);
35、FtpUtil ftpUtil= new FtpUtil(ftpPathName);
36、// FtpUtilPro ftpUtil= new FtpUtilPro(ftpPathName);
37、// System.out.println("item=="+item);
38、// System.out.println("item.getInputStream()=="+item.getInputStream());
39、InputStream fileIn= item.getInputStream();//new FileInputStream(filePath);//如果直接写成这样就会出现在服务器本机找file上传的问题
40、//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。
41、IBODocumentInfoValue[] retValues= CommonService.getIDocumentInfoSV().queryDocumentInfoList(Long.parseLong(busiType), Long.parseLong(objectId));
42、for(int j=0;j<retValues.length;j++){
43、String docName= retValues[j].getDocumentName();
44、ExceptionUtil.throwBossException(83000015,new String[]{fileName});
45、if(editMode.equals("addNew")){
46、// ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
47、ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
48、else if(editMode.equals("modify")){
49、// System.out.println("================"+HttpUtil.getParameter(request,"DOCUMENT_ID"));
50、String oldId= HttpUtil.getParameter(request,"DOCUMENT_ID");
51、IBODocumentInfoValue acond= new BODocumentInfoBean();
52、acond.setDocumentId(Long.parseLong(oldId));
53、IBODocumentInfoValue[] beanValues= idao.getDocumentInfo(acond,"",null);
54、if(null== beanValues|| beanValues.length==0){
55、throw new Exception("没有文档信息");
56、IBODocumentInfoValue beanValue= beanValues[0];
57、String oldFileName= beanValue.getDocumentName();
58、ftpUtil.upload(oldFileName, fileIn,FtpUtil.BIN);
59、aVirtualFileName= newFileName;
60、aVirtualFileName= aVirtualFileName+","+ newFileName;
61、cp.set("MESSAGE","附件"+aVirtualFileName+"上传成功!");
62、cp.set("VIRTUAL_FILE_NAME_LIST", aVirtualFileName);
63、cp.set("DOCUMENT_SIZE", docSize);
64、cp.set("MESSAGE",StaticValue.SYS_ERROR_INFO);
65、cp.set("MESSAGE",ExceptionUtil.getBossExceptionHint(ex));
66、ApacheUploadTool.showFileUploadMsg(response,cp);
67、附件是自己的ftp实现示例,和一些网上最简单的jsp上传的代码,也最能说明原理