黑马程序员_JAVA学习之IO

来源:互联网 发布:有机合成工艺优化 编辑:程序博客网 时间:2024/05/09 23:50

  ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、描述和原理

1、描述:IO流通过数据流、序列化和文件系统提供系统输入和输出。

2、原理:在Java对于数据的操作是以流的输入输出形式进行的。Java SDK提供了各种流类,以获得不同种类的数据、程序可以通过标准的输出、输入数据。

二、流的分类

1、按操作数据分:

字节流:以字节为单位传输数据的流

字符流: 以字符为单位传输数据的流

2、按流向分:

输入流: 程序可以从中读取数据的流。

输出流: 程序能向其中写入数据的流。

三、字符流和字节流

        1、字节流:

       

抽象基类:输入流(InputStream)、输出流(OutputStream);

         InputStream常用的方法:

          int read();//读取一个字节并以整数形式返回,如果读取到输入流的末尾则返回-1

          int read(byte[] b);  //从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中

         intread(byte[] b, int off, int len);// 将输入流中最多 len 个数据字节读入 byte 数组

         voidclose();//关闭此输入流并释放与该流关联的所有系统资源

继承关系图:

例子(字节流读取文件):

/**

 * 字节流

 *读文件

 * */

import java.io.*;class hello{  public static void main(String[] args) throws IOException {      String fileName="D:"+File.separator+"hello.txt";      File f=new File(fileName);      InputStream in=new FileInputStream(f);      byte[] b=new byte[1024];      int count =0;      int temp=0;      while((temp=in.read())!=(-1)){          b[count++]=(byte)temp;       }      in.close();      System.out.println(new String(b));    }}


// fileInput从C盘里的text.txt中读取数据,并将读取出来的数据写入buf数组中,返回值len是写入buf数组的字节个数,当fileInput读取到的文件结尾时,则返回-1,跳出循环;

  OutputStream常用的方法:

int write(byte[]b);// 将 b.length 个字节从指定的 byte 数组写入此输出流

 int write(byte[]b, int off, int len);  //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流

         abstractint write(int b);// 将指定的字节写入此输出流

         voidclose();//关闭此输出流并释放与此流有关的所有系统资源。

void flush();//刷新此输出流并强制写出所有缓冲的输出字节。

例子:

   

File f = newFile("1.txt");               //向文件里写如"Hello"字符串.         try    {             //要写入的数据转换成字节数组             byte[] buf ="Hello".getBytes();                         //如果1.txt存在,则删除1.txt里面的内容,文本所有内容变为Hello             //如果1.txt不存在,在新建1.txt文本,写入Hello            FileOutputStream out = new FileOutputStream(f);                        out.write(buf);                    out.close();         }catch(Exceptione)    {            System.out.println(e);         } 

         2、字符流

        

         抽象基类:输入流(Reader)、输出流(Writer);

         Reader常用方法:

abstract void close();//关闭该流并释放与之关联的所有资源。

void mark(int readAheadLimit);//标记流中的当前位置。

boolean markSupported();//判断此流是否支持mark() 操作。

int read();//读取单个字符。

int read(char[] cbuf);//将字符读入数组。

abstract int read(char[] cbuf, int off, intlen);//将字符读入数组的某一部分。

int read(CharBuffer target);//试图将字符读入指定的字符缓冲区。

void reset();//重置该流。

 

Writer常用方法:

Writer append(char c);//将指定字符添加到此writer。

Writer append(CharSequence csq);// 将指定字符序列添加到此writer。

Writer append(CharSequence csq, int start,int end);// 将指定字符序列的子序列添加到此 writer.Appendable。

abstract void close();//关闭此流,但要先刷新它。

abstract void flush();//刷新该流的缓冲。

void write(char[] cbuf);// 写入字符数组。

void write(char[] cbuf, int off,int len);// 写入字符数组的某一部分。

abstract void write(int c);//将字符读入数组的某一部分。

void write(String str);//写入字符串。

void write(String str, int off, int len);//写入字符串的某一部分。

四、缓冲区buffer

         原理:缓冲相当于一个中间层,当你读的时候,先把你的文件读到缓冲区,然后再完成读的操作,写是一样的,缓冲区的作用就是为了避免这种硬盘的直接IO操作。

IO缓冲区的出现,大大的提高了对数据进行读写的性能。其中字符流包括:BufferedWriter和BufferedReader;字节流中包括:BufferedInputStream和BufferedOutputStream

实例:

package com.ljp.nio;import java.nio.IntBuffer;public class IntBufferDemo {         publicstatic void main(String[] args) {                   IntBufferbuf=IntBuffer.allocate(10); //声明int类型缓冲区                   System.out.println("1.写进数据之前:position="+buf.position()+","+                                     "limit="+buf.limit()+",capacity="+buf.capacity());                                     inttemp[]={2,3,4};                   buf.put(1);   //写入数据                   buf.put(temp);                   System.out.println("2.写进数据之后:position="+buf.position()+","+                                     "limit="+buf.limit()+",capacity="+buf.capacity());                   buf.flip();// 重置缓冲区 即position=0,limit=原本position                   System.out.println("3.准备输出数据时:position="+buf.position()+","+                                     "limit="+buf.limit()+",capacity="+buf.capacity());                   //输出缓冲去内容                   while(buf.hasRemaining()){                            intx=buf.get();                            System.out.print(x+"");                   }         }}


五、字节流和字符流的转换

         转换流的特点:其是字符流和字节流之间的桥梁,对读取到的字节数据经过指定编码转换成字符,对读取到的字符数据经过指定编码转换成字节。
那么何时使用转换流?

当字节和字符之间有转换动作时和当流操作的数据需要编码或解码时。

具体的对象体现:

InputStreamReader:字节到字符的桥梁

OutputStreamWriter:字符到字节的桥梁

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

实例1(字节流转字符流):

import java.io.*;public class Test{         publicstatic void main(String[] args)throws Exception{BufferedReader br=new BufferedReader(newInputStreamReader(System.in));//System.in这个对象是一个字节输入流,为了方便操作字符,特将它转为字符输入流 InputStreamReader isr=newInputStreamReader(new FileInputStream("in.txt"),"UTF-8");

实例2(字符流转字节流):

import java.io.*;public class Test{         publicstatic void main(String[] args)throws Exception{                   OutputStreamWriterosw=new OutputStreamWriter(new FileOutputStream("out.txt"),"UTF-8");}}

六、知识点总结:

基础IO流抽象类InputStream、OutputStream、Reader、Writer

为了起到一个的缓冲效果可以使用BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter

对于字节数据或是字符数据可以使用ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter

对于String数据操作可以使用StringReader、StringWriter、StringBufferInputStream

对于文件操作可以使用FileInputStream、FileOutputStream、FileReader、FileWriter

对于数据过滤可以使用FilterInputStream、FilterOutputStream、FilterReader、FilterReader

对于向外打印数据可以使用PrintStream、PrintWriter

对于处理大数据可以使用ObjectInputStream、ObjectOutputStream

 

0 0