java io常用api

字节处理类都继承自InputStream和OutPutStream这两个抽象类;

字符流操作类都继承自Reader或Writer这两个抽象类。

[b]字节流处理类:[/b]
InputStream:

int read() : 从输入流中读取数据的下一个字节(下个数据字节在0~255范围内),如果到达流的末尾返回-1

int read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中,等同于read(b,0,b.length)

int read(byte[] b,int off,int len) : 将输入流中最多len个数据字节读入byte数组,将读取的第一个字节存储在元素b[off]中,下一个b[off+1]中,依此类推…

OutputStream:

void write(int b) : 将指定的字节写入此输出流,要写入字节是参数b的低位8个

void write(byte[] b) : 将b.length个字节从指定的byte数组中写入此输出流,等价于write(b,0,b.length)

void write(byte[] b,int off,int len) : 将指定byte数组中从偏移量off开始的len个字节写入此输出流。

[b]字符流处理类:[/b]
Reader :

int read() : 读取单个字符。返回:作为整数读取的字符,范围在0~65535之间,如果已经到达流的末尾,则返回-1

int read(char[] cbuf) : 将字符读取数组中。返回:读取的字符数,如果已经到达流的末尾,则返回-1

int read(char[] cbuf,int off,int len) : 将字符读入数组的某一部分

Writer :

void write(int c) : 写入单个字符。要写入的字符包含在c的低16位中

void write(char[] cbuf) : 写入字符数组

void write(char[] cbuf,int off,int len) : 写入字符数组的某一部分

void write(String str) : 写入字符串

void write(String str,int off,int len) : 写入字符串的某一部分

[b]字节流与字符流的桥梁 : InputStreamReader、OutputStreamWriter[/b]
字节流转化为字符流可以用InputStreamReader OutputStreamWriter转化成BufferedReader BufferedWriter 它们具有缓冲区。

下面是一些常用的例子:

/**
* 从一个文件读取字节流
*/
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[fis.available()];
fis.read(b);
fis.close();


/**
* 读取一个文件的字节流,再将获得的字节流写入到另一个文件中
*/
//读取字节流
FileInputStream fis = new FileInputStream("D:\\a.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] b = new byte[bis.available()];
bis.read(b);
bis.close();
fis.close();
//写入字节流
FileOutputStream fos = new FileOutputStream("D:\\b.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(b);
bos.close();
fos.close();


/**
* 根据文件路径 下载文件[向字节输出流response.getOutputStream()中写入]
*/
log.info("path="+path); //得到文件路径 path
String fileName = null; //文件名
int pos = path.lastIndexOf(File.separator);
if(pos>0){
fileName = path.substring(pos + 1);
}else{
fileName = path;
}
response.setContentType(getContentType(fileName));//根据文件名,设置Content-Type
try {
fileName = URLEncoder.encode(fileName,"utf-8");
} catch (UnsupportedEncodingException e1) {
log.warn("UnsupportedEncodingException!");
}
response.addHeader("Content-Disposition", "attachment;filename=\""+ fileName +"\"");
//通过流 下载文件
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
bis = new BufferedInputStream(new FileInputStream(path));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[4*1024];
int bytesRead = 0;
while((bytesRead=bis.read(buff)) != -1){
bos.write(buff, 0, bytesRead); //将文件发送到客户端
}
bos.flush();
bis.close();
bos.close();
}catch(Exception e){
log.warn("Exception");
}


/**
* 得到文件的全部字节流后,下载文件,way1
*/
response.setCharacterEncoding("utf-8");
response.setContentType(getContentType(fileName));//根据文件名,设置Content-Type
fileName = URLEncoder.encode(fileName,"utf-8");
response.setHeader("Content-Disposition", "attachment;filename=\""+ fileName +"\"");
byte[] b = comm.getBinFile(); //从数据库获取文件的字节流
try {
OutputStream os = response.getOutputStream();
try{
os.write(b);//向字节输出流中写
}finally{
try{
os.close();
}catch(IOException ex){
log.warn("IOException!!!");
}
}
} catch (IOException e) {
log.warn("IOException!");
}


/**
* 得到文件的全部字节流后,下载文件,way2
*/
response.setCharacterEncoding("utf-8");
response.setContentType(getContentType(fileName));//根据文件名,设置Content-Type
tempStr = URLEncoder.encode(fileName,"utf-8");
response.setHeader("Content-Disposition", "attachment;filename=\""+ tempStr +"\"");
byte[] b = comm.getBinFile(); //从数据库获取文件的字节流
int len = b.length;
int step = 4 * 1024; //每次写入的字节长度
int mod = len % step; //余数
int count = (mod==0) ? (len/step) : (len/step)+1;//循环次数
log.info("字节长度:"+len+" 余数:"+mod+" 循环次数:"+count);
try {
OutputStream os = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
for(int i=0; i<count; i++){
log.info("第 "+ i + " 次执行写入……,写入的起始位置为:"+i*step);
if(mod==0){
bos.write(b, i * step, step);
}else{
if(i==count-1){
bos.write(b, i * step, mod);
}else{
bos.write(b, i * step, step);
}
}
}
bos.flush();
bos.close();
os.close();
} catch (IOException e) {
log.warn("IOException!");
}


/**
* 从一个文件读取字符流
*/
//法一:
FileInputStream fis = new FileInputStream("1.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
while(line!=null){
sb.append(line);
line = br.readLine();
}
br.close();
isr.close();
fis.close();
//法二:
FileReader reader = new FileReader(path);
BufferedReader rd = new BufferedReader(reader);
String line = rd.readLine();
while(line!=null){
sb.append(line);
line = rd.readLine();
}
rd.close();
reader.close();


/**
* 通过字符流写入文件
*/
FileOutputStream fos = new FileOutputStream(path);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write("哈哈,通过字符流写文件……");
bw.flush();//关闭前刷新缓冲流(针对带缓冲的、写入的、字符流)(当使用BufferedWriter时,才需要flush())
fos.close();


下载文件
在前台页面中,常用的有两种下载文件的方式:
一种是利用a标签,设置a标签:<a href="downLoad.jsp?filename=aaa.ppt">点击下载</a> (href也可以指向.do请求)
一种是利用隐藏的iframe,设置iframe:ifrObj.src = '../../fileSave.do?idx='+idx;(src也可以指向一个jsp文件)

在后端处理下载,大概有两种方式(其实本质上是一样的,呵呵):
一种是利用jsp页面下载文件;一种是用java代码实现;
下面是jsp实现下载文件的代码:
<%@ page language="java" contentType="text/html;charset=utf-8"%>
<%@page import="java.io.*;"%>
<%
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
String filename = request.getParameter("filename");
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment; filename=" + filename);
bis = new BufferedInputStream(new FileInputStream(config.getServletContext().getRealPath(filename)));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[4*1024];
int bytesRead = 0;
while((bytesRead=bis.read(buff)) != -1){
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(bis != null){
bis.close();
}
if(bos != null){
bos.close();
}
out.clear();
out = pageContext.pushBody();
}
%>


几个java io相关的博客:
Java IO浅析:[url]http://www.iteye.com/topic/313635[/url]
java.io 对字节流和字符流的讨论:[url]http://www.iteye.com/topic/175121[/url]
java中文件操作:[url]http://jdlsfl.iteye.com/blog/209387[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值