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. HTML的级联Select

    系统开发中,经常遇到级联Select的状况,而级联的Select Option数据一般记录于DB,如果每次都重新写一套级联Select,工作将是繁琐滴... 一般来说,写一套级联的Select的几个步 ...

  2. 三、为什么String在Java中是不可更改的

    String在Java中是个不可更改的类.一个不可更改的类简单来说就是这个类的所有实例是不可以更改的.所有的实例信息在创建的时候被初始化而且信息是不可以更改的.不可更改的类有很多好处.这篇文章总结了为 ...

  3. js实现点击按钮实现上一张下一张相册滚动效果

    /****判断图片是否构成滚动效果*/$(function(){    if($("#bar").find('img').size()*71<=$("#bar&qu ...

  4. cjson库

    - 源码方式引用,只有两个文件- 标准C89编写 - [cJSON 库项目地址](https://github.com/DaveGamble/cJSON)

  5. iostbleView刷新后显示指定cell

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_q ...

  6. 【Unity】用代码给按钮动态添加点击事件

    问题:多数情况下用UGUI的Button控件身上的OnClick()列表可以指明该按钮点击后触发的回调.现在想要调用自定义脚本里的方法,当这个脚本挂在Button所属的Canvas身上时,传入Canv ...

  7. 【WPF】CommandParameter解决多传参问题

    方法一:传参按钮控件自身绑定的ItemSource 用WAF框架实现MVVM,按钮的点击事件都要通过Command来传递到这个View对应的ViewModel上,再通过ViewModel传递到上层的C ...

  8. 应用层timer_libc_posix timer

    应用层除了通过setitimer/getitimer设置获取timer外,还可通过timer_create()等一系列函数实现应用层timer功能. 应用流程 The timers created b ...

  9. ScriptX使用

    自己研究了一下ScriptX并且做了个事例,希望可以帮到需要的同学 下载地址: http://download.csdn.net/detail/jine515073/7234575

  10. mysql修改密码与password字段不存在mysqladmin connect to server at localhost failed

    mysqladmin: connect to server at 'localhost' failed 停止mysql服务 systemctl stop mysql 安全模式启动 chown -R m ...