【JAVA基础】 IO详解

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 【JAVA基础】 IO详解

一、概述

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。既数据在两个设备之间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

二、IO流的作用

实现两个对象设备之间的数据传递

三、IO流的使用场景

  1. 当我们使用File类时只能实现对文件的操作,包括:获取文件属性,创建、删除,移动文件等等,但不能对文件的内容做出改动。如果想对文件内容操作的话,需要读取,删除文件内容等
  2. IO流的使用场景:需要对一个文件内容进行操作的时候。

IO流的操作对象是一个文件,而不是对一个文件夹进行读写的。 在使用IO流的时候注意不要与一个文件夹建立连接

四、IO流的分类

按照不同的分类标准分为不同的IO流:

4.1 传输数据的单位分:
  • 字节流: 传输的是字节,是以字节为单位的,字节流读取的最小单位是一个字节(1byte=8bit)。 可以操作任意类型的数据。
  • 字符流: 传输的是字节,一次可以读取一个字符(1char = 2byte = 16bit), 不同点是在传输过程中加入了编码的操作,让我们的操作更方便文本。
4.2 数据传输的方向分:
  • **输入流input:**读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
  • **输出流output:**将程序(内存)数据输出到磁盘、光盘等存储设备中
4.3 流的角色的不同分:
  • 节点流: 直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流。FileInputStream是一个节点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能。
  • 处理流: 它用于对一个已存在的节点流进行连接和封装,通过封装后的流来实现流的读写能力。当使用处理流时,程序不会直接连接到实际的数据源,而是连接在已存在的流之上

五、IO流体系

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader OutWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipeWriter
访问字符串 InputStreamReader OutputStreamWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputSteamReader
对象流 ObjectInputStream ObjectOutputStream
FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream

六、字节输入流InputStream

InputStream是一个虚拟类,在Java中是字符输入流,用来将文件中的数据读取到java程序中。

最常用的方法是:FileInputStream

  • 常用方法
  1. int read():从文件中读取一个字节数的数据。并返回读取到的这个字节。如果读取结束,返回是-1;
  2. int read(byte[] b):一次读取一个字节数组,输入流会把读到的内容放入到这个字节数组中,并返回读取到的一个数,如果读取结束返回-1;
  3. void close();关闭字节流;
  • FileInputStream实现步骤
  1. 创建一个FileInputStream流对象,绑定一个数据源文件
  2. 调用read方法读取数据
  3. 释放资源
  • 示例代码
public  void inputStreamMethod() throws Exception  {
     FileInputStream in=new FileInputStream("D:\\goyeer.txt");
     //创建Fileinptstream 流对象,并绑定源文件
     byte[] buf=new byte[1024];
     int len;
     //调用read方法读取数据
     while((len=in.read(buf))!= -1){
         String line=new String(buf,0,len,"UTF-8");
         System.out.println(line);
     }
}
  • InputStream体系

七、字节输出流 OutputStream

OutputStream类是Java IO API中所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。OutputStream是一个典型的装饰模式,使用时候直接new子类。OutputStream可以输出console,文件、磁盘等目标媒介中。

  • 常用方法
  1. void close(); 关闭输出流防止资源被大量占用,最终导致超出句柄或内存溢出。
  2. void write(int b);抽象类中唯一的抽象方法。非抽象子类必须实现这个方法。
  3. void write(byte b[])直接输出一个字节数组中的全部内容。
  4. void write(byte b[], int off, int len) 要输出的内容已存储在了字节数组b[]中,但并非全部输出,只输出从数组off位置开始的len个字节。
  5. void lush()刷空输出流,并输出所有被缓存的字节。由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
  • OutputStream实现步骤
  1. 创建一个OutputStream流对象
  2. write方法输入
  3. close关闭流防止内存有溢出
  • 示例代码
public void outputStreamMethod() throws IOException{
        OutputStream ou=new FileOutputStream("D:\\ShowCoding.txt");
        String str = "欢迎Goyeer社区";
        byte[] bytes = str.getBytes();
        for(int i = 0; i < bytes.length; i++) {
            ou.write(bytes[i]);
        }
        ou.close();
  }
  • OutputStream体系

八、字符输入流Reader

Reader是输入字符流的父类,它是一个抽象类,在文件读写是不推荐使用

  • 常用方法
  1. void close();关闭流并释放与之关联的所有资源;
  2. void mark(int readAheadLimit);标记流中的当前位置;
  3. boolean markSupported();判断此流是否支持mark()操作;
  4. int read();读取单个字符;
  5. int read(char[] cbuf); 将字符读入数组;
  6. int read(char[] cbuf, int off, int len);将字符读入数组的某一部分;
  7. int read(CharBuffer target) ;试图将字符读入指定的字符缓冲区
  8. boolean ready() ;判断是否准备读取此流;
  9. void reset();重置该流
  10. long skip(long n);跳过字符
  • Reader实现步骤
  1. 创建一个文件读取流对象与指定名称的文件相关联起来;保证文件已存在。当文件不存在时,会发生异常(FileNotFoundException);
  2. 调用读取流对象的read方法,一次读取一个字符,自动往后读取字符;
  3. 调用方法,关闭字符流;
  • 示例代码
public static void readerMethod() throws IOException{
    Reader reader=new FileReader("D:\\goyeer.txt");
    int ch = 0;
    char [] buf= new char[1024];
    while((ch=reader.read(buf))!=-1){
         System.out.print(new String(buf,0,ch));
    }
    reader.close();
}
  • Reader体系

九、字符输出流程Writer

Writer类是Java IO中所有Writer的基类,它位于java.io包下面的一个抽象类。实现Writer的实现子类,包含BufferedWriter和PrintWriter.

  • 常用方法
  1. Writer append(char c) 将指定字符添加到此 write
  2. Writer append(CharSequence csq) 将指定字符序列添加到此 writer
  3. Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列添加到此 writer.Appendable
  4. abstract void close() 关闭此流,但要先刷新它
  5. abstract void flush() 刷新该流的缓冲
  6. void write(char[] cbuf) 写入字符数组
  7. abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分
  8. void write(int c) 写入单个字符
  9. void write(String str) 写入字符串
  10. void write(String str, int off, int len) 写入字符串的某一部分
  • Writer实现步骤
  1. 通过子类实例化Writer
  2. 通过write方法实现文件写入操作
  3. close关闭输出流,释放资源。
  • 示例代码
public static  void writeMethod() throws IOException {
   Writer out = new FileWriter("D:\\goyeer.log");
   String str = "I/O字符流,Writer类应用。";        
   out.write(str);
   out.close();
}
  • Writer体系

十、总结

Java IO既Java输入输出系统,即in和out,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。在编写程序时选择适合自己场景的字节流和字符流,及abstract的子类灵活使用。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
15天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
38 9
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
86 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 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版)
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
39 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
95 1
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
60 0
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
224 12
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
39 0
|
3月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践