文件和IO流基础入门(简述)
什么是文件
在Java的学习中,文件和IO流是一个十分重要的板块。在Java中,File是文件和目录路径名的抽象表示。文件和目录可以通过File封装成对象。对File而言,其封装的并不是一个真正存在的文件,仅仅只是一个路径名而已,他可以是存在的也可以是不存在的。将来是要通过具体操作把这个路径的内容转化为具体存在的。
什么是IO流
IO是指input和output,也就是输入/输出,流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输。IO流就是用来处理设备间数据传输问题。其常见的应用:文件复制、文件上传、文件下载。
对文件及其操作的简单叙述
文件及对文件的操作可以说是实现IO流操作的前提和基础,没有文件也就不能对其操作,本篇博客的重点是IO流,所以对文件我们就简单带过。
首先说文件的构造方法:
File(String pathname)
通过将给定的路径名字富川转换为抽象路径名来创建新的File实例
File(String parent,String child)
从父路径名字符串和子路径字符串创建新的File实例
File(File parent, String child)
从父抽象路径名和子路径名字符串创建新的File实例
其次是文件的方法:
创建文件
File file = new File("D:\\hello.txt");
file.createNewFile()
创建单级路径
File file1=new File("D:\\javaee");
file1.mkdir()
创建多级路径
File file2=new File("D:\\javaee\\helloWorld\\test");
file2.mkdirs()
文件的遍历:
在实现文件的遍历之前,要知道两个方法:
1、listFiles();列出该路径下的所有文件
2、isDirection();判断此路径是否是目录
其次要用到递归的思想,通过自己内部调用自己方式来实现查询多级目录,在这里要注意,如果使用递归创建文件夹一定要先做好出口!(此处鞭尸狗鑫)
public class traverseCatalog {
public static void main(String[] args) throws IOException {
File f1=new File("D:\\itHeima");
System.out.println(f1.mkdir());
File f2=new File("D:\\itHeima\\helloWorld.txt");
System.out.println(f2.createNewFile());
File f3=new File("D:\\itHeima\\helloWorld1.txt");
System.out.println(f3.createNewFile());
File f4=new File("D:\\itHeima\\helloWorld2.txt");
System.out.println(f4.createNewFile());
File f5=new File("D:\\itHeima\\helloWorld3.txt");
System.out.println(f5.createNewFile());
traverseCatalog(f1);
}
public static void traverseCatalog(File f1){
File[] fileArray=f1.listFiles(); //listFiles方法是列出该路径下的所有文件
if (fileArray !=null){
for (File file : fileArray) {
if (file.isDirectory()){ //判断此路径是否是目录
traverseCatalog(file);
}else System.out.println(file.getAbsoluteFile());
}
}
}
IO流概述及其操作:
分类
按照数据的流向来分
输入流:读数据,从硬盘到读取数据到内存。
输出流:写数据,从内存到写数据到硬盘。
按照数据类型来分(常用)
分为字节流和字符流,其区别是编码方式不同。字节流处理单元是一个Unicode字符,而字符流处理单元是两个Unicode字符,所以在采用不同的方式编解码的时候可能会产生不同的结果,这一点需要注意。
字节流的具体实现和构造方法
字节流有字节输入流InputStream和字节输出流OutputStream其两者又有FileIn/outputStream和BufferedIn/OutputStream,分别是字节输入输出流和字节缓冲输入输出流,对比而言字节缓冲流的效率更高,在字节流的使用中也是最多的。
字节缓冲输出流:
BufferOutStream(OutputStream out)
字节缓冲输入流:
BufferInputStream(InputStream in)
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。
例:BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(“D:\itHeima\movie.avi”));
字符流出现及其应用
当出现汉字时,字节流会出现乱码,因为汉字的存储如果是GBK编码,占用两个字节,如果是UTF-8编码,占用3个字节
汉字出现的形式,汉字无论在那种编码方式中,都是负数开头,字符流的底层是字节流加编码表
字符串中的编码解码问题
编码
byte[] getBytes():使用平台默认字符集将该String编码为一系列字节,将结果存储到信道字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一些列字节,将结果存储到新的字节数组中
例byte[] bys =s.getBytes(“UTF-8”);
解码
String(byte[] bytes):通过使用平台默认的字符集解码指定的字节数组来构造新的String
String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
例String ss=new String(bys,“GBK”);
字符流中的编码解码问题
字符流抽象基类
Reader:字符输入流的抽象类
Writer:字符输出流的抽象类
构造方法
全名
InputStreamReader isr=new InputStreamReader(new FileInputStream(“D:\itHeima\my.txt”));//字符输入流
OutputStreamWriter osw1=new OutputStreamWriter(new FileOutputStream(“D:\itHeima\my1.txt”));//字符输出流
子类
FileReader fr=new FileReader(“D:\itHeima\my.txt”);//字符输入流
FileWriter fw=new FileWriter(“D:\itHeima\my1.txt”);//字符输出流
方法
字符流写数据的5种方式
写一个字符void write (int c);//整形的数据会自动转化成整形对应的ASCII码
写入一个字符数组void write(char[] cbud);//字符流的数组是char[]
写入字符数组的一部分void write (char[] dbuf,int off,int len);
写一个字符串void write(String str);
写一个字符串的一部分void write(String str,int off ,int len);
字符流的刷新流
字符流只有接收到一个字符数据的时候才会将数据写入,当少于一个字符时会写入缓冲区等待数据完整后再写入,这个时候就需要用到字符刷新流,将不足的数据也从缓冲区输出出来
osw.flush();//如果没有手动调用flash但是调用了close方法,也会自动调用flush方法
字符缓冲流
构造方法
BufferedWriter bw=new BufferedWriter(new FileWriter(“D:\itHeima\my1.txt”));
BufferedReader br=new BufferedReader(new FileReader(“D:\itHeima\my.txt”));
读写方法
和字节缓冲流一致,但只能读写文件不能读写视频和图片
特有功能
BufferedWriter:
void newLine();//写一个行分隔符,行分隔符字符串由系统属性定义
BufferedReader:
public String readLine();//读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null