学习IO的准备工作。
清楚抽象类;
IO的核心组成就是五个类(File、OutputStream、InputStream、Reader、Writer)+一个接口(Serializable)
文件的读写在java中相对其它语言稍微麻烦一些,但是在上边的五个类加一个接口中我们还是能比较容易的实现。
一、File文件操作类
了解几个构造方法
1、public File(String pathname)
2、public File(String parent,String child) 设置父路径和子路径
3、public boolean createNewFile() throws IOException
//创建一个文件
4、public boolean exits() //判断文件是否存在
5、public boolean delete() //删除文件
6、public String getParent() //取得父路径
7、public File getParentFile() //取得父路径的File对象
8、public boolean mkdirs() //创建目录
9、public boolean isFile() //判断是否为文件
10、public boolean isDirectory() //判断是否为目录
11、public long length() //文件大小
12、public long lastModified() //最后一次修改日期
这些书与构造方法,已经封装好的,在使用的时候直接调用即可。
public class TestCreat {
public static void main(String[] args) throws IOException {
File file = new File("\\D:\\eclipse");
}
/**
*
* @param file
* 判定给定的是否为目录
* 列出子目录
* 循环
*/
private static void listAllFiles(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File file2 : files) {
listAllFiles(file2);
}
}
} else {
System.out.println(file);
}
}
}
实现递归打印当前目录下的所有层级的文件信息
二、字节流与字符流
此处为重点,在使用字节流和字符流的操作中,使用的基本流程是一样的:
1、根据文件路径创建File类对象
2、根据字节流或字符流的子类实例化父类对象
3、进行数据的读入或者写入的操作
4、关闭流(close()).
字节和字符流操作的本质区别只有一个:
字节流是原生的操作,而字符流是经过处理后的操作
字节流:InputStream、OutputStream
字符流:Reader、Writer
字节输出流:
OutputStream/Write
OutpuStream类:
1、实现了Closeable,Flushable两个接口:
Closeable:public void close () throws IOException;
Flushable:public void flush() throws IOException;
2、OutputStream中的其它方法:
public void write(byte b[])throws IOExpection
//将给定字符串的字节数组内容全部输出
public void write(byte b[],int len)throws IOException
//将部分字节数组内容输出
public abstruct void write(int b)throws IOException
//输出单个字节
3、OutputStream中的构造方法
public FileOutputStream(File file)throws FileNotFoundException
接收File类(覆盖)
public FileOutputStream(File file,boolean append)
接收File类(追加)
实现文件的输出:
public static void main(String[] args) throws IOException {
File file = new File(File.separator+ "D" + File.separator
+ "test" + File.separator + "test.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Writer writer = new FileWriter(file);
String mString = "hello java";
writer.write(mString);
writer.close();
}
在文件输出的时候,所有的文件会自动帮助用户创建,不需要调用creatFile()方法手工创建。
了解AutoCloseable接口:
在JDK1.7追加的一个接口,实现自动关闭支持。
但是一般的使用过程是要结合try..catch的
而且必须在try中定义对象
字节输入流:
InputStream/Reader:
InputStream的使用和OutputStream在一定程度上相似
1、InputStream 只实现了Closeable接口
2、InputStream提供的方法
1. 读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组大小大于读取的数据大小,则返
回的就是读取个数;如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度;如果没有
数据了还在读,则返回-1: public int read(byte b[]) throws IOException.最常用方法
2. 读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满了则返回长度(len),如果没有
读取满则返回读取的数据个数,如果读取到最后没有数据了返回-1:public int read(byte b[], int off,
int len) throws IOException
3. 读取单个字节,每次读取一个字节的内容,直到没有数据了返回-1:public abstract int read() throws
IOException;
Writer类停供的write()方法,接收的都是char型:
public void write(String str) throws IOException
同样如果要操作文件使用FileWriter子类
字符输出流:Reader
Reader依然是一个抽象类。如果要进行文件读取,同样的,使用FileReader。
标准输出格式:
int len = 0 ;
byte[] data = new byte[1024];
while(len = inputStream.read(data))!=-1){
outputStream.write(data,0,len);
}
三、字符编码
常用的几种字符编码
1、GBK、gb2312:描述中文编码,GBK包含繁体中文
2、UNICODE:16进制编码。java默认编码,支持所有语言
缺点:占用空间过大
3、UTF-8:支持所有语言,通用编码
4、ISO-8859-1:国际通用编码,不支持中文
浏览器页面默认此编码
乱码的本质:编码与解码字符编码不一致
四、内存操作流
内存操作流分为两类:
1、字节内存流:ByteArrayInputStream、ByteArrayOutputStream
2、字节内存流:CharArrayReader、CharArrayWrite
构造方法
ByteArrayInputStream、ByteArrayOutputStream
public ByteArrayInputStream(byte buf[])
public ByteArrayOutputStream()
内存流的继承图:
![这里写图片描述](https://img-blog.csdn.net/20180529160434914?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RldmlsX05ldA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
四、打印流
在我们实际的操作中用到的输出流一般都使用打印流。打印流的提出的目的在于解决OutputStream的设计缺陷,属于OutputStream的加强版。如果操作的不是二进制数据,只是想通过程序向终端输出信息的话,OutputStream不是很方便。
其缺陷:
1、所有的数据必须转换为字节数组
2、如果要输出的是int、double等类型就不方便了
构造方法:
PrintStream类:
public PrintStream(OutputStream out)
PrintWrite类:
public PrintWrite(OutputStream out)
public PrintWrite(Write out)
打印流的设计属于装饰设计模式。
格式化输出
publi PrintStream printf(Stringformat,Object…args)
格式化字符串
publi stati String format(String format,Object … args)
五、两种输入流
BufferedReader类;
BufferedReader类属于一个缓冲的输入流,而且是一个字符流的操作对象。在java中对于缓冲流也分为两类:字节缓冲流(BufferedInputStream)、字符缓冲流(BufferedReader)。
读取一行数据:
String readLine() throws IOException
BufferedReader类的定义与构造方法:
public class BufferedReader extends Reader
public BufferedReader(Reader in)
缺点:默认的换行模式是BufferedReader的最大缺点
被新生Scanner替换
Scanner类:
主要使用的构造方法:
- 判断是否有指定类型数据: public boolean hasNextXxx()
- 取得指定类型的数据: public 数据类型 nextXxx()
- 定义分隔符:public Scanner useDelimiter(Pattern pattern)
- 构造方法:public Scanner(InputStream source)
!!! Scanner可以对接收的数据类型使用正则表达式判断
“`
汇总:以后除了二进制文件拷贝的处理之外,那么只要是针对程序的信息输出都是用打印流(PrintStream、PrintWriter),信息输出使用Scanner。