`

将一个对象转成Reader或InputStream

    博客分类:
  • java
阅读更多
这个例子是将一个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();
    }
  }

分享到:
评论

相关推荐

    java.io.Reader 和 java.io.InputStream 的区别

    3. **`StringReader`**:允许从一个`String`对象中读取数据,这在处理动态生成的文本或字符串时非常有用。 4. **`PipedReader`**:用于读取从另一个线程中的`PipedWriter`写入管道的数据,支持线程间通信。 #### ...

    IO流文档InputStream / OutputStream

    IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...

    使用Betwixt将XML转为JAVA Bean(内有JAR包)

    Betwixt是一个Apache软件基金会提供的库,专门用于XML与Java对象之间的绑定,使得我们可以方便地在两者之间进行转换。本教程将通过一个具体的例子,讲解如何使用Betwixt将XML数据转换为Java Bean,特别是处理XML中...

    java URL转PDF文件

    在Java编程环境中,将一个URL链接的内容转换为PDF文件是一个常见的需求,这通常涉及到网络请求、HTML解析以及PDF生成等多个步骤。以下是一个详细的步骤指南,涵盖了这个过程中的关键知识点: 首先,我们需要处理URL...

    java_csvReader

    为了更好地管理这些数据,可以创建一个自定义的类来表示CSV记录,将每行转换为对象实例。此外,`CsvReader`可能还包含了错误处理机制,如文件不存在或读取异常时的处理。 其次,`CsvWriter.java`文件可能包含了向...

    Java面向对象程序设计课后答案全解

    Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)原则,为开发者提供了构建复杂软件系统的方法。本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象...

    java大对象

    - 创建Blob对象:可以通过`PreparedStatement`的`setBlob()`方法,传入一个InputStream和长度来创建Blob。 - 读取Blob对象:可以使用`Blob`对象的`getBinaryStream()`或`getBytes()`方法获取数据。 2. **Clob对象...

    ACCP6.0使用Java实现面向对象编程完整课件

    5. 构造器:构造器是类的一个特殊方法,用于初始化新创建的对象。Java中的构造器与类名相同,没有返回类型。 6. 抽象类与接口:抽象类不能被实例化,但可以有子类继承。它用于定义通用的行为模板。接口则是一种完全...

    java_io.pdf

    3. FileInputStream:用于读取文件内容,需要一个表示文件路径的字符串或File对象。 OutputStream类则是所有字节输出流的基类,它的功能是将数据写入目标。常见的子类包括: 1. ByteArrayOutputStream:在内存中...

    Java面试题20道题常见

    在本文中,我们将详细解释 Java 中的内存溢出、String 对象的创建、对象的垃圾回收、Error、Exception 和 RuntimeException 的区别、hashCode 的作用、HashMap 和 Hashtable 的区别、Reader 和 InputStream 的区别、...

    Java面向对象程序设计-电子教案.rar

    Java面向对象程序设计是计算机科学中的一个重要概念,它在软件开发中扮演着核心角色。本电子教案涵盖了这一主题的关键知识点,旨在帮助学习者理解和掌握Java编程中的面向对象思想和技术。 一、面向对象编程基础 ...

    流程控制 网络编程 对象序列化

    接收方再通过反序列化,将字节流还原成对象。 **2.3 Socket编程** Socket编程是网络编程的核心,通过创建Socket连接,可以在客户端与服务器间建立双向通信通道。对于对象的传输,通常会在Socket的基础上构建更高...

    Java面对对象实验(项目文件)2013521

    在Java中,万物皆对象,每个类都是一个对象模板,每个对象都是类的一个实例。 2. **Java_线程**:线程是程序执行的最小单位,Java提供了丰富的线程支持。学习这部分内容,你需要理解如何创建和管理线程,包括使用...

    最新java面试题(基础部分)

    包括内存溢出、String对象、垃圾回收、Error、Exception和RuntimeException的区别、hashCode的作用、HashMap和Hashtable的区别、Reader和InputStream的区别、HashMap中是否任何对象都可以做为key、启动一个线程是用...

    java 调用itext 把html转成pdf文档

    在上述代码中,我们首先创建一个`Document`对象,然后使用`PdfWriter.getInstance()`创建一个PDF写入器。接着,我们打开文档并调用`XMLWorkerHelper.parseXHtml()`方法,将HTML内容解析并写入PDF。最后,关闭文档和...

    Java面向对象第2版代码.zip

    继承允许一个类(子类)从另一个类(父类)中获取属性和方法,增强了代码的复用性。Java中的单一继承特性使得设计更加清晰,同时接口提供了多重继承的功能。 4. **Chapter 7:多态** 多态性是面向对象的另一大...

    读取assessts的txt

    3. **处理InputStream**:InputStream是一个字节流,我们需要将其转换为可读的字符串。可以使用BufferedReader和InputStreamReader组合来实现。例如: ```java BufferedReader reader = null; try { reader = ...

    java程序(一)

    `GetOutString`类中的逻辑模拟了一个出队列的过程,但实际的流操作通常涉及到读取或写入数据源,例如文件、网络连接或内存缓冲区。 以上四个知识点是Java编程中的基础部分,掌握它们对于理解和编写Java应用程序至关...

    《Java面向对象程序设计》例子源代码

    3. 封装:封装是面向对象的一个关键特性,它隐藏了对象内部的实现细节,仅通过公共接口(方法)与外界交互。在Java中,我们使用访问修饰符(如public, private, protected)来控制成员的访问权限。 4. 继承:继承...

    java-io-decorator.pdf

    例如,当我们需要对一个FileInputStream进行缓冲操作,我们可以通过创建一个BufferedInputStream对象并将FileInputStream作为参数传入。在这个例子中,BufferedInputStream就是装饰者,它包装了一个FileInputStream...

Global site tag (gtag.js) - Google Analytics