IO的核心组成就是五个类(File、OutputStream、InputStream、Reader、Writer)一个接口(Serializable)
1.File文件操作类
1.1File类的使用:
1)直接实例化对象,两个构造方法:
- public File(String pathname) ;
- public File(String parent, String child),设置父路径和子路径。
2)创建一个新文件:public boolean createNewFile()
3)判断文件是否存在:public boolean exists()
4)删除文件:public boolean delete()
1.2目录操作:
1)取得父路径或父File对象:
- public String getParent();
- public File getParentFile();
2)创建目录:
- public boolean mkdirs() 无论有多少级父目录,都会创建)
- public boolean mkdir()
1.3文件信息:
- 判断路径是否是文件: public boolean isFile()
- 判断路径是否是目录: public boolean isDirectory()
- 取得文件大小(字节): public long length()
- 最后一次修改日期 : public long lastModified()
1.4 综合案例
public class BeanCopy {
/**
* 将源对象中与目的对象相同属性,源对象的属性值copy赋值给目的对象
* @param source 源对象
* @param target 目标对象
*/
public static void beanCopy(Object source, Object target) {
//取得对象
Class sourceClass = source.getClass();
Class targetClass = target.getClass();
//取得对象中的属性
Field[] sourceFields = sourceClass.getDeclaredFields();
Field[] targetFields = targetClass.getDeclaredFields();
for (Field s : sourceFields) {
for (Field t : targetFields) {
if (s.getName().equals(t.getName())) {
s.setAccessible(true);
t.setAccessible(true);
try {
t.set(target,s.get(source));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
}
}
2.字节流和字符流
2.1操作流程:
1)根据文件路径创建File类对象 ;
2)根据字节流或字符流的子类实例化父类对象 ;
3)进行数据的读取或写入操作;
4)关闭流(close())。
2.2流分为字节流和字符流。字节流与字符流操作的本质区别只有一个:
- 字节流是原生的操作,而字符流是经过处理后的操作。
2.3字节输出流(OutputStream)
由于OutputStream是一个抽象类,所以要想为父类实例化,就必须要使用子类。
- 将给定的字节数组内容全部输出:public void write(byte b[]) throws IOException
- 将部分字节数组内容输出:public void write(byte b[], int off, int len) throws IOException
- 输出单个字节:public abstract void write(int b) throws IOException;
2.4AutoCloseable自动关闭支持
可以自动进行关闭处理,但是需要结合try……catch使用。
2.5字节输入流:InputStream
- 读取数据到字节数组中,返回数据的读取个数:public int read(byte b[])
- 读取部分数据到字节数组中:public int read(byte b[], int off,int len)
- 读取单个字节:public abstract int read()
2.6字符输出流:
- Writer类提供了一个直接输出字符串的方法:public void write(String str)
2.7字符输入流:
在Reader类中没有方法可以直接读取字符串类型,这个时候只能通过字符数组进行读取操作
2.8字节流和字符流的特点:
- 在以后进行IO处理的时候,如果处理的是图片、音乐、文字都可以使用字节流,而只有处理中文的时候才会使用字符流。
3 转换流
- OutputStreamWriter: 将字节输出流变为字符输出流(Writer对于文字的输出要比OutputStream方便)
- InputStreamReader: 将字节输入流变为字符输入流(InputStream读取的是字节,不方便中文的处理)
4 内存操作流
除了文件之外,IO的操作也可以发生在内存之中,这种流称之为内存操作流。文件流的操作里面一定会产生一个文件数据(不管最后这个文件数据是否被保留)。
4.1 字节内存流:ByteArrayInputStream、ByteArrayOutputStream
- public ByteArrayInputStream(byte buf[])
- public ByteArrayOutputStream()
4.2 字符内存流:CharArrayReader、CharArrayWriter
- Public CharArrayReader(char buf[])
- Public CharArrayWriter()
5 打印流
打印流解决的就是OutputStream的设计缺陷,属于OutputStream功能的加强版。如果操作的不是二进制数据,只是想通过程序向终端目标输出信息的话,OutputStream不是很方便,其缺点有两个:
- a、所有的数据必须转换为字节数组。
- b、如果要输出的是int、double等类型就不方便了
打印流设计的主要目的是为了解决OutputStream的设计问题,其本质不会脱离OutputStream。
5.1字符打印流
- Public PrintWriter(Writer out)
- Public PrintWriter(OutputStream out)
5.2字节打印流
- Public PrintStream(OutputStream out)
5.3格式化输出
- public PrintStream printf(String format, Object ... args)字符串(%s)、数字(%d)、小数(%m.nf)、字符(%c)等。例如:
PrintUtil.printf("姓名:%s,年龄:%d,工资:%1.2f", name,age,salary) ;