Java中的IO流及其“增强流”

1 IO流

I代表输入,O代表输出,流代表数据流
根据数据的流向分为:输入流和输出流。(内存与其他设备之间)
根据数据的类型分为:字节流和字符流。

2 字节流

不管是文件,图片,视频,在计算机中都是以二进制储存,所以字节流可以传输任何文件

2.1 OutputStream字节输出流

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开始输出到此输出流。publicabstractvoidwrite(intb):将指定的字节输出流。

2.1.1 FileOutputStream类

FileOutputStream类是OutputStream字节输出流的子类,用于文件输出,将数据写入文件。
构造方法

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

常用方法

public void write(int b);//写出一个字节
public void write(byte[]b);//写出数组中的数据
public void write(byte[] b,int off,int len);//写出指定长度数组中的数据,索引从off开始,长度len

注意事项
1.不再输出时,需用close方法释放资源。(以下所有流中也是)
2.write(byte []b)方法常与字符串的getBytes方法使用,方便输出。
3.write(int b)b为字符的编码,例如b为65,输出的时A。
4.windows中换行符号为"\r\n",配合getBytes()和write(byte []b)输出换行符。
5.发现每次写入都会写入新文件,并覆盖原来的文件,如果想要追加写入,则需要特殊的构造方法:

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

append为追加“开关”,true开启追加模式。

2.2 InputStream字节输入流

InputStream是所有字节输入流的父类。常用方法有:

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

2.2.1 FileInputStream类

FileInputStream类是InputStream的子类,用于输入文件中数据。
构造方法

File InputStream(File file);//通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的File对象file命名。
File InputStream(String name);//通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名。
注意事项:不同于FileOutputStream,如果传入的文件或文件路径不存在,会抛出FileNotFoundException异常。

常用方法

public int read();//每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1
public int read(byte[]b);//每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1
注意事项:

1.读取是个重复的过程,采用循环。此处注意代码的书写:

FileInputStream fis = new FileInputStream("read.txt");
//定义变量,保存数据
int b;
//循环读取
while((b=fis.read())!=1){
System.out.println((char)b);
}
//关闭资源
fis.close();

不要舍弃变量保存,如果直接采用fis.read,一次循环就会读取两次。
2.用read(byte[] b)方法时,配合String中的指定字节数组指定位数的构造方法。

3 字符流

一个中文字符可能占用多个字节,这样使用字节流读取的时候会出现问题,字符流专门用来处理文本文件。

3.1 Reader字符输入流

Reader是所有字符输入流的父类,是抽象类,可以读取字符信息到内存中。
构造方法

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

3.1.1 FileReader类

构造方法

FileReader(File file);//创建一个新的FileReader,给定要读取的File对象。
FileReader(String fileName);//创建一个新的FileReader,给定要读取的文件的名称。
注意事项:构造时使用系统默认的字符编码和默认字节缓冲区。

常用方法

public int read();//每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1
public int read(char[] cbuf);//每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

3.2 Writer字符输出流

Writer是所有用于写出字符流的类的父类,是抽象类,将指定的字符信息输入到指定地点。
常用方法:

public void write(int c);//写入单个字符。
public void write(char[] cbuf);//写入字符数组。
public abstract void write(char[] cbuf,int off,int len);//写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
public void write(String str);//写入字符串。
public void write(String str,int off,int len);//写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
public void flush();
刷新该流的缓冲。
public void close();//关闭此流,但要先刷新它。

3.2.1 FileWriter类

是Writer的子类,用来写出字符到文件中。
构造方法

FileWriter(File file);//创建一个新的FileWriter,给定要读取的File对象。
FileWriter(String fileName);//创建一个新的FileWriter,给定要读取的文件的名称。
注意事项:构造时使用系统默认的字符编码和默认字节缓冲区。

常用方法

public void write(int b);//每次可以写出一个字符数据
public void write(char[] cbuf);//写入字符数组。 
public abstract  void write(char[] cbuf, int off, int len);//写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 
void write(String str);//写入字符串。 
void write(String str, int off, int len);// 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
public void flush();//刷新该流的缓冲。  
public void close();// 关闭此流,但要先刷新它。 

注意事项
1.内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果既想写出数据,又想继续使用流,就要flush 方法。
2.windows换行符号"\r\n" 。

4 属性集

Properties ,表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。

Properties类

构造方法;

public Properties();//创建一个空的属性列表。

常用方法

public Object setProperty(String key, String value);//保存一对属性。  
public String getProperty(String key);//使用此属性列表中指定的键搜索属性值。
public Set<String> stringPropertyNames();//所有键的名称的集合。
public void load(InputStream inStream;//从字节输入流中读取键值对。 

注意事项:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。

5 缓冲流

缓冲流分为:
字节缓冲流:
BufferedInputStream,BufferedOutputStream
字符缓冲流:
BufferedReader,BufferedWriter

缓冲流原理; 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

5.1 字节缓冲流

构造函数

public BufferedInputStream(InputStream in);//创建一个 新的缓冲输入流。 
public BufferedOutputStream(OutputStream out);// 创建一个新的缓冲输出流。

常用方法与原来的流相同。

5.2 字符缓冲流

构造方法:

public BufferedReader(Reader in);//创建一个 新的缓冲输入流。 
public BufferedWriter(Writer out);//创建一个新的缓冲输出流。

常用方法在原有基础上多了新方法:

BufferedReader:public String readLine();//读一行文字。 
BufferedWriter:public void newLine();//写一行行分隔符,由系统属性定义符号。

6 转换流

解码:将存储在计算机中的二进制数按照某种规则解析显示出来。
编码:按照某种规则,将字符存储到计算机中。
常见的字符集(编码表)

ASCII字符集

使用7位表示一个字符,共128字符,用于显示现代英语。扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。

GBK字符集

GB2312:一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字。
GBK:是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字。

Unicode字符集

也叫万国码,它最多使用4个字节的数字来表达每个字母、符号,或者文字。UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
注意:由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

InputStreamReader类

它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法:

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

OutputStreamWriter类

它输出字节,使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

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

注意:上述两类的常用方法与Reader和Writer的方法一样。

7 序列化

序列化:对象用字节序列输出到文件中。
反序列化:字节序列可以从文件中读取回来,重构对象。

ObjectOutputStream类

将Java对象的原始数据类型写出到文件,实现对象的持久存储。
构造方法

public ObjectOutputStream(OutputStream out);//创建一个指定OutputStream的ObjectOutputStream。

常用方法

public final void writeObject (Object obj);//将指定的对象写出。

注意事项
1.该对象的类必须实现Serializable接口。
2.所有属性必须是可序列化的,如有一个属性不需要序列化,需关键字transient。

ObjectInputStream类

将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
构造方法

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

常用方法:

public final Object readObject () ;// 读取一个对象。

注意事项
1.对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。
2.当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。

8 打印流

PrintStream类

构造方法

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

用来改变输出的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值