重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在Java程序中,要想从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样程序就可以从文件中读取数据了;反之,如果要在Java程序中把数据写入到文件中,也需要在程序和文件之间建立一条数据输出的通道。当程序创建输入流对象时,Java会自动建立这个数据输入通道,而创建输出流时,Java也会自动建立这个数据输出通道。如下图所示:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、虚拟空间、营销软件、网站建设、太子河网站维护、网站推广。
Java程序读取与写入数据
输入流是从文件读取数据,是一个拉取数据的过程;输出流是将数据写入到文件,是一个推送数据的过程。
为了便于理解输入输出流,前面都是以文件为数据源来讨论的。其实,Java的输入与输出流支持任何数据源的读取与写入,包括键盘、文件、网络、数据库等数据源。
输入流和输出流按读取和写入的数据单位可分为字节流和字符流,字节流是以字节为单位传输数据的流,字符流是以字符为单位传输数据的流。
Java所提供的输入流和输出流类封装在Java.io包中
Java输入输出流的本质是I/O操作,是指使用Java进行输入输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件、内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的。在这其中InputStream和OutputStream在早期的Java版本中就已经存在了,它们是基于字节流的,而基于字符流的Reader和 Writer是后来加入作为补充的。
package IO; // 定义包名
import java.io.*;// 引入java.io包下的所有类
// 定义一个类
public class FileExample {
// 定义构造函数
public FileExample() {
// 调用父类的构造函数
super();
}
// 定义主方法
public static void main(String[] args) {
// 捕获异常
try {
// 定义了一个变量, 用于标识输出文件
String outfile = "demoout.xml";
// 定义了一个变量, 用于标识输入文件
String infile = "demoin.xml";
/**
* 用FileOutputStream定义一个输入流文件,然后用BuferedOutputStream调用FileOutputStream对象生成一个缓冲输出流
* 然后用DataOutputStream调用BuferedOutputStream对象生成数据格式化输出流
*/
DataOutputStream dt=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(outfile)));
BufferedWriter NewFile = new BufferedWriter(new OutputStreamWriter(dt, "GBK"));
// 对中文的处理
/**
*用FileInputStream定义一个输入流文件,然后用BuferedInputStream调用FileInputStream对象生成一个缓冲输出流
* ,其后用DataInputStream中调用BuferedInputStream对象生成数据格式化输出流
*/
DataInputStream rafFile1 = new DataInputStream(new BufferedInputStream(new FileInputStream(infile)));
BufferedReader rafFile = new BufferedReader(new InputStreamReader(rafFile1, "GBK"));
String xmlcontent = "";
char tag = 0;// 文件友字符0结束
while (tag != (char) (-1)) {
xmlcontent = xmlcontent + tag + rafFile.readLine() + '\n';
tag = (char) rafFile.read();
}
NewFile.write(xmlcontent);// 将内容写入到文件中
NewFile.flush();//清空缓冲区使输出流写出
NewFile.close(); // 关闭流
rafFile.close();// 关闭流
System.gc();// 调用垃圾回收器
} catch (NullPointerException exc) {
// 如果发生空指针异常则走这里
exc.printStackTrace();
} catch (java.lang.IndexOutOfBoundsException outb) {
// 如果发生索引越界则执行这里的方法
System.out.println(outb.getMessage());
outb.printStackTrace();//控制台的红字
} catch (FileNotFoundException fex) {
// 这里用于处理文件未找到异常
System.out.println("fex" + fex.getMessage());
} catch (IOException iex) {
// 这里是IO异常
System.out.println("iex" + iex.getMessage());
}
}
}
你先把xls文件组织好
然后用
response.setContentType(
"application/ms-excel;charset=GB2312");
response.setHeader(
"Content-Disposition",
"attachment;filename=keke.xls");
设置响应头
然后把xls对象用二进制流读进来
转成byte[]
在用
response.getOutputStream()得到响应的输出流
把btye[]输入到也面就可以了
由于我没有用过楼主所用的WritableWorkbook这个类,所以怎样转我也不敢乱说
我做XLS的时候用的是POI的包,他内部封装了一些东西,可以很容易的就得到workbook的流.
如果楼主有兴趣,建议看一下,使用起来非常简单