io流的基础知识

在这里插入图片描述

流的分类;流按照数据流的方向分,可以分为两种类型,分别是:
 输入流。从数据源读取数据到程序中。只能从中读取数据,而不能向其写入数据。
 输出流。将数据从程序写入数据目的地。只能从中写入数据,而不能从中读取数据。
流按照处理数据的最小单位的不同,可以分为两种类型,分别是:
 字节流。字节流是以byte为最小单位进行数据传送。io包中的字节流都继承自抽象类InputStream或OutputStream。
 字符流。字符流是以char为最小单位进行数据传送。io包中的字符流都继承自抽象类Reader或者Writer。
流按照流的功能分,可以分为两种类型,分别是:
 节点流。节点流是可以直接从/向一个特定的数据源(例如磁盘文件、内存、网络)读/写数据的流。节点流也称低级流。
 处理流。处理流不直接连接到设备,而是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能。
所有的IO操作都由以下步骤构成:
1) 建立流。根据数据源和具体的操作(是读取还是写入)选择流,然后建立流。通过 流的建立,创建内存到数据源之间的数据通道,以传输数据。
2) 操作流。将数据读取到内存,或将内存中的数据写入数据源。
3) 关闭流。流操作结束后,释放所有与该流相关联的系统资源。

文件类;
java.io包中的File类提供了管理磁盘文件和目录的基本功能。我们可以将一个File对象看成是代表一个文件或目录的名称和位置的字符串。File类有四个构造方法:

 public File(String pathname)。创建一个与指定路径名关联的File对象。
 public File(String parent, String child)。使用指定参数创建一个File对象。参数parent代表一个目录,参数child代表在parent中的子目录或文件。
 public File(String parent, String child)。使用指定参数创建一个File对象。参数parent代表一个目录,参数child代表在parent中的子目录或文件。
 public File(URI uri)。使用给定的java.net.URI对象创建一个File对象。URI是统一资源标识符,一个文件的URI是“file:///目录/文件名”格式。
File类中常用的方法;
boolean canWrite() 判断文件是否可写
boolean canRead() 判断文件是否可读
boolean createNewFile() 创建一个新文件
boolean delete() 删除文件对象代表的文件或目录。删除目录时必须保证此目录为空,否则无法删除
boolean exists() 判断文件或目录是否存在
String getAbsolutePath() 获得文件绝对路径
boolean isFile() 判断是否是文件
boolean isDirectory() 判断是否是目录
long lastModified() 获得文件最后一次修改时间
long length() 得到文件长度
String[] list() 返回包含目录中所含文件的文件名的字符串数组
File[] listFiles() 返回该目录中java.io.File对象数组
boolean mkdir() 创建目录
更多具体方法可以参考JDK里面。

字节流;字节流用于处理二进制文件。所有字节流都继承于抽象类InputStream和OutputStream两个父类。其中InputStream为读取字节流的父类,OutputStream为写入字节流的父类。
java.io.InputStream类中提供的方法,这些方法提供了管理流的信息、从流中读取数据、查明流中有多少可用数据、前进到流中的一个新位置以及关闭流等功能。

int available() ;返回可从该输入流中读取的字节数
void close() ;关闭输入流,并释放所有与该流相关联的系统资源
abstract int read() ;从输入流读取下一个字节。读取完毕,返回-1
int read(byte[] b); 从输入流中读取一些字节,并将这些字节存入缓冲数组b。读取完毕,返回-1
int read(byte[] b,int off,int len); 从输入流指定位置off开始读取数据的前len个字节,并将其读入字节型数据中。读取完毕,返回-1。
ava.io.OutputStream类中提供的方法,这些方法提供了向流中写入数据、将流中数据刷入目标并关闭该流的基本功能。
void close() ;关闭输出流,并释放所有与该流相关联的系统资源
void flush() ;刷新该输出流,并强制写出所有缓冲输出字节
abstract void write(int b); 将指定字节写到该输出流中
void write(byte[] b); 将指定字节数组b中数据写入该输出流
void write(byte[] b,int off,int len); 将指定字节数组b中数据,从off处开始,写入len长度字节到该输出流中。
低级字节流
字节流中的主要低级流,根据其输入和输出的设备或数据源,分为三类:
 对二进制文件进行读写操作的FileInputStream和FileOutputStream类,其数据源是磁盘文件。
 对内存缓冲区中的字节数组进行读写操作的ByteArrayInputStream和ByteArrayOutputStream类,其数据源是内存中的字节数组。
 对线程管道进行读写操作的PipedInputStream和PipedOutputStream类,其数据源是线程管道。
高级字节流
高级字节流对低级字节流进行了封装,并有许多功能的扩展,包括过滤流类,对象流和合并。
字符流;字符流用于处理文本文件。所有字符流都继承于抽象类Reader和Writer两个父类。其中Reader为读取字符流的父类, Writer为写入字符流的父类。
字符流包括低级和高级俩种,其中高级里还包括了缓冲流,转换流和打印输出流。

流的使用原则;

一、按数据源分类

  1. 如果数据源是文件,对于字节流,使用FileInputStream和FileOutputStream;对于字符流,使用FileReader和 FileWriter。
  2. 如果数据源是字节数组byte[],则使用ByteArrayInputStream和ByteArrayOutputStream。
  3. 如果数据源是字符数组Char[],则使用CharArrayReader和CharArrayWriter。
  4. 如果数据源是String对象,对于字节流,则使用StringBufferInputStream和StringBufferOuputStream;对于字符流,则使用StringReader和StringWriter。
  5. 如果数据源是网络数据流,对于字节流,使用InputStream和OutputStream;对于字符流,使用Reader和Writer。
    二、按是否格式化输出分:要格式化输出,则使用PrintStream或PrintWriter。
    三、按是否要缓冲分,要缓冲的话,对于字节流使用BufferedInputStream和BufferedOutputStream;对于字节流,使用BufferedReader和BufferedWriter。
    四、按数据格式分
  6. 二进制格式(只要不能确定是纯文本的):使用InputStream、OutputStream 及其所有带 Stream结束的子类。
  7. 纯文本格式(含纯英文与汉字或其他编码方式):使用Reader、Writer 及其所有带 Reader、Writer 的子类。
    五、按输入输出分
  8. 输入:使用Reader、InputStream 类型的子类。
  9. 输出:使用Writer、OutputStream 类型的子类。
    六、特殊需要。
    在不考虑特殊需求的情况,决定使用哪个类以及它的构造进程的一般准则如下:
    首先,考虑最原始的数据格式是什么:原则四。
    第二,是输入还是输出:原则五。
    第三,是否需要转换流:原则六第1点。
    第四,数据源是什么:原则一。
    第五,是否要缓冲:原则三(特别注明:一定要注意的是readLine()是否有定义,有什么比 read()、write()更特殊的输入或输出方法)。
    第六,是否要格式化输出:原则二

猜你喜欢

转载自blog.csdn.net/qq_43039291/article/details/82899255