6. Java.IO流类库

1. io流的四个基本类

java.io包中包括了流式I/O所须要的全部类。

在java.io包中有四个基本类:InputStream、OutputStream及Reader、Writer类。它们分别处理字节流和字符流:

基本数据流的I/O

输入/输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer

     Java中其它多种多样变化的流均是由它们派生出来的:

JDK1.4版本号開始引入了新I/O类库。它位于java.nio包中,新I/O类库利用通道和缓冲区等来提高I/O操作的效率。

在java.io包中, java.io.InputStream 表示字节输入流。 java.io.OutputStream表示字节输出流,处于java.io包最顶层。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后才干实现一定的功能。

1. io流的详细分类

一、按I/O类型来整体分类:

 1. Memory 1)从/向内存数组读写数据: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream

                   2)从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream

     2.Pipe管道  实现管道的输入和输出(进程间通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream

     3.File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream

     4. ObjectSerialization 对象输入、输出 :ObjectInputStream、ObjectOutputStream

     5.DataConversion数据流 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型。字节。整数和浮点数)):DataInputStream、DataOutputStream

     6.Printing 包括方便的打印方法 :PrintWriter、PrintStream

     7.Buffering缓冲  在读入或写出时,对数据进行缓存。以降低I/O的次数:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream

     8.Filtering 滤流,在数据进行读或写时进行过滤:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream过

     9.Concatenation合并输入 把多个输入流连接成一个输入流 :SequenceInputStream 

    10.Counting计数  在读入数据时对行记数 :LineNumberReader、LineNumberInputStream

    11.Peeking Ahead 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream

    12.Converting between Bytes and Characters 依照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader,Writer的转换类):InputStreamReader、OutputStreamWriter

二、按数据来源(去向)分类: 

1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter 

2、byte[]:ByteArrayInputStream, ByteArrayOutputStream 

3、Char[]: CharArrayReader, CharArrayWriter 

4、String: StringBufferInputStream, StringReader, StringWriter 

5、网络数据流:InputStream, OutputStream, Reader, Writer

7. 字节流InputStream/OutputStream

 1. InputStream抽象类 

InputStream 为字节输入流。它本身为一个抽象类,必须依靠其子类实现各种功能。此抽象类是表示字节输入流的全部类的超类。 继承自InputStream 
的流都是向程序中输入数据的,且数据单位为字节(8bit)。

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的经常用法: 

  (1) public abstract int read( ):读取一个byte的数据。返回值是高位补0的int类型值。若返回值=-1说明没有读取到不论什么字节读取工作结束。

  (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 

  (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据。存放到偏移量为off的b数组中。 

  (4) public int available( ):返回输入流中能够读取的字节数。

注意:若输入堵塞。当前线程将被挂起,假设InputStream对象调用这种方法的话,它仅仅会返回0,这种方法必须由继承InputStream类的子类对象调用才实用。 

  (5) public long skip(long n):忽略输入流中的n个字节。返回值是实际忽略的字节数, 跳过一些字节来读取 

  (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.

基本的子类:

1) FileInputStream把一个文件作为InputStream,实现对文件的读取操作     

    2) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 

    3) StringBufferInputStream:把一个String对象作为InputStream 

    4) PipedInputStream:实现了pipe的概念,主要在线程中使用 

    5) SequenceInputStream:把多个InputStream合并为一个InputStream

 2.OutputStream抽象类

  OutputStream提供了3个write方法来做数据的输出。这个是和InputStream是相相应的。

  1. public void write(byte b[ ]):将參数b中的字节写到输出流。 

  2. public void write(byte b[ ], int off, int len) :将參数b的从偏移量off開始的len个字节写到输出流。

  3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。 

  4. public void flush( ) : 将数据缓冲区中数据所有输出。并清空缓冲区。

  5. public void close( ) : 关闭输出流并释放与流相关的系统资源。

基本的子类:

1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 

      2) FileOutputStream:把信息存入文件里 

      3) PipedOutputStream:实现了pipe的概念,主要在线程中使用 

      4) SequenceOutputStream:把多个OutStream合并为一个OutStream

流结束的推断:方法read()的返回值为-1时;readLine()的返回值为null时。

3. 文件输入流: FileInputStream类

FileInputStream能够使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完毕或写入完毕的过程中。这么一个byte数组通常被当作缓冲区,由于这么一个byte数组通常扮演承接数据的中间角色。

作用:以文件作为数据输入源的数据流。

或者说是打开文件,从文件读数据到内存的类。

用法(1)    

   File  fin=new File("d:/abc.txt"); 

  FileInputStream in=new FileInputStream( fin);

用法(2)

   FileInputStream  in=new  FileInputStream(“d: /abc.txt”);

程序举例:

将InputFromFile.java的程序的内容显示在显示器上

  1. import java.io.IOException;
  2. import java.io.FileInputStream;
  3. ;
  4. public class TestFile {
  5. public static void main(String args[]) throws IOException {
  6. try{
  7. FileInputStream rf=new   FileInputStream("InputFromFile.java");
  8. int n=512;   byte  buffer[]=new  byte[n];
  9. while((rf.read(buffer,0,n)!=-1)&&(n>0)){
  10. System.out.println(new String(buffer) );
  11. }
  12. System.out.println();
  13. rf.close();
  14. } catch(IOException  IOe){
  15. System.out.println(IOe.toString());
  16. }
  17. }
  18. }

4.文件输出流:FileOutputStream类

   作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件

FileOutputStream类用来处理以文件作为数据输出目的数据流。一个表示文件名称的字符串,也能够是File或FileDescriptor对象。

  创建一个文件流对象有两种方法: 

  方式1: 

   File   f=new  File (“d:/myjava/write.txt ");

        FileOutputStream  out= new FileOutputStream (f);

  方式2: 

  FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt "); 

  方式3:构造函数将 FileDescriptor()对象作为其參数。

  FileDescriptor() fd=new FileDescriptor(); 

  FileOutputStream f2=new FileOutputStream(fd); 

  方式4:构造函数将文件名称作为其第一參数,将布尔值作为第二參数。

  FileOutputStream f=new FileOutputStream("d:/abc.txt",true); 

  注意: (1)文件里写数据时,若文件已经存在,则覆盖存在的文件。(2)的读/写操作结束时,应调用close方法关闭流。

程序举例:使用键盘输入一段文章,将文章保存在文件write.txt中


  1. import java.io.IOException;
  2. import java.io.FileOutputStream;
  3. public class TestFile {
  4. public static void main(String args[]) throws IOException {
  5. try {
  6. System.out.println("please Input from      Keyboard");
  7. int count, n = 512;
  8. byte buffer[] = new byte[n];
  9. count = System.in.read(buffer);
  10. FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt");
  11. wf.write(buffer, 0, count);
  12. wf.close(); // 当流写操作结束时,调用close方法关闭流。
  13. System.out.println("Save to the write.txt");
  14. } catch (IOException IOe) {
  15. System.out.println("File Write Error!");
  16. }
  17. }
  18. }

5. FileInputStream流和FileOutputStream的应用

利用程序将文件file1.txt 复制到file2.txt中。

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.io.FileOutputStream;
  4. import java.io.FileInputStream;
  5. public class TestFile {
  6. public static void main(String args[]) throws IOException {
  7. try {
  8. File inFile = new File("copy.java");
  9. File outFile = new File("copy2.java");
  10. FileInputStream finS = new FileInputStream(inFile);
  11. FileOutputStream foutS = new FileOutputStream(outFile);
  12. int c;
  13. while ((c = finS.read()) != -1) {
  14. foutS.write(c);
  15. }
  16. finS.close();
  17. foutS.close();
  18. } catch (IOException e) {
  19. System.err.println("FileStreamsTest: " + e);
  20. }
  21. }
  22. }

6. 缓冲输入输出流 BufferedInputStream/ BufferedOutputStream

      

计算机訪问外部设备很耗时。訪问外存的频率越高。造成CPU闲置的概率就越大。

为了降低訪问外存的次数。应该在一次对外设的訪问中。读写很多其它的数据。

为此,除了程序和流节点间交换数据必需的读写机制外。还应该添加缓冲机制。缓冲流就是每个数据流分配一个缓冲区,一个缓冲区就是一个暂时存储数据的内存。这样能够降低訪问硬盘的次数,提高传输效率。

BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。

BufferedOutputStream :当从向缓冲流读取数据时候。系统先从缓冲区读出数据。待缓冲区为空时,系统再从输入设备读取数据到缓冲区。

1)将文件读入内存:

将BufferedInputStream与FileInputStream相接

FileInputStream in=new  FileInputStream( “file1.txt ” );

BufferedInputStream bin=new  BufferedInputStream( in);

2)将内存写入文件:

将BufferedOutputStream与 FileOutputStream相接

FileOutputStreamout=new FileOutputStream(“file1.txt”);

BufferedOutputStream  bin=new BufferedInputStream(out);

3)键盘输入流读到内存

将BufferedReader与标准的数据流相接 
 InputStreamReader sin=new InputStreamReader (System.in) ;
BufferedReader bin=new             BufferedReader(sin);
  1. import java.io.*;
  2. public class ReadWriteToFile {
  3. public static void main(String args[]) throws IOException {
  4. InputStreamReader sin = new InputStreamReader(System.in);
  5. BufferedReader bin = new BufferedReader(sin);
  6. FileWriter out = new FileWriter("myfile.txt");
  7. BufferedWriter bout = new BufferedWriter(out);
  8. String s;
  9. while ((s = bin.readLine()).length() > 0) {
  10. bout.write(s, 0, s.length());
  11. }
  12. }
  13. }

程序说明:

从键盘读入字符,并写入到文件里BufferedReader类的方法:String
readLine()

作用:读一行字符串,以回车符为结束。

BufferedWriter类的方法:bout.write(String s,offset,len)

作用:从缓冲区将字符串s从offset開始,len长度的字符串写到某处。

Java输入输出流(2)的更多相关文章

  1. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  2. 深入理解Java输入输出流

    Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...

  3. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

  4. Java输入输出流(一)——常用的输入输出流

    1.流的概念:在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流--输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分 ...

  5. java 输入输出流1 FileInputStrem&&FileOutStream

    通过文件输入流读取问价 package unit6; import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...

  6. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

  7. java输入输出流(内容练习)

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...

  8. Java输入输出流(转载)

    转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ...

  9. 转 Java输入输出流详解(非常详尽)

    转  http://blog.csdn.net/zsw12013/article/details/6534619 通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都 ...

  10. java输入输出流(I/O)总结

    io流的 四个基本类 java.io包中包含了流式I/O所需要的所有类.在java.io包中有四个基本类:InputStream.OutputStream及Reader.Writer类,它们分别处理字 ...

随机推荐

  1. npm 的指令介绍

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  2. Python+Django+js+echarts引入本地js文件的操作方法

    1. 选择正确的echarts.js,开发版选择echarts.baidu.com上的源码版,避免出现问题 2. 在项目主目录中新建static文件夹,里面建立js.css.images文件夹 3. ...

  3. SharePoint自动化系列——通过PowerShell在SharePoint中批量做数据

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ PowerShell是基于.NET的一门脚本语言,对于SharePoint一些日常操作支持的很好. ...

  4. 适配器模式和外观模式(head first设计模式——6)

    为什么要把适配器模式和外观模式放在同一篇文章中,主要是其相对前面的几个模式来讲会简单些并且具有相似之处.下面就分别通过例子来看理解一下两种模式,然后再进行对其进行比较. 一.适配器模式 1.1适配器模 ...

  5. spark与flume整合

    spark-streaming与flume整合  push package cn.my.sparkStream import org.apache.spark.SparkConf import org ...

  6. 【Visual Studio】报错SignTool Error: No certificates were found that met all the given criteria.

    问题:Virtual Studio如果证书或SignTool.exe签名工具出了问题,编译运行项目时会报这个错误. 解决:参考下面内容. http://stackoverflow.com/questi ...

  7. uboot全局数据gd_t、bd_t和device_t

    gd_t定义在include/asm-arm/global_data.h 33  /* Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE &g ...

  8. 修改jdk

    (一)修改jdk的path: (二)修改eclipse里面的jre环境 (三)修改具体项目的jre环境 build path -> config build path (四)修改服务运行环境

  9. javascript 复制与粘贴操作

    <script language="javascript"> function readTxt() { alert(window.clipboardData.getDa ...

  10. Oracle中的job的定时任务

    Oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...