java之IO

IO流主要用于硬板、内存、键盘等处理设备上得数据操作

一.IO流分类

    java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同角度对其分类:

    1.按数据流的方向不同分为:输入流和输出流

    2.按处理数据的单位不同分为:字节流和字符流

    3.按功能不同分为:节点流和处理流

  区别:

字符流和字节流的主要区别:

           1.读取的字节数:在读取数据的时候,字节流每次只读取一个字节,读到一个字节就返回一个字节;  

                                而字符流一次读取一个字符(中文对应的字节数,在ASCII码表中是2个,而在UTF-8码表中是3个)。每读到一个字符,就先去查指定的编码表,将查到的字符返回。

          2.处理的数据类型:字节流可以处理所有类型数据(如:图片,MP3,AVI视频文件)

                                 而字符流只能处理字符数据。

           结论:只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

      节点流和处理流的主要区别:

             节点流:可以从或向一个特定的数据源(节点)读写数据。(如文件内存)              处理流:“连接”在一个已存在的流(节点流或处理流)之上,能够为程序提供更为强大的读写功能。

二、IO流的四大抽象类:

    java.io包中所有流类型都分别继承自以下四种抽象流类型:

常用流结构图

三、InputStream

    继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit)。

  InputStream的基本方法

//读取一个字节,返回一个整数(0~255)。
//结束:返回-1,表示已到输入流的结尾。
public abstract int read() throws IOException                                             //阻塞式 

//读取一系列字节,存在byte数组中。返回实际读取的字节数。
//结束:返回-1,表示已到输入流的结尾。
public int read(byte[] buffer) throws IOException                         //阻塞式

//1.尝试读取len个字节,并存储到byte数组中(设 k 为实际读取的字节数,这些字节将存储在 b[off] 到 b[off+k-1]);以整数形式返回实际读取的字节数。
//结束:返回-1,表示已到输入流的结尾 
public int read(byte[] b, int off, int len) throws IOException          //阻塞式

//2.关闭流并释放与该流关联的所有系统资源
public void close() throws IOException                                       

//3.跳过n个字节不读,返回实际跳过的字节数
public long skip(long n) throws IOException                               

//4.
public int available() throws IOException

//5.标记当前位置,
//readlimit - 在标记位置失效前可以读取字节的最大限制。
public void mark(int readlimit)

//6.将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
public void reset() throws IOException

四、OutputStream

   继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8bit)。

OutputStream的基本方法

//向输出流中写入一个字节数据,该字节数据为参数b的低8位
public abstract void write(int b) 
           throws IOException                                           

//将一个字节数组中的数据写入输出流
public void write(byte[] b)
            throws IOException                     

//1.将byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void write(byte[] b, int off, int len) 
           throws IOException          

//2.关闭此输出流并释放与此流有关的所有系统资源
public void close()
           throws IOException

//3.刷新此输出流并强制写出所有缓冲的输出字节
public void flush()
           throws IOException                                

----输出流构造函数第二个参数置true:追加(在已有文件后进行输入)。 ----此类流会抛出FileNotFoundException需要对其进行显示捕捉

五、Reader

    继承自Reader的流都是用于向程序输入数据,且数据的单位为字符(16bit)

Reader的基本方法

//读取一个字符,返回一个整数(0~255)。
//结束:返回-1,表示已到输入流的结尾。
public abstract int read() throws IOException                                             //阻塞式 

//读取一系列字符,存在char数组中。返回实际读取的字符数。
//结束:返回-1,表示已到输入流的结尾。
public int read(char[] buffer) throws IOException                         //阻塞式

//1.尝试读取len个字符,并存储到char数组中(设 k 为实际读取的字符数,这些字符将存储在 b[off] 到 b[off+k-1]);以整数形式返回实际读取的字符数。
//结束:返回-1,表示已到输入流的结尾 
public int read(char[] b, int off, int len) throws IOException          //阻塞式

//2.关闭流并释放与该流关联的所有系统资源
public void close() throws IOException                                       

//3.跳过n个字符不读,返回实际跳过的字符数
public long skip(long n) throws IOException                               

六、Writer

   继承自Writer的流都是输出数据,且数据的单位为字符(16bit)

Writer的基本方法

//向输出流中写入一个字符数据,该字符数据为参数c的低8位
public abstract void write(int c) 
           throws IOException                                           

//将一个字符数组中的数据写入输出流
public void write(char[] cbuf)
            throws IOException                     

//1.将char 数组中从偏移量 off 开始的 len 个字符写入此输出流
public void write(char[] cbuf, int off, int len) 
           throws IOException         

//2.写入字符串 
public void write(String str)
           throws IOException

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


//3.关闭此输出流并释放与此流有关的所有系统资源
public void close()
           throws IOException

//4.刷新此输出流并强制写出所有缓冲的输出字符
public void flush()
           throws IOException    

 void write(int c) throws IOException 向输出流写入一个字符数据

    void write(String str) throws IOException将一个字符串中的字符写入到输出流

    void write(String str,int offset,int length)

    将一个字符串从offset开始的length个字符写入到输出流

    void flush() throws IOException

    将输出流中缓冲的数据全部写出到目的地

七、节点流类型

八、处理流

九、缓冲流

缓冲流“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能。提高了读写效率,同时增加了一些新的方法。

四种缓冲流:

1.BufferedReader

构造方法:

//   创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in) 

//  创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)

强大的方法:readLine()                //一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,当读到末尾时,返回null。 跨平台

2.BufferedWriter

构造方法:

// 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out) 

// 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
BufferedWriter(Writer out, int sz) 

强大的方法: newLine()       //写入一个行分隔符。跨平台

3.BufferedInputStream

构造方法:

//创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in) 

//创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 

4.BufferedOutputStream

构造方法:

// 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out) 

//创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size) 

    十一、转换流:主要作用将字节流转换成字符流。用处较大!

     转换流在构造时可以指定其编码集合

     构造函数:

 InputStreamReader(InputStream);                  //通过该构造函数初始化,使用的是本系统默认的编码表GBK。  
 InputStreamWriter(InputStream,String charSet);   //通过该构造函数初始化,可以指定编码表。  


 OutputStreamWriter(OutputStream);                //通过该构造函数初始化,使用的是本系统默认的编码表GBK。  
 OutputStreamwriter(OutputStream,String charSet); //通过该构造函数初始化,可以指定编码表。

    例:OutputStreamWriter osw = new OutputStreamWriter (new FileOutputStream(文件路径);

    方法例:osw.getEncoding(); 获得流的编码方式

    十二、数据流与字节数组流:

    通常只要存取基本数据类型的数据如long,boolean,就需要通过DataStream进行包装。

    数据流是字节流

    DataInputStream需要和InputStream套接

    DataOutputStream需要和OutputStream套接

    DataInputStream方法:readBoolean() readInt() read……()……

    DataOutputStream方法与DataInputStream方法对应

    int readInt();//一次读取四个字节,并将其转成int值  
    writeInt(int);//一次写入四个字节,注意和write(int)不同,write(int)只将该整数的最低一个8位写入,剩余三个8为丢失  
    short readShort();  
    writeShort(short);  
    String readUTF();//按照utf-8修改版读取字符,注意,它只能读writeUTF()写入的字符数据。  
    writeUTF(String);//按照utf-8修改版将字符数据进行存储,只能通过readUTF读取。
    readUTF();//网络传输常用方法 读一个Unicode字符串  
    //此构造函数等于已可以往一个字节数组里输入内容

    ByteArrayOutputStream baos = new ByteArrayOutputStream ();

    //此方法为获取一个字节数组方法返回字节数组

    baos.toByteArray();

    //此方法获取字节数组占了多少字节

    new ByteArrayInputStream(一个字节数组)。available()

1ByteArrayOutputStream baos =  2                        new ByteArrayOutputStream();  3    DataOutputStream dos =  4                        new DataOutputStream(baos); 5    try { 6      dos.writeDouble(Math.random()); 7      dos.writeBoolean(true); 8      ByteArrayInputStream bais =  9          new ByteArrayInputStream(baos.toByteArray());10      System.out.println(bais.available());11      DataInputStream dis = new DataInputStream(bais);12      System.out.println(dis.readDouble());13      System.out.println(dis.readBoolean());14      dos.close();  dis.close();15    } catch (IOException e) {16      e.printStackTrace();17    }

    十二、Print流

    PrintStream:字节打印流,它的构造函数可以接受三种数据类型的参数:

                      1.字符串路径。  2.File对象    3.OutputStream  

              System.out对应的类型就是PrintStream;

    PrintStream:字符打印流,它的构造函数可以接受四种类型的值:

                      1.字符串路径。  2.File对象   3.OutputStream    4.Writer 

             对于1、2类型的数据,可以指定编码表,也就是字符集;对于3、4类型的数据,可以指定自动刷新,当该自动刷新为True时,只有3个方法可以 用:println,printf,format。

    PrintWriter和PrintStream的输出操作不会抛出异常

    PrintWriter和PrintStream有自动flush功能

    ----System.setOut(接收OutputStream类):用于设置系统默认输出流

    十二、Object流

    序列化,用直接将Object写入或读出

    transient关键字为不序列化此成员变量

    需要序列化的类必须实现Serializable接口

    主要方法:writeObject(Object); readObject();

    读出为Object类型需要强转数据类型

 1 import java.io.*;  2   3 public class TestObjectIO {  4  public static void main(String args[]) throws Exception {  5         T t = new T();  6         t.k = 8;  7         FileOutputStream fos = new FileOutputStrea("d:/share/java/io/testobjectio.dat");  8         ObjectOutputStream oos = new ObjectOutputStream(fos);  9         oos.writeObject(t); 10         oos.flush(); 11         oos.close(); 12  13         FileInputStream fis = new FileInputStream("d:/share/java/io/testobjectio.dat"); 14         ObjectInputStream ois = new ObjectInputStream(fis); 15         T tReaded = (T)ois.readObject(); 16         System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k); 17  18     } 19 } 20  21 class T  22  implements Serializable 23 { 24  int i = 10; 25  int j = 9; 26  double d = 2.3; 27  transient int k = 15; 28 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李家的小酒馆

Java IO(Properties/对象序列化/打印流/commons-io)

Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集。Prop...

2060
来自专栏小樱的经验随笔

Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo

C. Did you mean... time limit per test:1 second memory limit per test:256 megaby...

2735
来自专栏向治洪

Kotlin 是如何避免空指针问题的

在谈Kotlin的优势的时候,大家都会想到空指针安全这一点,那么Kotlin又是如何避免这些问题的呢?下面从Kotlin的一些语法规则上给出介绍。 可空类型 默...

1987
来自专栏java初学

java异常处理及自定义异常的使用

1297
来自专栏Coding迪斯尼

自制Monkey编程语言编译器:增加数组操作API和Mapsh数据类型

1233
来自专栏码神联盟

面试题 | 《Java面试题集》 -- 第二套

start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()就跟调用普通方法是一样...

1112
来自专栏Java面试笔试题

Java中有几种类型的流?

字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io 包中还有许多其他的流,主...

1082
来自专栏java闲聊

JDK8-Lambda表达式集合操作

public static List<Dish> toLists(){ return Arrays.asList( new...

993
来自专栏成长道路

文件的字节流和字符流

1.字节流 进行读取出文本的内容 try { FileInputStream fis=new FileInputStream(fileName); ...

2160
来自专栏个人随笔

Java 持久化操作之 --io流与序列化

1)File类操作文件的属性 1.File类的常用方法 ? 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路...

2959

扫码关注云+社区

领取腾讯云代金券