读文件、写文件 ② OutputStreamWriter打开文件输出流,通过write方法以字符为单位写入文件,能够将字符数组和字符写入文件。 ③ PrintWriter打开文件输出流,通过print和println方法写字符串到文件,与System.out的用法相似,常用于写入格式化的文本。 ④ 通过以上各种文件输出流写数据到文件后,需要调用close方法关闭文件输出流。
//主要介方法1 readFileByBytes(String fileName){ File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字节:"); // 一次读一个字节 in = new FileInputStream(file); int tempbyte; while((tempbyte=in.read()) != -1){ System.out.write(tempbyte); } in.close(); } catch (IOException e) { e.printStackTrace(); return; } try { System.out.println("以字节为单位读取文件内容,一次读多个字节:"); //一次读多个字节 byte[] tempbytes = new byte[100]; int byteread = 0; in = new FileInputStream(fileName); ReadFromFile.showAvailableBytes(in); //读入多个字节到字节数组中,byteread为一次读入的字节数 while ((byteread = in.read(tempbytes)) != -1){ System.out.write(tempbytes, 0, byteread); } } catch (Exception e1) { e1.printStackTrace(); } finally { if (in != null){ try { in.close(); } catch (IOException e1) { } } } }
二、 写文件 ②、 OutputStreamWriter打开文件输出流,通过write方法以字符为单位写入文件,能够将字符数组和字符串写入文件。 ③、 PrintWriter打开文件输出流,通过print和println方法,与System.out的用法相似,常用于写入格式化的文件。 ④、 之后调用close方法关闭文件输出流。
//方法1、 writeFileByBytes(String fileName){ File file = new File(fileName); OutputStream out= null; try { // 打开文件输出流 out = new FileOutputStream(file); String content = "文件内容:/n1,The First line;/n2,The second line."; byte[] bytes = content.getBytes(); //写入文件 out.write(bytes); System.out.println("写文件" + file.getAbsolutePath() + "成功!"); } catch (IOException e){ System.out.println("写文件" + file.getAbsolutePath() + "失败!"); e.printStackTrace(); } finally { if (out != null){ try { //关闭输出文件流 out.close(); } catch (IOException e1) { } } } }
知识拓展: 基于JAVA 的文件上传组件的实现 1、上传信息格式 当用户选择了粘贴文件后就直接输入本地文件的绝对路径, 表单的action 属性值是*.jsp, 这意味着请求( 包括上载的文件) 将发送给*.jsp 文件。在这个过程中实际上就实现了HTTP 方式的文件上载。 对于文件上传, 虽然HTML 提供了一个比较好的方法, 可以像提交表单一们把目录指定到一个目录, 但是, JAVA却没有提供现成的接口, 来提取出上传的文件, 所以只能自行开发这个组件。必须通过ServletRequest 类的getInputStream( ) 方法获得一个客户端向服务器发出的数据流、对上传的文件格式进行分析, 根据分析结果将文件从数据流中正确的提取出来。在每个上传数据段, 都包括一个信息头, 信息头的内容主要包括上传数据的信息, 例如上传类型( 上传的是表单数据, 还是上传文件) , 如果是上传文件, 则包括文件名, 信息头是以一个回车符( CR) 加一个换行符( LF) 结束的。在信息头结束之后, 就是上传的数据了, 如果是上传文件, 就是文件的二进制流。数据内容是以一个回车符来结束。在通过HTTP协议来上传文件时, 是将文件全部放到输入流中,并以一定的分隔符来区分的。实际上, 接收上传的文件的关键就在于分析上面的信息格式, 确定分隔符的内容、各个文件的内容格式、文件的完整路径名称、及其文件的实际数据的始末位置。 2 算法描述 算法的简单处理过程如下:因为上传文件的大小不确定, 所以必须先设置一块缓存, 当缓存充满时, 就把内容输出到硬盘。当数据流打开以后, 根据信息的格式, 找到信息头结束符CRLF( 一个回车符加一个换行符) , 取出信息头, 分解出关于上传文件的信息( 例如文件名) 。然后就可以对上传文件的数据流进行接收了。但是, 在对数据进行接收的时候, 必须要通过一个读取分隔符的循环在缓存中寻找是否有分隔符, 判断文件是否结束。如果发现分隔符时, 就把分隔符之前的文件内容全部输出。如果没有, 就把缓存中前K+1-N( K,N为缓存和分隔符的长度) 个字节输出到硬盘中, 因为分隔符可能会因缓存的大小而不能完整的读入缓存。 此过程的算法如下所示: String ContentType=request.getContent( "Content- Type") ; int i = s.indexOf ( "boundary=") String Boundary = s.substring( i) ; //取得分隔符号: InputStream input=request.getInputStream( ) ; //打开输入流 Byte[] Buffer=new byte[4096] //设置缓存 SkipHeaderInformation( ) ; //跳过信息头 Boolean finished=false; //设置标记记录是否读完 While( ! finished) { buffer=readData( ) ; //向缓冲内读入数据 Int i=findEnd( ) ; //检查在这次循环中数据是否上传完毕 If ( i! =- 1) //如果这次数据可以输完 { WriteOut ( buffer,0,i) ; //输出数据 finished=ture; //设置标记, 判断是否上传完毕 } else //如果不能把数据输完 { WritteOut ( buffer,0,4096) //将缓冲内的数据全部输出 Finished=false; //设置标记为否 } } |
java I/O操作
最新推荐文章于 2024-10-14 08:13:56 发布