Java高级(四)Java的IO
1.了解输入输出的概念
之前的概念中:
Scanner 输入
System.out.print(); 输出
所谓的输入和输出都是相对于程序来提出的概念
I/O
input output
2.使用file操作文件或者目录
什么是文件:相关记录或者放在一起的数据集合
文件的后缀名有:
- .java
- .class
- .txt
- .ppt
- java.io.File
①boolean exists()判断文件或目录是否存在
delete只能删除空文件夹
如何删除非空文件夹:一个一个删【考试内容递归】
小知识:
commons-io(apache子项目)的使用
apache(阿帕奇基金会) commons是apache基金会下的一个子项目(它里面都是一些通用的代码)例如:文件上传,文件复制,连接池 加密处理 io是commons子项目下的一个 组件 里面写的都是通用的IO操作
3.Java I/O
持久化存储:介质
来自文件,内存,键盘的数据叫做数据源
程序是操作处理数据的
文件,内存,控制台数据汇
数据源→程序→数据汇
I input 输入
O output 输出
操作文件:相关记录或放在一起的数据的集合
4.File类 →创建文件对象
创建文件对象→物理文件或目录
File file=new File(String pathnane)路径格式:E:\myFile\hellow.txt
File类常用的方法
- exists()判断文件或目录是否存在
- String getPath()返回此对象表示的文件的相对路径名
- boolean delete只能删除空文件夹
- isFile() 判断是否是文件
- String getAbsolutePath()返回此对象表示的文件的绝对路径名
- boolean createNewFile();创建文件
- isDirectory() 判断是否是目录
- String getName();获取文件名
- long length();获取文件大小
- String[] list(); 获取当前目录下所有文件的名字
- File[] listFiles(); 获取当前目录下的所有文件
相对路径:当前位置继续往下找
绝对路径:从盘符开始出发的
5.java程序写或读文件
流:通过流来读写文件,流是一组有序的数据序列,以先进先出的方式发送信息的通道
InputStream 输入流 来自数据源的数据流
OutputStream 输出流 流向目的地的数据流
站在程序的角度,输入流(InputStream)读数据,输出(OutputStream)流写数据
java流的分类
按流向区分
输出流 OutputStream和Writer作为基类
输入流 InputStream和 Reader作为基类
按照处理数据单元划分
字节流 InputStream OutputStream(抽象类) 1英文字母=1字节
字符流 Reader Writer 1汉字=2字节 一个字节16位,为了快速高效的读取文本文件
【字节输入流】InputStream类的常用的方法(抽象类)子类为【FileInputStream】类
int 1.read()/2.(byte[] b)/3.(byte[] b,int off,int len)
1.把数据源的数据以字节的形式读入,之后会把字节对应的整数形式返回
2.从输入流读取若干个字节,把这些字节保存到数组b中,返回的是读取到的字节数
3.从输入流读取若干个字节,把这些字节保存到数组b中,off指的是:字节数组中开始保存数据的起始下标
len指读取的字节数目,返回的是读取到的字节数
- void close();关闭字节流
- int available();读取字节数目
- FileInputStream类常用的构造方法
- FileInputStream(File file)传一个文件
- FileInputStream(String pathname) 传了一个路径
【字节输出流】写OutputStream类的常用方法(抽象类)子类为【FileOutputStream】类
void Write 1.(int c) 2.(byte[] buf) 3.(byte[] b,int off,int len)
- void close();
- void flush(); 强制把缓冲区的数据写到输出流中。
- FileOutputStream的构造方法*
- FileOutputStream(File file)
- FileOutputStream(String path)
- FileOutputStream(String path,boolean appehd)可以指定覆盖或者追加文件
【字符输入流】读Reader
Reader类常用的方法
- int read()
- int (char[] c)
- int (char[] c,int off,int len)
- void close()
FileReader(Reader的子类)
- new FileReader(File file)
- new FileReader(String pathname)
【中文】】乱码!!
原因:文件编码格式 和 程序环境的编码格式不一致
解决方案:
字符流去读取文件的时候,按照指定字符流格式读FileReader 无法指定编码格式,会按照文件系统默认编码格式读 是reader类的子类
FileReader的父类InputStreamReader的构造方法 可以指定字符编码格式
1.InputStreamReader(FileInputStream fis)//需要一个字节流
2.InputStreamReader(FileInputStream fis ,String 字节编码格式)//需要一个字节流,一个字节编码格式
- 字符流:缓冲流BufferedReader:
- BufferedReader(Reader reader)构造方法
- readerLine();读取方法
【字符输出流】写 Writer抽象类子类为 FileWriter Writer(String)
- close()
- flush()清空缓存
**OutputStreamWriter类:可以指定字符编码格式OutputStreamWriter的构造方法 **
1.OutputStreamReader(FileOutputStream fos)//需要一个字节流
**2.OutputStreamReader(FileOutputStream fos ,String 字节编码格式)//需要一个字节流,一个字节编码格式 **
FileWriter类
以下两种构造方法都可以重载,制定一个boolean类型的参数,来追加或者覆盖源文件
- new FileWriter(File file)
- new FileWriter(String path)
- BufferedWriter 带缓冲区的输出流,读取并且复制一个文件的内容,变化并写入另一个文件
- BufferedReader 字符流读取,需要一个Reader参数
- FileInputStream 字节输入流
- InputStreamReader 读取 需要一个输入流参数
- FileWriter 写入文件
- BufferedWriter 字符写入文件 需要一个Writer参数
二进制文件的读写
输入流
DataInputStream dis=null;
FileInputStream fis=null;
fis=new FileInputStream("");
dis=new DataInputStream(fis);
输出流
DataOutputStream dos=null;
FileOutputStream fos=null;
fos=new FileOutputStream("");
dos=new DataOutputStream(fos);
int temp
while ((temp=dis.read())!=-1){
dos.write(temp);
}
6.序列化与反序列化
把对象变成流就是序列化 把对象从流里面取出来就是反序列化
ObjectInputStream 反序列需要FileInputStream对象做参数
readObject(fis);
ObjectOutputStream 序列化需要FileOutputStream对象做参数
writeObject(对象);
常见错误:
NOtserializableException:类没有实现Serializable接口,不可被序列化
transient屏蔽某些敏感字段的序列化
7使用反射机制
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。
Java反射有三个动态性质
1.运行时生成对象实例
2.运行期间调用方法
3.运行时更改属性
Java反射常用API
使用Java反射技术常用的类如下:
Class类:反射的核心类 ,反射所有的操作都是围绕该类生成的。通 过Class类,可以获取类的属性,方法等内容信息。
<font size=4>**Field类表示类的属性,可以获取和设置类中属性的值**</font>
<font size=4>**Method类,表示类的方法,可以用来获取类中方法的信息,或者执行方法。**</font>
<font size=4>**Constructor类:表示类的构造方法**</font>
Java程序中使用反射的基本步骤如下:
1.导入java.lang.reflect.*
2.获得需要操作的类的Java.lang.Class对象
3.调用Class的方法获取 Field Method 对象);
4.使用反射API进行操作。