Java流式IO

1. 流式IO结构

下图只给出了较为常用的IO流的类图结构

Java的IO流主要分为两大类:字节流和字符流,字节流以InputStream和OutputStream为基础类,字符流以Reader和Writer为基础类。

2. 字节流

字节流以InputStream和OutputStream为基础类,常用的子类流有:

  FileInputStream和FileOutputStream用于从文件读写二进制数据;

  FilterInputStream和FilterOutputStream即过滤流,过滤流可以嵌套基本二进制输入输出流或者其他过滤流,增强处理输入输出流的处理能力。其中BufferedInputStream和BufferedOutputStream流提供了读写缓冲的功能,DataInputStream和DataOutputStream提供了对字节流读写的更多支持(如:读写二进制整数等);

ObjectInputStream和ObjectOutputStream用于读写对象,对象所属的类需要实现Serializable接口,现在更常用的方式应该是使用JSON格式来传递对象;

读写二进制文件通常使用如下嵌套流的方式:

  new DataInputStream(new BufferedInputStream(new FileInputStream(new File(filename))));

  new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(filename))));

3.字符流

字符流以Reader和Writer为基础类,常用的子类有:

  FileReader和FileWriter类用于从文件读写文本数据;

  BufferedReader和BufferWriter用于读写文本数据,提供了读写缓冲的功能,通常用于包装其他的字符输入输出流;

  BufferedReader类中常用的方法是readLine读入一行数据,然后使用String类的相关API处理,更常用的方式是使用java.util.Scanner类来对读字符流提供更多支持;

PrintWriter类对写字符流提供了更多支持;

读写文本文件通常使用如下嵌套流的方式:

  new BufferedReader(new FileReader(new File(...));

  new PrintWriter(new BufferedWriter(new FileWriter(new File(...))));

4. 字节流和字符流的转换

字节流转换成字符流使用InputStreamReader:

  new BufferedReader(new InputStreamReader(inputStream));

字符流转换成字节流使用OutputStreamWriter:

  new BufferedWriter(new OutputStreamWriter(outputStream));

5. ZIP文件输入输出流

Java中提供了对zip压缩文件读写支持,相关类在java.util.zip包中。

ZipInputStream类和ZipOutputStream分别继承成自java.io.FilterInputStream类和java.io.FilterOutputStream类,用于读写zip压缩文件。

ZipEntry类用于表示zip文件中的一个条目,读写zip文件,首先创建ZipInputStream或者ZipOutputStream,然后使用getNextEntry方法获取zip文件中的每个被压缩的文件,依次处理,每个处理完成一个条目之后,调用closeEntry方法关闭当前条目,处理完整个zip文件后,调用close方法关闭整个zip文件。

下面给出一个依次打印zip文件中所有文件内容的例子:

ZipInputStream zin = new ZipInputStream(new FileInputStream("test.zip"));
ZipEntry zipEntry;
Scanner scanner;

while( (zipEntry = zin.getNextEntry() ) != null )
{
    scanner = new Scanner(zin);
    System.out.println(zipEntry.getName());   //输出文件名称
    //输出文件内容
    while(scanner.hasNextLine())
    {
        System.out.println(scanner.nextLine());
    }
    zin.closeEntry();
}

zin.close();
时间: 2024-08-27 10:22:18

Java流式IO的相关文章

JAVA 流式布局管理器

//流式布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian2 extends JFrame{ //定义组件 JButton[] an = {null,null,null,null,null,null,null,null}; public static void main(String[] args){ //运行本类的构造方法 Jiemian2 jiemian = new Jiemian2(); } public

流式IO读写

1. FileInputStream 类直接继承了InputStream 的方法 mark, markSupported, reset 方法 而这几个方法都是空实现 markSupported直接返回false 所以对于FileInputStream类不支持随机访问文件,只能顺序的读写文件. 2. NIO中的Buffer操作: Nio中的 java.nio.Buffer 这个类的几乎所有操作都是关于一个线性缓存区的,对于缓冲区的抽象,这个提供了下面的4个指示位: // Invariants: m

Go 流式 IO

原文链接:基本的 IO 接口 原文链接:方便的IO操作函数集 图片来源:图片显示来源 1. 1.1 io — 基本的 IO 接口 io 包为 I/O 原语提供了基本的接口.它主要包装了这些原语的已有实现. 由于这些被接口包装的I/O原语是由不同的低级操作实现,因此,在另有声明之前不该假定它们的并行执行是安全的. 在 io 包中最重要的是两个接口:Reader 和 Writer 接口.本章所提到的各种 IO 包,都跟这两个接口有关,也就是说,只要满足这两个接口,它就可以使用 IO 包的功能. 1.

面试刷题11:java系统中io的分类有哪些?

随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应. 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3类: 1,BIO ,即同步阻塞IO,对应java.io包提供的工具:基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈: 2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用:核心类: Channel ,Selector , Buffer ,

Java IO:面向流、同步、堵塞式IO(BIO)

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解堵塞式IO和非堵塞式IO的基本概念. JAVA BIO是面向流(字节流.字符流)的,即从流中一次读取一个或者多个字节,读取和写入时都须要同步堵塞直至完毕. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件里读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"

Java基础:阻塞式IO

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解阻塞式IO和非阻塞式IO的基本概念. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件中读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"概念 ByteArrayInputStream 允许将内存缓冲区当做InputStream使用 处理流 Sequen

Java基础:非阻塞式IO

转载请注明出处:jiq?钦's technical Blog 引言 JDK1.4中引入了NIO,即New IO,目的在于提高IO速度.特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择. 尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流(字节/字符)的IO类库则是非阻塞的,详细来看,两者区别如下: IO NIO 面向流(Strea

三、JAVA中的IO流,输出流

JAVA中java.io.*;提供数据的流式输入与输出的相关类,IO流是对于输入与输出的抽象,JAVA把这些不同来源和目标的数据都统一抽象为数据流.将输入与输出的数据统一为流的好处是程序不必关心要读取得是文件,还是网络中的数据,而是统一当作IO流来处理. IO流又分为字符流与字节流,主要区别 字节流 按字节处理(一次处理一个字节) 使用类OutputStream 字符流 按字符处理(一次处理一个字符即两个字节) 使用类Writer 其实字节流与字符流处理十分相似(即每次处理的单位不同),好多书上

java mysql大数据量批量插入与流式读取分析

总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取->处理->写入. 1 读取操作开始遇到的问题是当sql查询数据量比较大时候基本读不出来.开始以为是server端处理太慢.但是在控制台是可以立即返回数据的.于是在应用 这边抓包,发现也是发送sql后立即有数据返回.但是执行ResultSet的next方法确实阻塞的.查文档翻代码原来mysql驱动默