JAVA I/O--(4)
来源:互联网 发布:淘宝买小龙虾 编辑:程序博客网 时间:2024/06/11 21:31
读文件、写文件
一、 读文件:
① 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;
//设置标记为否
}
}
3
参考文献:
《JDK 实例宝典实例》夏先波
《基于JAVA 的文件上传组件的实现》王申 王进武
- JAVA I/O--(4)
- 2014.3.4 Java I/O
- Java I/O系统----------- 标准I/O
- Socket Java I/O Socket I/O
- java I/O流(4) RandomAccessFile
- java I/O系统(4)-RandomAccessFile类
- JAVA I/O
- 复习java: I/O
- Java I/O 体系
- java I/O流
- Java 标准I/O
- Java I/O系统
- Java I/O
- JAVA I/O--(2)
- JAVA I/O--(3)
- java i/o包
- JAVA I/O (一)
- java I/O流
- 社会生存的75条忠告----胜读十年书
- 什么是“五险一金”?
- 10个让人受益的管理原理
- 使用Flex编程的一些要素
- 信号量函数 semget() semop() semctl()
- JAVA I/O--(4)
- 动态调用动态语言之Java脚本API
- 总想写点什么
- SendMessage参数详解
- From China Daily 25/5
- 2008年日语3级真题
- VB中文本框处理技巧集萃
- 华为软件编程规范和范例
- Setting a Keyboard Accelerator for a Menu Item:为一个菜单项添加键盘加速器