java_IO
IO概念
数据存储在内存中,只是临时存储,再次运行程序数据会丢失,不能持久化。
持久化:把数据从内存中往其他存储设备存储的过程。
流:内存与存储设备之间传输数据的通道、管道。
IO的分类
按方向:(以JVM虚拟机为参照物)【重点】
输入流: 将< < 存储设备> > 中的内容读入到< < 内存> > 中。
输出流: 将< < 内存> > 中的内容写入到< < 存储设备> > 中。
按单位
字节流:以字节为单位,可以操作所有类型的文件。
字符流:以字符为单位,只能操作文本类型的文件。
文本类型的文件:可以用记事本打开的文件。例如:以 .java /.c/ .txt/ .html结尾的都是文本文件;而 以 .class /.mp3 /.mp4都不是文本文件。
按功能
节点流:具有基本的读写功能。
过滤流:在节点流的基础上,增加新的功能。
字节流(以字节为单位,可以操作所有类型的文件)
字节流的父类( ( 抽象类) ) :
• InputStream:字节输入流
public int read(){}
public int read(byte[] b){}
public int read(byte[] b,int off,int len){}
---------------------------------------------------------
• OutputStream:字节输出流
public void write(int n){}
public void write(byte[] b){}
public void write(byte[] b,int off,int len){}
### 节点流(具有基本的读写功能)
• FileOutputStream:文件字节输出
FileOutputStream fos=new FileOutputStream(“E:/CoreJava /a.txt”);
/*绝对路径:盘符:/文件夹名/文件名 或是 盘符 :\\文件夹名\\文件名
创建文件字节输出流时,如果指定的文件不存在,则系统会自动创建一个 文件,但是文件夹必须提前创建.*/
----------------------------------------------------------
FileOutputStream 继承OutputStream 中的方法:
public void write(int n);//将单个字节写入到文件中
• FileInputStream:文件字节输入流
----------------------------------------------------------
FileInputStream fos =new FileInputStream(“file/a.txt”);
/*参数:代表要读取哪一个文件中的内容,如果指定的文件不存在,则系统不会自动创建,而是抛出异常:java.io.FileNotFoundException:file\a.txt(系统找不到指定的文件)*/
常用方法
//将一组字节写入到文件中
public void write(byte[] b);
--------------------------------------------------------
//将字节数组的部分内容一次性的写入到文件中(从下标 off 开始,写入的字节个数为len)
public void write(byte[] b,int off,int len);
---------------------------------------------------------
//一次只读一个字节的内容,返回值代表读取到的字节内容,如果达到文件的尾部,则返回-1
public int read();
--------------------------------------------------------
//一次性读取多个字节的内容,并把读到的内容存储在字节数组b中,返回值代表实际读取到的字节数,如果达到文件的尾部,则返回 -1
public int read(byte[] b);
--------------------------------------------------------
//一次性读取多个字节的内容,并把读到的内容存储在字节数组b中(从off开始存储,读取的字节长度为len),返回值代表实际读取到的字节数,如果达到文件的尾部,则返回-1
public int read(byte[] b,int off,int len);
过滤流(在节点流的基础上,增加新的功能)
• 增强了缓冲区功能;
• 增强了读写8种基本数据类型和字符串功能;
• 增强了读写对象的功能:
readObject(); //从流中读取一个对象、
writeObject(Object obj); //向流中写入一个对象
缓冲流
BufferedOutputStream/BufferedInputStream
缓冲流,提高 IO 效率,减少访问磁盘的次数;
数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close.
数据流
DataOutputStream/DataInputStream
除了基本的读写操作,还可以操作8种基本数据类型:
• WriteByte(int n) / readByte()
• writeShort(int n) / readShort()
• writeInt(int n) / readInt()
• writeLong(long n) / readLong()
• writeFloat(float f) / readFloat()
• writeDouble(double d) / readDouble()
可以操作String数据:
writeUTF(String str)/readUTF()
对象流
ObjectOutputStream/ObjectInputStream
readObject();
//从流中读取一个对象(循环读取对象,当读到文档结尾时抛出EOFException异常)
writeObject(Object obj); //向流中写入一个对象
对象放在流上进行传输的过程称为对象序列化
对象序列化时必须保证对象是可序列化的,必须保证这个类实现java.io.Serializable。
被transient修饰的属性,不参与序列化
• 如果对象的属性,是自定义类型的对象时,则该对象也必须是可序列化的;
• 如果对集合对象序列化,必须保证该集合中的所有元素时可序列化的
编码
编码 | 备注 |
---|---|
ISO8859-1 | 西欧 |
GBK | 简体中文 |
BG2312 | 简体中文 |
GB18030 | 简体中文 |
BIG5 | 繁体中文- - 台湾 |
UTF-8 | 万国码 |
字符流
• 字符流的父类(抽象类):
• Reader :字符输入流
public int read(){}
public int read(char[] c){}
public int read(char[] b,int off,int len){}
• Writer: 字符输出流
public void write(int n){}
public void write(String str){}
public void write(char[] c){}
FileWriter
• FileWriter文件字符输出流,继承Writer中的方法:
• public void write(int n);//将单个字符写入到文件中
• public void write(String str);//一次性写入多个字符
---------------------------------------------------------
• FileReader 文件字符输入流 继承Reader 中的方法:
• public int read();//一次读取一个字符的内容
---------------------------------------------------------
//一次性读取多个字符的内容,将读取到的内容存储在char类型的数组中,返回值代表实际读取的字符个数,达到文件的尾部返回-1
• public int read(char[] c);
---------------------------------------------------------
//一次性读取多个字符的内容,将读取到的内容存储在char 类型的数组中,存储的起始下标为off, 读取的字符个数为len,返回值代表实际读取的字符个数,达到文件的尾部返回-1
• public int read(char[] c,int off,int len)
字符过滤流
BufferedReader/PrintWriter缓冲流
public String readLine():
//一次读取一个文本行的内容,达到文件尾部时,返回null。
public void println(String str):
//写入字符串后自动换行
InputStreamReader/OutputStreamWriter桥转换流
桥转换的作用:将字节流转换为字符流,转换的桥梁,同时可以设置字符的编码方式。
步骤总结:
• 创建字节节点流
• 创建桥转换流,同时设置编解码方式
• 包装过滤流,方便读写操作
• 读/写操作
• 关闭流:只需要关闭最外层流。
File类
• IO 流:对文件中的内容进行操作。
• File 类:对文件自身进行操作,例如:删除文件,文件重新命名等。
• public boolean createNewFile();
//创建文件,创建成功返回true ,如果文件存在返回值为 false。
• public boolean mkdir();
//创建文件夹,创建成功返回true,如果文件存在返回值为 false 。
• public boolean delete();
/*删除文件夹/文件,删除成功返回 true,否则为false。
• 当删除文件夹时,只有当文件夹为空时,才可以删除;
• 而删除文件时,不管文件内容是否为空,都会被删除。*/
• public boolean renameTo(File f);
//更改文件的名字,更改成功返回true,否则为 false
File类常用方法
• public boolean setReadOnly();
//设置文件为只读
• public String getName();
//获取文件名(含扩展名)、文件夹名。
• public boolean exists();
//判断一个文件或是目录是否存在,存在返回true,否则为 false 。
• public String getAbsolutePath();
//获得绝对路径。
• public File[] listFiles();
//获取当前文件下所有的文件、文件夹。
• public boolean isFile();
//判断 File 对象所对应的是否为文件,而不是目录。
• public boolean isDirectory();
//判断 File 对象所对应的是否为目录,而不是文件。