IO的操作部分重点掌握两个代码模型,IO的核心组成是5个类(File、OutputStream、InputStream、Reader、Writer)一个接口(Serializable)
File文件操作类:
java.io.File是一个普通类,直接产生实例化对象即可。如果要实例化对象则需要用到两个构造方法:
public File(String pathname);
public File(String parent,String child);根据父路径与子路径取得实例化File对象
如果要进行文件的基本操作,可以使用File类的如下方法:
public boolean creatNewFile()throws IOException :创建文件
File类只是创建文件本身,但是对内容并不做处理
判断文件是否存在: public boolean exists();
删除文件:public boolean delete();
取得操作系统分隔符:public static finally String separator
目录操作:
取得父路径或者父File对象:public String getParent():取得父路径
public File getParentFile():取得父File对象
创建父路径:若想创建父路径,此时最好取得父路径的File类对象
public boolean mkdirs():无论多少级父目录,全都一次创建
判断父目录是否存在以及父目录的创建操作非常重要,对开发很重要
获取文件信息:
判断路径是否是文件:public boolean isFile()
判断路径是否是目录:public boolean isDirectory();
取得文件的大小:public boolean length():单位为字节
最后一次修改日期:public long lastModified()
取得一个目录的全部组成:public File[] listFiles()
字节流与字符流:
File类不支持文件内容操作,如果要处理文件内容,必须要通过流的操作模式来完成,流分为输入流和输出流
在java.io包中,流分为两种:字节流和字符流
字节流:InputStream,OutputStream
字符流:Reader,Writer
字节流是原生操作 字符流是处理后的操作
流的操作模式: 以文件输出为例: 1.根据文件路径取得File类
2.取得File对象的输入输出流
3.通过输入输出流进行数据的传输
4.关闭流(非常重要)
对于IO操作属于资源处理,所有的资源处理操作(IO操作,数据库操作,网络)最好必须要进行关闭
OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:
Closeable:public void close()throws IOException 关闭流处理
Flushable:public void flush()throws IOException 刷新缓冲区
在OutputStream类中还定义有其他方法:
1.将给定的字节数组内容全部输出:public void write()(byte[])throws IOException
2.将部分字节数组内容输出:public void write(byte[],int off 起始位置,int len 长度)throws IOException
3.输出单个字节:public abstract void write(int b1)throws IOException
在进行文件传输时,所有的文件会帮助用户自动创建,无需调用creatnewFile()手动创建
write方法,文件默认输出为覆盖输出、
AutoCloseable支持自动关闭:但是由于要结合try。。。catch使用,且使用方式比较特殊,所以不推荐使用
字节输入流:InputStream
InputStream类在程序中读取文件内容
InputStream只实现了Closeable接口,在InputStream类中提供有如下方法:
1.读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组的大小大于读取的数据大小,返回的就是读取的个数,如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度,如果没有数据了还在读则返回-1;public int read(byte[])throws IOException 最常用方法
2.读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满了则返回长度(len),如果没有读取满则返回读取的数据个数,如果读取到最后没有数据了,就返回-1:public int read (byte[],int off ,int len)throws IOException
3.读取单个字节,每次读取一个字节的内容,直到没有数据了返回-1:public abstract int read()throws IOException
同OutputStream的使用一样,InputStream是一个抽象类,如果要对其实例化,同样也需要使用子类,如果哟啊对文件进行处理,则需要使用FileInputStream类
字符输出流:Writer
字符适合处理中文数据,Writer是字符输出流的处理类,这个类的定义如下:
public abstract class Writer implements Appendable ,Closeable ,Flushable
不关闭流,数据无法输出到终端,因为字符有缓冲区,或者通过强制清空缓冲区的方式flush(),如果不关闭强制进行输出,调用flush()方法
Writer提供了一个直接输出字符串的方法:
public void writer (String str)throws IOException
以后进行IO处理时,如果处理图片,音乐,文字都可以使用字节流,只有处理中文才考虑使用字符流
字符输出流:Reader
方法同InputStream,只不过是字符
Reader依然是一个抽象类
Reader中没有方法可以直接读取字符串类型,这时候只能通过在字符数组进行读取操作
转换流:字节流和字符流是可以互相进行转换的
字符编码:
常用的字符编码有: 1.GBK、GB2312:表示的是国标编码,GBK包含简体和繁体中文,而GB2312只包含简体中文,也就是说,这两种编码都是描述中文的编码
2.UNICODE编码:java提供的16进制编码,可以描述世界上任意的文字信息,但是如果现在所有的字母都使用16进制编码,那么这个编码太庞大了,会造成网络传输负担
3.ISO859-1:国际通用编码,但是所有的编码都需要进行转换
4.UTF编码,相当于结合了2和3,也就是说需要用到16进制文字使用UNICODE,而如果是字母就使用ISO8859-1,而常用的就是UTF-8编码格式
乱码产生分析:90%都是编解码不一致
内存操作流:以内存做为终端
1.字节内存流:ByteArrayInputStream、ByteArrayOutputStream
2.字符内存流:CharArrayReader、CharArrayWriter
打印流:属于OutputStream功能的增强版本,其本质不会脱离OutputStream
打印流分为字节打印流:PrintStream、字符打印流:PrintWriter
打印流属于典型的装饰设计模式,核心仍然是某个类的功能,但是为了得到更好的操作效果,扩充其功能而已
输出流就用打印流,输入流就用Scanner。Scanner可以接收各种数据类型,帮助用户减少转型处理,可以对接收的数据类型使用正则表达式
next和hasnext当遇到tab、换行、空格时默认作为新的个体
取得指定类型的数据:public 数据类型 nextXXX()
定义分隔符:public Scanner useDelimiter(Pattern pattern)
构造方法:public Scanner(InputStream source)
判断是否有指定类型数据:public boolean hasNextXXX()
序列化:
基本概念:将内存中的对象变为二进制数据流的形式进行传输,或是将其保存在文本中,但是并不是所有的类的对象都能被序列化,这个类必须实现java。io。Serializable接口,但是这个接口并没有任何的方法定义,只是一个标识而已。JVM会识别此类然后序列化
如果要实现序列化与反序列化的对象操作,在java。io包中提供有两个处理类ObjectOutputStream、ObjectInputStream
readObject()讲对象反序列化输入,writeObject(Object obj)将对象序列化输出