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 }

目录
相关文章
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
361 0
|
10月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
367 1
|
12月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
261 3
|
12月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
706 23
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
572 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
383 10
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
588 0