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);//使用指定的文件名创建一个新的打印流。
用来改变输出的位置。