`

java io常用api

    博客分类:
  • Java
阅读更多
字节处理类都继承自InputStream和OutPutStream这两个抽象类;

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

字节流处理类:
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个字节写入此输出流。

字符流处理类:
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) : 写入字符串的某一部分

字节流与字符流的桥梁 : InputStreamReader、OutputStreamWriter
字节流转化为字符流可以用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浅析:http://www.iteye.com/topic/313635
java.io 对字节流和字符流的讨论:http://www.iteye.com/topic/175121
java中文件操作:http://jdlsfl.iteye.com/blog/209387
分享到:
评论

相关推荐

    java开发常用API

    在Java开发中,以下是一些常用API的知识点: 1. **集合框架**:Java集合框架是处理对象集合的一系列接口和类,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。这些...

    java常用API文档合集

    这份“java常用API文档合集”包含了多个重要的API文档,对于Java和前端开发者来说是宝贵的参考资料。 1. **Java基础API**:Java的基础API包括了`java.lang`、`java.io`、`java.util`等包,它们提供了基本的数据类型...

    java开发常用api文档

    Java开发常用API文档是Java程序员日常工作中不可或缺的参考资料,它涵盖了Java开发中的各种核心类库、接口和方法。这些API提供了丰富的功能,使得开发者能够高效地构建可扩展且健壮的软件系统。JDK(Java ...

    java 常用的API

    例如,`java.io`包用于处理I/O操作,`java.net`包处理网络通信,`java.util`包提供了集合类如ArrayList和HashMap,而`java.lang`包中的Object类是所有类的父类,包含了一些基本的反射和异常处理功能。 2. **jQuery ...

    java各种常用api

    下面将详细讨论Java API中的一些常用模块及其在实际开发中的应用。 首先,我们来看看JDK1.6,这是Java的一个重要版本。它包含了Java标准版的核心API,例如`java.lang`、`java.util`和`java.io`等包。`java.lang`是...

    高手总结java常用API.

    以上就是Java常用API的一些关键知识点,掌握这些基础将有助于你编写更高效、可维护的Java代码。在实际开发中,还需要深入学习异常处理机制、多线程、反射、注解等高级特性,以及框架如Spring、MyBatis等,以提升开发...

    Java常用API

    - **Java.io**: 提供输入/输出流操作,如文件读写、网络通信等。 - **Java.util**: 包含集合框架、日期时间处理、随机数生成等工具类。 2. **Java EE (Enterprise Edition)** Java EE是企业级Java应用开发的平台...

    java常用API.pdf

    下面将详细介绍Java中的一些常用API,包括System类、String类、StringBuffer类、ClassLoader类、Java IO操作、ResourceBundle和Properties类以及异常处理和JDBC数据库连接。 首先,System类是Java中用于访问系统...

    JAVA_API1.6文档(中文)

    java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供...

    java常用API举例

    4. **IO流**:Java的IO流分为字节流和字符流,如FileInputStream和FileOutputStream处理字节数据,BufferedReader和PrintWriter处理字符数据。`read()`和`write()`用于读写数据,`close()`关闭流。例如: ```java ...

    java常用API

    总的来说,Java的常用API是构建JavaWeb项目的关键工具。理解并熟练使用这些API,能帮助开发者高效地完成从数据处理到用户界面展示的各个层面的工作。在实际开发中,还需要结合HTML、CSS和jQuery等技术,以实现更丰富...

    java常用API说明、参考手册等

    这份资源包含了关于Java API的详细说明,可以帮助开发者快速查找和理解各种常用的接口、类和方法。下面,我们将深入探讨Java API中的关键部分,以及如何结合MySQL中文参考手册和HTTP 1.1的知识进行开发。 首先,...

    java开发中常用API

    Java开发中的常用API是程序员日常工作中不可或缺的一部分,它包含了各种工具类、接口和类,用于实现各种功能。这里我们主要关注几个重要的API组件,包括W3CSchool的基础教程,MySQL5中文参考手册,jQuery 1.8.3的...

    JAVA API(包含各种常用API)

    2. `java.util`包:这个包包含了集合框架、日期/时间处理、随机数生成、队列、堆栈等常用工具类。其中,集合框架(如`ArrayList`、`LinkedList`、`HashSet`、`HashMap`)是处理对象集合的重要工具,而`Date`和`...

    java常用API-适合初学者

    本资料“java常用API-适合初学者”旨在帮助初学者快速掌握Java API的基本用法和核心概念。 1. **基础类库** - **Object类**:所有Java类的父类,包含equals()、hashCode()、toString()等方法。 - **String类**:...

    JAVA 中文版API使用手册

    《JAVA中文版API使用手册》是一本面向Java开发者的重要参考资料,它详尽地阐述了Java开发过程中常用的各种软件包、类、接口以及方法的使用方式。对于初学者和经验丰富的开发者来说,这都是一个非常宝贵的资源,特别...

    高手总结java常用API(免费下载).rar

    这份“高手总结java常用API”资料无疑是对Java API的精华提炼,旨在帮助开发者快速理解和掌握Java编程的核心工具。 在Java API中,我们可以找到许多关键的类库,如集合框架、输入/输出流、多线程、网络编程等。以下...

    java IO文档.docx

    Java IO流是Java平台中用于...总之,Java IO流提供了一套丰富的API,允许开发者灵活地处理数据输入和输出,无论是简单的文本文件还是复杂的二进制数据。理解并熟练掌握这些流类及其使用方式,是Java开发中的重要技能。

    Java 1.6 API 中文 New

    java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 ...

Global site tag (gtag.js) - Google Analytics