java I/O流
- 一、File类
- 1. 构造器
- 2.路径路径分隔符和系统有关:
- 3. 常用方法
- 获取
- 创建
- 删除
- 重命名
- 判断
- 二、IO流原理及流的分类
- 流的分类
- IO流体系
- 三、InputStream&Reader
- 四、OutputStream&Writer
- 五、IO流总结
- 字节流
- 字符流
- 六、节点流(文件流)
- 七、缓冲流
- 八、转换流
- 九、标准输入、输出流
- 十、打印流
- 十一、数据流
- 十二、对象流
- 十三、随机存取文件流
- 十四、NIO.2中Path、 Paths、Files类的使用
- NIO
- Path、Paths和Files
- Path
- Files
- 知识图谱
一、File类
- java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
- File能新建、删除、重命名文件和目录,但不能访问文件内容本身,需要输入/输出流
- 想要在java中表示一个真实存在的文件或目录,必须有一个File对象,但File对象可能没有一个真实存在的文件或目录
文件和目录是可以通过File封装成对象的
对于File而言,封装的仅仅是路径名。
1. 构造器
- public File(String pathname):以pathname为路径创建File对象。
- public File(String parent,String child):以parent为父路径,child为子路径创建对象
- public File(File parent,String child):根据一个File对象,子文件路径创建对象
2.路径路径分隔符和系统有关:
- windows和Dos用“\”
- UNIX和URL用“/”
java 支持跨平台,要慎用
java提出File的一个常量动态提供分隔符
public static final String separator
File file = new File
("D:"+File.separator+"io"+separator+"index.html")
3. 常用方法
方法名 | 说明 |
createNewFile() | 创建文件,true |
mkdir | 创建单级目录,true |
mkdirs | 创建多级目录,true |
isDirectory | 是否为目录 |
isFile | 是否为文件 |
exists | 是否存在 |
getAbsolutePath | 获取绝对路径 |
getPath | 转为路径名字符串 |
getName | 获取名称 |
list | 返回所有名称数组 |
listFiles | 返回File对象数组 |
delete | 删除路径对象文件或目录 |
获取
创建
删除
重命名
public boolean renameTo(File dest):把文件重命名为指定文件的路径
判断
二、IO流原理及流的分类
- IO:输入/输出(input/output)
- 流:是一种抽象的概念,是数据传输的总称,也就是数据在设备间的传输称为流,流的本质:是数据的传输
- 分类:
- 输入流、输出流(读数据、写数据)
- 字节流(8bit)、字符流(16bit)(万能流,普通字符流)
- 节点流、处理流
抽象基类 | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
流的分类
IO流体系
使用
- 操作纯文本,优先字符流
- 操作图片、视频、音频等,优先字节流
- 不清楚类型,优先字节流。字节流是万能流
三、InputStream&Reader
程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,应显示关闭文件IO资源
InputStream
- int read(): 读取输入流中数据的下一字节,返回0~255范围内int字节值。到达流末尾返回-1;
- int read(byte[] b): 从输入流中将最多b.length个字节数据读入byte数组中。到达末尾返回-1,否则以整数形式返回实际读取字节数;
- int read(byte[] b,int off,int len):将输入流最多len个数据字节读入byte数组。尝试len个字节,有可能小。到达末尾返回-1。
- public void close()throws IOException: 关闭所有系统资源
Reader - int read(): 读取单个字符,作为整数读取的字符,范围在0~65535之间(0x00-0xffff)(2个字节的Unicode码)。末尾返回-1
- int read(char[] cbuf): 将字符读入数组。到达流末尾,返回-1.否则返回本次读取字符数
- int read(char[] cbuf,int off,int len):从off开始读取len个字符,存储cbuf数组。
四、OutputStream&Writer
OutputStream
- write(int b)、write(byte[] b)、write(byte[] b,int off,int len)
- public void flush()throws IOException:刷新此输出流并强制写出所有缓冲的输出字节。将字节立即写入预期目标
Writer
- void write(int c)
- void write(char[] cbuf)
- void write(char[] cbuf,int off,int len)
- void write(String str):写入字符串
- void write(String str,int off,int len):写入字符串某一部分
五、IO流总结
字节流
字符流
六、节点流(文件流)
节点流
直接从数据源或者目的地读写数据
FileReader、FileWriter
读取文件
1.创立一个流对象,将已存在文件加载进流
FileReader fr = new FileReader(new File(“Test.txt”));
2.创建一个临时数组
char[] ch = new char[1024]
3.调用对象的读取方法
fr.read(ch)
4.关闭资源
fr.close()
FileReader fr = null;
try{
fr = new FIleReader(new File("c:\\test.txt"));
char[] buf = new char[1024];
int len;
while((len = fr.read(buf))!=-1){
System.out.print(new String(buf,0,len));
}
}catch(IOException e){
System.out.println("read-Exception:"+e.getMessage());
}finally{
if(fr!=null){
try{
fr.close();
}catch(IOException e){
System.out.println("close-Exception"+e.getMessage())
}
}
}
写入文件
1.创立一个流对象,建立数据存放的地方
FileWriter fw = new FileWriter(new File(“Test.txt”));
2.调用对象的写方法
fw.write(“dasdasd”)
3.关闭资源,并将流中数据清空到文件中
fw.close()
注意
public FileOutputStream(String name,boolean append)
- 写入文件时,FileOutputStream(file),目录下有同名文件将被覆盖
- 使用FileOutputStream(file,true),则目录下同名文件不会被覆盖,在文件末尾追加内容
- 字符流操作字符,如txt,java,c,cpp等;doc,excel,ppt不是文本文件!
七、缓冲流
- 为了提高读写速度,带缓冲功能的流类;
- 缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:BufferedInputStream和BufferedOutpuStream;BufferedReader和BufferedWriter。
- 读取数据先存入缓冲区,直到缓冲区存满,才一次性写入文件或从文件下一次读取。
- 缓冲区的流对象close,关闭之前会刷新缓冲区。关闭外层流,内层自动关闭。
BufferedReader br = null;
BufferedWriter bw = null;
try{
//创建缓冲流,是对节点流的包装
br = new BufferedReader(new FileReader("d:\\Iotest\\source.txt"));
bw = new BufferedWriter(new FileWriter("D:\\test.txt"));
String str;
while((str=br.readLine())!=null){
bw.write(str);
bw.newLine();//写入行分隔符
}
bw.flush();
}catch(){
}finaly{
关闭流
}
八、转换流
字符流 = 字节流 + 编码表
- InputStreamReader:从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName) - OutputStreamWriter:从字符流到字节流
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认编码集
OutputStreamReader(OutputStream in)
OutputStreamReader(OutputStream in,String charsetName)
九、标准输入、输出流
- System.in 和 System.out 分别代表了系统标准的输入输出设备
- 默认:键盘、显示器
- System.in类型是InputStream
- System.out是OutputStream的子类FilterOutputStream的子类
- 重定向:通过System类的setIn和setOut方法改变默认设备的输入输出
public static void setIn(InputStream in)
public static void setOut(Outputstream out)
InputStream | 标准输入流-Scanner |
PrintStream | 标准输出流-System.out |
PrintStream | 字节打印流 |
PrintWriter | 字符打印流 |
十、打印流
实现将基本数据类型的数据格式转化为字符串输出
打印流:PrintStream和PrintWriter
- 提供重载的print()和prinln()方法
- 不会抛出异常
- 有自动flush功能
- PrintStream打印使用平台默认字符编码转换为字节,需要写入字符不是字节时用PrintWriter
- System.out返回PrintStream实例
InputStream | 标准输入流-Scanner |
PrintStream | 标准输出流-System.out |
PrintStream | 字节打印流 |
PrintWriter | 字符打印流 |
十一、数据流
数据流的两类
DataInputStream+DataOutputStream
xxx readXxx()…/xxx writeXxx()
String readUTF()
十二、对象流
ObjectInputStream和ObjectOutputStream
- 用于存储和读取基本数据类型或对象的处理流。强大之处:把java对象写入数据源中,也能把对象从数据源还原回来
- 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
- 反序列化:用ObjectInputStream类读取基本类型或对象的机制
- 二者不能序列化static和transient修饰成员变量
对象序列化机制
允许把内存中java对象转换成平台无关的二进制流。持久保存在磁盘,通过网络传输。
将实现了serializable接口的对象转化成字节数据,可以随时还原
序列化是RMI(Remote Method Invoke-远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是javaEE的基础,因此序列化是javaEE的基础
支持序列化机制的前提:实现Serializable或Externalizable,否则报NotSerializableException
序列化标识符的静态变量:serialVersionUID。序列化版本控制
不显示定义的话,根据加吧运行环境自动生成,若类实例变量改变,该值可能变。建议显示声明。
通过SerialVersionUID判断版本是否一致。反序列化UID不一致抛出InvalidCastException
使用对象流序列化对象
1.创建一个ObjectOutputStream
2.调用对象的writeObject(对象)输出可序列化对象
3.注意写出一次,操作flush一次
反序列化
1.创建ObjectInputStream
2.调用readObject()方法读取流中的对象
强调:如果某个类属性是其他引用类型,那么这个这个属性引用类型必须可序列化,否则当前类不可序列化。
十三、随机存取文件流
RandomAccessFile类
- 声明在java.io包下,直接继承java.lang.Object类。并实现了DataInput、DataOutput两个接口。
- 支持“随机访问”方式。程序可以直接跳到文件的任意地方来读写。
- 对象包含一个指针,来标记读写位置
@ long getFilePointer():获取文件记录指针的当前位置
@ void seek(long pos):将文件记录指针定位到pos位置 - 构造器
@ RandomAccessFile(File file,String mode)
@ RandomAccessFile(String name,String mode) - mode参数,指定RandomAccessFile的访问模式:
r、rw、rwd读写+同步内容更新、rws读写+同步内容和元数据更新 - r:读存在文件,不在报错;rw:不在创建
应用
断点传送
十四、NIO.2中Path、 Paths、Files类的使用
Java NIO概述
- java NIO(new IO)是java1.4引入的。与原来io有相同的作用目的,但使用方式不同。NIO面向缓冲区(IO面向流的)、基于通道的IO操作。更高效。
- 提供了两套NIO,一个是标准的NIO,另一个是网络编程的NIO。
NIO.2
- 随着JDK7的发布,增强了文件处理和文件系统特性的支持。
NIO
Path、Paths和Files
Path
Path接口:代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File的升级版本,实际引用资源也不存在。
以前IO
inport java.io.File;
File file = new File(“index.html”);
java7之后
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get(“index.html”);
Paths:包含了两个返回Path的静态工厂的方法
Paths类提供静态get()方法来获取Path对象
- static Path get(String first,String… more):用于将多个字符串串连成路径
- static Path get(URI uri):返回指定uri对应的Path路径
Files
Files包含了大量静态的工具方法来操作文件
知识图谱