IO

I/O
一、什么是I/O
input/output 输入/输出流
I/O是在JVM和外部存储设备(外部数据源)之间交换数据
输入和输出是以JVM为目标为基准。流入JVM内存称之为输入,反之为输出。
二、File类 java.io.File 表示磁盘的文件或目录
1、构造方法:
new File("d://a//1.txt");//绝对路径
new File("d://abc","1.txt");
2、两个特征:
(1)File不仅可以表示一个文件,也可以表示一级目录
(2)一个File对象不一定是磁盘中已经存在的文件或目录
3、主要方法:
canRead() 是否可读
canWrite() 是否可写
createNewFile() 创建一个新文件 成功(true)失败(false)
File f = new File("d://a//1.txt");
boolean b = f.createNewFile();
delete() 删除文件
deleteOnExit() 在程序退出时删除
exists() 判断文件是否存在
getName() 返回文件名称
getParent() 父目录的名字
getParentFile() 返回父目录的File
getPath() 返回完整的路径名
isAbsolute() 判断是否为绝对路径
new File(".//a.txt");//相对路径
isDirectory() 看是否是目录
isFile() 看是否是文件
isHidden() 看是否是隐藏的
lastModified() 最后一次修改时间 long类型1970~毫秒数
length() 长度,单位:字节
list() 返回String[],当前目录下所有文件或目录的名称。
f.list()要求f必须是目录
listFile() 返回File[],
当前目录下所有文件或目录的File对象
listRoots() 列出当前文件系统可访问的根目录
File[] static方法
File[] fs = file.firstRoots();
mkdir() 创建目录 类似于createNewFile();
setReadOnly() 设值为只读
三、通过流对象进行文件的访问
1、流的分类
(1)按照数据的传输方向
I 输入流 从外部设备读进程序
O 输出流 从程序输出到外部设备OutPutStream
外部设备:硬盘、显示器、终端、网络
(2)按照数据传输单位
字节流 一次传输一个字节
字符流 一次传输一个字符,需要和字符编码联系
不同的字符编码字节数不同
(3)按照流的功能来划分
节点流(底层流) 可以直接指定数据的来源目的,通过节点流就可以拿到数据。
包装流(上层流) 使用了装饰模式,针对底层流包装了更多功能,也叫过滤流。
四、InputStream 抽象类 代表输入流
构造方法public InputStream()
三个基本的read方法
A、int read(); 从流中读出一个字节返回,如果返回-1表示结束
B、int read(byte[]); 将数据读入到字节数组中,并返回所读取的字节数int
C、int read(byte[],int offset, int len)
offset 表示从哪个字节开始(偏移量)
len 表示希望读取的字节长度
int 返回所读取的字节数
available() 看返回之是否>0,决定可读的字节数。
close() 关闭流对象,非常重要
注意:只有自己打开的流在使用完之后必须关闭
System.out.println();out.close()无需关闭,
关闭流的目的:释放资源,能够清空缓冲区内容,
is.flush();
flush() 清空缓冲区,编程中极易忽略的语句
mark(int readlimit) 指定从当前读的字节开始,
最多保存多少字节,从而能够返回重新操作。
markSupported() 看是否支持mark(int)操作
reset() 返回到做标记得地方
skip(long n) 表示跳过多少字节,不做处理
五、OutputStream 抽象类,代表输出
构造方法:public OutputStream()
方法:
void write(int b) 写一个字节,只取int最低一个字节
void write(byte[] b)一次将byte[]中的字节写出
void write(byte[] b,int offset, int len)
以上方法没有返回值,如果抛出异常程序才中断都会抛出IOException
父类:java.io.IOException 输入输出异常
子类:java.io.FileNotFoundException 文件找不到异常
 java.io.EOFException end of file 表示文件结束
close() 关闭流,清空缓冲区
flush() 清空缓冲区,将缓冲区中的内容,强制的写出
六、FileInputStream InputStream的一个子类
FileInputStream文件输入流,说明,来源是文件
构造方法:
FileInputStream(File file) 必须是已经存在的文件
FileinputStream(String name)文件名(绝对路径/相对路径)
异常:FileNotFoundException文件找不到异常
是IOException的子类,
是Exception得子类,属于已检测异常,必须处理
方法:
int available() 返回下一次对此输入调用的方法可以不受阻塞的
从此输入流读入(或跳过)的估计剩余字节数。
void close() 关闭此文件输入流并是放与此流相关的所有系统资源。
protected void finalize() 确保在不再引用文件输入流时调用其close方法
int read() 从此输入流中读取一个数据字节
int read(byte[] b) 从此输入流中将最多b.length个字节的数据
读入到一个byte数组中
int read(byte[] b, int off, int len)从此输入流种将最多len个字节读入到
一个byte数组中。
long skip(long n) 从输入流中跳过并丢弃n个字节的数据
七、FileOutputStream OutputStream的一个子类
FileOutPutStream文件输出流是用于将数据写入 File 或 FileDescriptor 
的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某
些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打
开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中
的构造方法将失败。
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。
要写入字符流,请考虑使用 FileWriter。 
void close() 关闭此文件输出流并释放与
此流有关的所有系统资源。
void write(byte[] b) 将 b.length 个字节从指定 byte 
数组写入此文件输出流中。
void write(byte[] b, int off, int len) 将指定 byte 
数组中从偏移量 off 开始的 len 
个字节写入此文件输出流。
void write(int b)    将指定字节写入此文件输出流。
八、ReandomAccessFile 随机访问文件
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为
类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组
的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,
并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写
入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,
并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后
的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 
方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文
件末尾,则抛出 EOFException(是一种 IOException)。如果由于某
些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文
件末尾,则抛出 IOException,而不是 EOFException。需要特别指出
的是,如果流已被关闭,则可能抛出 IOException。 
九、常用过滤流(包装流)
装饰模式:
DataInputStream/DataOutputStream
ObjectInputStream/ObjectOutputStream
BufferedInputStream/BufferedOutputStream
(1)DataInputStream/DateOutputStream
传输的是8中基本类型以及字符串
包装流:让底层流具备上层流的功能
构造方法:
DataInputStream(InputStream)
DateOutputStream(OutputStream)
对于包装流,只需要关闭最外层流
(2)ObjectInputStream/ObjectOutptStream
具备了DataXXX和BufferedXXX流的功能,最重要的功能就是能够读写对象
readObject()/writeObject()直接读写对象
写对象时写哪些内容?
1)对象所述的类名称、类的全名
2)对象的所有属性的名称和属性类型
3)对象的属性值
方法定义在Student.class文件中,无需写入文件。
读对象时如何处理?
需要处理ClassNotFoundException
十、Reader/Writer字符流
Reader所有字符输入流的父类
int read() 读取的是一个字符,而不是一个字节
int read(char[]) char字符数组
int read(char[], int, int)

Reader的直接或间接子类(常用的)
FileReader
InputStreamReader
BufferedReader
Writer所有字符输出流的父类
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。

Writer的直接或间接子类(常用的)
FileWriter
OutputStreamWriter
BufferedWriter

如果需要指定以某种编码进行读写,就不能使用FileReader需要是用InputStreamReader
特点:从字节流转化为字符流的桥梁,可以指定字符编码
十一、如何选择流
1)byte/byte[] --> InputStream/OutputStream
2)int/double/char --> DataInputStream/DataOutputStream
3)char/String --> Reader/Writer
4)Object --> ObjectInputStream/ObjectOutputStream

2)可以在1)的基础上进行包装 buffered表示带缓冲的功能,需要注意输出是flush
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值