java I/O操作

读文件、写文件
一、       读文件:
①      FileOutputStream打开文件输出流,通过write方法以字节为单位写入文件,是写文件是通用的方法,能写入任何类型的文件,特别适合写二进制数据的文件。

②      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) {

                            }

                     }

              }

       }
 

 

 

二、        写文件
①、              FileOutputStream打开文件输出流,通过write方法以字节为单位写入文件,是写文件最通用的方法,能写入任何类型的文件,特别适合写二进制数据的文件。

②、              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 的文件上传组件的实现
概述:
在Internet 上, 我们经常遇到要上传文件的情况( 例如上传照片, 发送附件) , 这个过程在浏览器上看着非常简单, 但是, 在服务器端, 对这个文件的接收的实现却并不容易。程序员大都采用一些大公司商业版的上传组件, 来实现文件的接收功能。以下描述一个文件上传组件的实现。

1、上传信息格式
在过去的Html 中, 表单不能实现文件的上传, 这多少限制了一些网页的功能。RFC1867 规范( 即Html 中实现基于表单的文件上传) 对表单作出了扩展, 增加了一个表单元素〈inputtype=file>。通过使用这个元素, 浏览器会自动生成一个输入框和一个按钮, 输入框可供用户填写本地的文件名和路径名, 按钮可以让浏览器打开一个文件选择框供用户选择文件。

当用户选择了粘贴文件后就直接输入本地文件的绝对路径, 表单的action 属性值是*.jsp, 这意味着请求( 包括上载的文件) 将发送给*.jsp 文件。在这个过程中实际上就实现了HTTP 方式的文件上载。

对于文件上传, 虽然HTML 提供了一个比较好的方法, 可以像提交表单一们把目录指定到一个目录, 但是, JAVA却没有提供现成的接口, 来提取出上传的文件, 所以只能自行开发这个组件。必须通过ServletRequest 类的getInputStream( ) 方法获得一个客户端向服务器发出的数据流、对上传的文件格式进行分析, 根据分析结果将文件从数据流中正确的提取出来。在每个上传数据段, 都包括一个信息头, 信息头的内容主要包括上传数据的信息, 例如上传类型( 上传的是表单数据, 还是上传文件) , 如果是上传文件, 则包括文件名, 信息头是以一个回车符( CR) 加一个换行符( LF) 结束的。在信息头结束之后, 就是上传的数据了, 如果是上传文件, 就是文件的二进制流。数据内容是以一个回车符来结束。在通过HTTP协议来上传文件时, 是将文件全部放到输入流中,并以一定的分隔符来区分的。实际上, 接收上传的文件的关键就在于分析上面的信息格式, 确定分隔符的内容、各个文件的内容格式、文件的完整路径名称、及其文件的实际数据的始末位置。

2 算法描述
因为, 在JAVA中没有提供现成的接收上传文件的接口, 所以, 这个过程要程序员自己来实现。当以二进制流的形式来读取上传的文件时,所得到的就是上面的内容, 可以看出, 在传输过程中, 这个文件前后都被自动加上了一些标记信息,所以, 我们不可能直接读出所上传的文件的二进制文件流, 必须要对这个文件流进行处理, 过滤掉多余的标记信息, 才可以得到正确的文件二进制流。

算法的简单处理过程如下:因为上传文件的大小不确定, 所以必须先设置一块缓存, 当缓存充满时, 就把内容输出到硬盘。当数据流打开以后, 根据信息的格式, 找到信息头结束符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;

//设置标记为否

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值