Java基础(六):IO流

IO流

File(表示一个文件或者目录)

File类是io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等。

File类的对象主要用来获取文件本身的一些信息,如文件所在目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,而文件也是数据流最常用的数据媒体。

常用方法

  1. 在windows中filename不区分大小写。
  2. 在windows中路径分隔符是‘\’,‘\’是转义字符,所以要写为‘\\’。如果写‘/’则不用转义。
  3. 删除目录时如果目录下有文件要递归删除。
方法说明
构造函数
File(String fileName);使用绝对路径。
File(String parent, String child);使用父路径和相对路径。
File(File parent, String child);使用目录和文件名称。
创建
boolean createNewFile();创建一个文件。
boolean mkdirs();创建多级目录。
boolean mkdir();创建单个目录。
删除(目录不为空要递归删除)
boolean delete();删除一个文件或者空目录。
获取
String getAbsolutePath()获取绝对路径。
String getPath()获取创建时路径。
String getName()获取名称。
String getParent()获取上级目录名称。
String getLength()获取文件大小。
判断
boolean exists()判断是否存在。
boolean isFile();判断是否是文件。
boolean isDirectory();判断是否是目录。
目录遍历
String[] list()返回目录下的内容
File[] listFile()返回目录下的文件对象。

IO概述

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

顶级父类

输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

字节流

OutputStream

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

方法名称方法说明
public void close()关闭此输出流并释放与此流相关联的任何系统资源。
public void flush()刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b)将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len)从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
public abstract void write(int b)将指定的字节输出流。
FileOutputStream

java.io.FileOutputStream是文件输出流,OutputStream的子类。用于将数据写出文件。

构造方法

  • public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。

上面两个构造方法,如果原文件不存在会新建,如果存在则会清空原文件,对其进行覆盖。如果想追加续写,要使用下面的构造方法。

  • public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。

InputStream

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

方法名称方法说明
public void close()关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read()从输入流读取数据的下一个字节。
public int read(byte[] b)从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
FileInputStream

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

  • FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符流

Writer

java.io.Writer抽象类是表示用于读取字符流的所有类的超类,可以写出字符信息到内存中。它定义了字符输出流的基本共性功能方法。

方法名称方法说明
public abstract void close()关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush()刷新此输出流并强制缓冲的输出字符被写出。
public void write(int c)写出一个字符。
public void write(char[] cbuf)将 b.length个字符从字符数组写出此输出流。
public abstract void write(char[] b, int off, int len)从指定的字符数组写出 len字符,从偏移量off开始输出到此输出流。
public void write(String str)写出一个字符串。
FileWriter

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。

Reader

java.io.Reader 抽象类是表 示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

方法名称方法说明
public void close()关闭此流并释放与此流相关联的任何系统资源。
public int read()从输入流读取一个字符。
public int read(char[] cbuf)从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
FileReader

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

小贴士:

字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。idea中UTF-8

字节缓冲区:一个字节数组,用来临时存储字节数据。

构造方法

  • FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。

缓冲流

缓冲流,也称为高效流,对于四个FileXXX进行增强。

缓冲流内部有一个数组缓冲区(8192),真正操作文件的是底层的输入流。

输入流输出流
字节缓冲流BufferedInputStreamBufferedOutputStream
字符缓冲流BufferedReaderBufferedWriter

字节缓冲流

构造函数

  • BufferedOutputStream(OutputStream out);
  • BufferedInputStream(InputStream in)
FileOutputStream fos = new FileOutputStream("文件路径");
BufferedOutputStream bos = new BuffferedOutputStream(fos);

FileInputStream fis = new FileInputStream("文件路径");
BufferedInputStream bos = new BuffferedInputStream(fis);

字符缓冲流

构造方法

  • BufferedReader(Reader in)
  • BufferedWriter(Writer out)
FileReader fr = new FileReader("文件路径");
BufferedReader br = new BufferedReader(fr);
br.readLine(); //特有方法:读一行文字

FileWriter fw = new FileWriter("文件路径");
BufferedWriter bw = new BUfferedWriter(fw);
bw.newLine(); //特有方法:写一行分隔符。与系统无关
字符编码和字符集
  • 字符编码:就是一套自然语言的字符和二进制数之间的对应规则。
  • 字符集:编码表,是一个系统支持的所有字符的集合,包括各国文字,标点符号,图形,数字等。
  • 常见的字符集

ASCII字符集、GBK字符集、Unicode字符集

转换流

InputStreamReader

转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流

OutputStreamWriter

转换流 java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法

  • OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。

序列化

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

序列化和反序列操作

  1. 想要序列化的类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。

  2. 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态或者静态,使用transient 或者static 关键字修饰。

  3. **当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常。**通过手写serialVesionID可以避免。

ObjectOutputStream

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

构造方法

public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream

ObjectInputStream

java.io.ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法

public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。

打印流

PrintStream

java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

构造方法

  • public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。

特殊方法

  • print() 不换行打印,原样输出。
  • println() 换行打印,原样输出。

System.out就是一个打印流。可以通过System.setOut(PrintStream ps) 方法设置打印流的输出流向。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值