java之IO

本文涉及的产品
系统运维管理,不限时长
简介: IO流主要用于硬板、内存、键盘等处理设备上得数据操作   一.IO流分类     java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同角度对其分类:     1.按数据流的方向不同分为:输入流和输出流     2.

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 }

目录
相关文章
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
33 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
72 1
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
27天前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
43 0
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
35 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
44 2