本帖最后由 小石姐姐 于 2018-4-27 11:34 编辑
黑马七期day09笔记
File类
构造方法:
File(String pathname) :将一个字符串路径封装成File对象
File(String parent,String child):传入一个父级路径和子级路径
File(File parent,String child):传入一个File类型的父级路径和子级路径
创建功能
boolean createNewFile():指定路径不存在该文件时创建文件,返回true,否则返回false
boolean mkdir():当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false
boolean mkdirs():当指定的多级文件夹某一级文件夹不存在时,创建多级文件夹并返回true,否则返回false
删除功能
(注意:删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹)
boolean delete():删除文件或者删除单级文件夹\
相对路径:相对某个参照物,不能以盘符开头
在eclipse中相对路径对应当前项目的根目录
绝对路径:固定不可改变的路径,以盘符开头
例如:
File f=new File("D:\\a\\b.txt") //绝对路径
File f2=new File("a.txt") //相对路径
File类的判断功能
boolean exists():判断指定路径的文件或文件夹是否存在
boolean isAbsolute():判断当前路路径是否是绝对路径
boolean isDirectory():判断当前的目录是否存在
boolean isFile():判断当前路径是否是一个文件
boolean isHidden():判断当前路径是否是隐藏文件
File类的获取功能和修改名字功能
File getAbsoluteFile():获取文件的绝对路径,返回File对象
String getAbsolutePath():获取文件的绝对路径,返回路径的字符串
String getParent():获取当前路径的父级路径,以字符串形式返回该父级路径
File getParentFile():获取当前路径的父级路径,以字File对象形式返回该父级路径
String getName():获取文件或文件夹的名称
String getPath():获取File对象中封装的路径
long lastModified():以毫秒值返回最后修改时间
long length():返回文件的字节数
boolean renameTo(File dest): 将当前File对象所指向的路径 修改为 指定File所指向的路径
File类的其他获取功能
String[] list():以字符串数组的形式返回当前路径下所有的文件和文件夹的名称
File[] listFiles():以对象的形式返回当前路径下所有的文件和文件夹的名称
static File[] listRoots():获取计算机中所有的盘符
两个练习(递归思想)
将目录下的所有.java文件删除()
将整个目录删除(有子目录的需要先删除子目录和文件)
字符流与字节流
概述
IO流分类:流向
输入流 读取数据 FileReader Reader
输出流 写出数据 FileWriter Writer
数据类型
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
利用字符流复制文件时有时会出现数据丢失(图片)
而利用字节流复制文件却不会出现这种情况
原因为:计算机本身的所有数据都是通过字节(即数字)存储与实现的
字节流不会通过编码表来传输数据而是直接通过字节(即数字)来传输
而字符流数据传输之间会通过 "编码表" 来先将字符与数字进行转换,所以有时会读取不到数据,会出现数据丢失
java.io.InputStream # 字节输入流的顶层
|_ FileInputStream # 从文件获取的字节输入流
|_ BufferedInputStream # 带有缓冲区的高效字节输入流
java.io.OutputStream # 字节输出流的顶层
|_ FileOutputStream # 从文件获取的字节输出流
|_ BufferedOutputStream # 带有缓冲区的高效字节输出流
案例: 使用字节流复制图片
继续使用项目s2-day09, 建包com.itheima.practice_09
建类Test
创建FileInputStream对象, 指向源文件路径
创建FileOutputStream对象, 指向要复制到的路径
使用一次读写一个字节数组的方式复制图片
使用try catch 捕获异常, 在finally中释放资源
public class Test {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis = new FileInputStream("传智学院.jpg");
// 创建字节输出流对象
FileOutputStream fos = new FileOutputStream("复制传智学院.jpg");
// 复制: 一次一个byte
/*int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}*/
// 复制: 一次一个byte数组
int len;
byte[] bys = new byte[1024];
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 释放资源
fis.close();
fos.close();
}
}
FileInputStream类
int read(): 读取一个字节, 读完返回-1
注意返回值是int类型, 而不是byte
int read(byte[] b): 读取字节到数组中, 返回读取的长度. 读完返回-1
close(): 释放资源
FileOutputStream类
void write(byte b): 写一个字节
void write(byte[] b, int offset, int len): 从字节数组的指定索引开始写入指定长度个字节
close(): 释放资源
要点
目录可以封装为File对象
一看到包含内容, 就要想到:
File[] listFiles()
对于目录可以递归操作
对于文件则使用流读写复制
用什么流?
系统中各种文件都有, 所以用字节流
复制流程:
先创建目录, 才能在目录中创建文件
创建了文件, 才能向文件中写入数据
创建目录或文件前, 可以先判断是否已经存在boolean exists()
BufferedInputStream, BufferedOutputStream和以前学的BufferedReader, BufferedWriter使用方式基本一样, 只不过没有读写一行字符串的方法, 因为这不是操作字符的, 而是操作字节的
总结字节流
InputStream
操作文件的子类: FileInputStream类
int read(): 读取一个字节, 读完返回-1
注意返回值是int类型, 而不是byte
int read(byte[] b): 读取字节到数组中, 返回读取的长度. 读完返回-1
close(): 释放资源
OutputStream
操作文件的子类: FileOutputStream类
void write(byte b): 写一个字节
void write(byte[] b, int offset, int len): 从字节数组的指定索引开始写入指定长度个字节
close(): 释放资源
注意: 他们读写的是: byte, byte[]
|
|