这个例子是将一个list对象转成一个reader对象,也可以看成是将一个Writer对象转成Reader对象的例子。
//CSVReader和CSVWriter是oencsv-1.8.jar中的类
FileReader fr = new FileReader("download.csv");
CSVReader cr = new CSVReader(fr);
List list = cr.readAll();
//---start---这几行代码的顺序不能变-----------------------
//---确保在向PipedWriter写入数据前创建PipedReader
PipedWriter pw = new PipedWriter();
PipedReader pr = new PipedReader(pw);
BufferedReader br = new BufferedReader(pr);
CSVWriter cw = new CSVWriter(pw);
cw.writeAll(list);
cw.close();
//----end----br就是转换后的Reader对象-----------
//--------test---------
String readLine = br.readLine();
while (readLine!=null&&!readLine.equals("")) {
System.out.println(readLine);
readLine = br.readLine();
}
System.out.println("over");
如果想转成InputStream那需要把PipedWriter和PipedReader替换成PipedOutputStream和PipedInputStream。
这是通常的做法,但很可惜opencsv中没有CSVInputStream和CSVOutputStream,所以不能简单的替换,而是将Reader转换成InputStream。
//------ReaderInputStream是ibatis.jar中提供。
FileReader fr = new FileReader("download.csv");
CSVReader cr = new CSVReader(fr);
List list = cr.readAll();
PipedWriter pw = new PipedWriter();
PipedReader pr = new PipedReader(pw);
//------将Reader转换成InputStream----------
ReaderInputStream ris = new ReaderInputStream(pr);
CSVWriter cw = new CSVWriter(pw);
cw.writeAll(list);
cw.close();
//------ris是转换后的InputStream对象
ReaderInputStream的代码,可以直接使用。
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
/**
*@author luyang
*@create_time 2009/03/18
*/
public class ReaderInputStream extends InputStream {
protected Reader reader;
protected ByteArrayOutputStream byteArrayOut;
protected Writer writer;
protected char[] chars;
protected byte[] buffer;
protected int index, length;
/**
* Constructor to supply a Reader
*
* @param reader - the Reader used by the InputStream
*/
public ReaderInputStream(Reader reader) {
this.reader = reader;
byteArrayOut = new ByteArrayOutputStream();
writer = new OutputStreamWriter(byteArrayOut);
chars = new char[1024];
}
/**
* Constructor to supply a Reader and an encoding
*
* @param reader - the Reader used by the InputStream
* @param encoding - the encoding to use for the InputStream
* @throws UnsupportedEncodingException if the encoding is not supported
*/
public ReaderInputStream(Reader reader, String encoding) throws UnsupportedEncodingException {
this.reader = reader;
byteArrayOut = new ByteArrayOutputStream();
writer = new OutputStreamWriter(byteArrayOut, encoding);
chars = new char[1024];
}
/**
* @see java.io.InputStream#read()
*/
public int read() throws IOException {
if (index >= length)
fillBuffer();
if (index >= length)
return -1;
return 0xff & buffer[index++];
}
protected void fillBuffer() throws IOException {
if (length < 0)
return;
int numChars = reader.read(chars);
if (numChars < 0) {
length = -1;
} else {
byteArrayOut.reset();
writer.write(chars, 0, numChars);
writer.flush();
buffer = byteArrayOut.toByteArray();
length = buffer.length;
index = 0;
}
}
/**
* @see java.io.InputStream#read(byte[], int, int)
*/
public int read(byte[] data, int off, int len) throws IOException {
if (index >= length)
fillBuffer();
if (index >= length)
return -1;
int amount = Math.min(len, length - index);
System.arraycopy(buffer, index, data, off, amount);
index += amount;
return amount;
}
/**
* @see java.io.InputStream#available()
*/
public int available() throws IOException {
return (index < length) ? length - index :
((length >= 0) && reader.ready()) ? 1 : 0;
}
/**
* @see java.io.InputStream#close()
*/
public void close() throws IOException {
reader.close();
}
}
分享到:
- 2009-03-18 12:43
- 浏览 5143
- 评论(0)
- 论坛回复 / 浏览 (0 / 5270)
- 查看更多
相关推荐
3. **`StringReader`**:允许从一个`String`对象中读取数据,这在处理动态生成的文本或字符串时非常有用。 4. **`PipedReader`**:用于读取从另一个线程中的`PipedWriter`写入管道的数据,支持线程间通信。 #### ...
IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...
Betwixt是一个Apache软件基金会提供的库,专门用于XML与Java对象之间的绑定,使得我们可以方便地在两者之间进行转换。本教程将通过一个具体的例子,讲解如何使用Betwixt将XML数据转换为Java Bean,特别是处理XML中...
在Java编程环境中,将一个URL链接的内容转换为PDF文件是一个常见的需求,这通常涉及到网络请求、HTML解析以及PDF生成等多个步骤。以下是一个详细的步骤指南,涵盖了这个过程中的关键知识点: 首先,我们需要处理URL...
为了更好地管理这些数据,可以创建一个自定义的类来表示CSV记录,将每行转换为对象实例。此外,`CsvReader`可能还包含了错误处理机制,如文件不存在或读取异常时的处理。 其次,`CsvWriter.java`文件可能包含了向...
Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)原则,为开发者提供了构建复杂软件系统的方法。本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象...
- 创建Blob对象:可以通过`PreparedStatement`的`setBlob()`方法,传入一个InputStream和长度来创建Blob。 - 读取Blob对象:可以使用`Blob`对象的`getBinaryStream()`或`getBytes()`方法获取数据。 2. **Clob对象...
5. 构造器:构造器是类的一个特殊方法,用于初始化新创建的对象。Java中的构造器与类名相同,没有返回类型。 6. 抽象类与接口:抽象类不能被实例化,但可以有子类继承。它用于定义通用的行为模板。接口则是一种完全...
3. FileInputStream:用于读取文件内容,需要一个表示文件路径的字符串或File对象。 OutputStream类则是所有字节输出流的基类,它的功能是将数据写入目标。常见的子类包括: 1. ByteArrayOutputStream:在内存中...
在本文中,我们将详细解释 Java 中的内存溢出、String 对象的创建、对象的垃圾回收、Error、Exception 和 RuntimeException 的区别、hashCode 的作用、HashMap 和 Hashtable 的区别、Reader 和 InputStream 的区别、...
Java面向对象程序设计是计算机科学中的一个重要概念,它在软件开发中扮演着核心角色。本电子教案涵盖了这一主题的关键知识点,旨在帮助学习者理解和掌握Java编程中的面向对象思想和技术。 一、面向对象编程基础 ...
接收方再通过反序列化,将字节流还原成对象。 **2.3 Socket编程** Socket编程是网络编程的核心,通过创建Socket连接,可以在客户端与服务器间建立双向通信通道。对于对象的传输,通常会在Socket的基础上构建更高...
在Java中,万物皆对象,每个类都是一个对象模板,每个对象都是类的一个实例。 2. **Java_线程**:线程是程序执行的最小单位,Java提供了丰富的线程支持。学习这部分内容,你需要理解如何创建和管理线程,包括使用...
包括内存溢出、String对象、垃圾回收、Error、Exception和RuntimeException的区别、hashCode的作用、HashMap和Hashtable的区别、Reader和InputStream的区别、HashMap中是否任何对象都可以做为key、启动一个线程是用...
在上述代码中,我们首先创建一个`Document`对象,然后使用`PdfWriter.getInstance()`创建一个PDF写入器。接着,我们打开文档并调用`XMLWorkerHelper.parseXHtml()`方法,将HTML内容解析并写入PDF。最后,关闭文档和...
继承允许一个类(子类)从另一个类(父类)中获取属性和方法,增强了代码的复用性。Java中的单一继承特性使得设计更加清晰,同时接口提供了多重继承的功能。 4. **Chapter 7:多态** 多态性是面向对象的另一大...
3. **处理InputStream**:InputStream是一个字节流,我们需要将其转换为可读的字符串。可以使用BufferedReader和InputStreamReader组合来实现。例如: ```java BufferedReader reader = null; try { reader = ...
`GetOutString`类中的逻辑模拟了一个出队列的过程,但实际的流操作通常涉及到读取或写入数据源,例如文件、网络连接或内存缓冲区。 以上四个知识点是Java编程中的基础部分,掌握它们对于理解和编写Java应用程序至关...
3. 封装:封装是面向对象的一个关键特性,它隐藏了对象内部的实现细节,仅通过公共接口(方法)与外界交互。在Java中,我们使用访问修饰符(如public, private, protected)来控制成员的访问权限。 4. 继承:继承...
例如,当我们需要对一个FileInputStream进行缓冲操作,我们可以通过创建一个BufferedInputStream对象并将FileInputStream作为参数传入。在这个例子中,BufferedInputStream就是装饰者,它包装了一个FileInputStream...