今日内容介绍
u File类
u 字符流与字节流
第1章 File类
1.1 File概述
打开API,搜索File类。阅读其描述:File文件和目录(文件夹)路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可,那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢
1.2 File类的构造函数
//只是创建了一个路径,指向了一个对象(系统不会报错),为后面的常用功能提供对象
File(String pathname) :将一个字符串路径封装成File对象(将指定的路径名(字符串对象)转换成一个File文件)
File(String parent,String child):传入一个父级路径和子级路径
File(File parent,String child):传入一个File类型的父级路径和子级路径
1.2.1 案例代码一:
package com.itheima_01;
import java.io.File;
/*
* File:文件和目录(文件夹)路径名的抽象表示形式,File 类的实例一旦创建,是不可变的。
* 表示的是文件和文件夹,既可以表示存在的文件,也可以表示不存在的文件(不存在不会创建)
* 构造方法:
* File(File parent, String child)//只是创建了一个路径,指向了一个文件
* File(String pathname)
* File(String parent, String child)
*
*
*/
public class FileDemo {
public static void main(String[] args) {
//创建了一个路径,指向了一个对象
* //File(String pathname) :只是将指定的路径名(字符串)转换成一个File对象(有没有文件不会报错)(用的较多)
//File f = new File("D:\a\b.txt");
//File(String parent, String child) : 根据指定的父路径和文件路径创建File对象
//File f2 = new File("D:\a","b.txt");
* //或者//File f2 = new File("D:","a\b.txt");
//File(File parent, String child) :根据指定的父路径对象和文件路径创建File对象(用的较多)
//File parent = new File("D:\a");
//File f3 = new File(parent,"b.txt");
//等价于上面的
File f4 = new File(new File("D:\a"),"b.txt");
}
}
1.3 File类创建和删除功能
boolean createNewFile():指定路径不存在该文件时时创建文件,返回true,否则返回false
boolean mkdir():当指定的单级文件夹不存在时创建文件夹并返回true,否则返回false
boolean mkdirs():当指定的多级文件夹某一级文件夹不存在时,创建多级文件夹并返回true,否则返回false
boolean delete():删除文件或者删除单级文件夹
1.3.1 案例代码二:
package com.itheima_01;
import java.io.File;
import java.io.IOException;
/*
* 创建功能
* boolean createNewFile(): 当指定文件不存在时创建文件并返回true,否则当指定文件存在时创建文件并返回false
* boolean mkdir(): 当指定文件夹不存在时创建文件夹并返回true,否则当指定文件夹存在时创建文件夹或者文件夹所在目录不存在时返回false
* boolean mkdirs(): 创建指定文件夹,当文件夹所在的目录不存在,则顺道一块创建了,!!要注意 mkdir() 和mkdirs() 的区别
*
删除功能
* boolean delete(): 当指定的文件或文件夹存在时删除文件或者文件夹 并返回true,否则返回false
*
* 绝对路径:固定不可改变的路径,以盘符开头
* 相对路径:相对某个参照物,不能以盘符开头
* 在eclipse中相对路径相对于当前项目的根目录
*
*
* 注意:删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹,删除文件或者文件夹不走回收站
*/
public class FileDemo2 {
public static void main(String[] args) throws IOException {
File f = new File("d:\a\b.txt");//以盘符开头,所以是绝对路径
File f2 = new File("a.txt");//不以盘符开头,所以是相对路径
//boolean createNewFile() : 当指定文件不存在时创建文件并返回true,否则当指定文件存在时返回false
System.out.println(f2.createNewFile());//编译时异常,需要抛出处理
//boolean mkdir() : 当指定文件夹不存在时创建文件夹并返回true,否则当指定文件夹存在时返回false(makedirector)
File f3 = new File("b");
System.out.println(f3.mkdir());
//boolean mkdirs() : 创建指定文件夹,当文件夹所在的目录(文件夹)不存在,则顺道一块创建了,可创建单级也可以创建多级!!要注意 mkdir() 和mkdirs() 的区别
File f4 = new File("c\d\e");
System.out.println(f4.mkdir());//false
System.out.println(f4.mkdirs());//true
File f5 = new File("c.txt");//到底创建的是文件还是文件夹,不是根据new File里面的对象决定的,而是根据你调用的的方法决定的。
System.out.println(f5.mkdir());
//boolean delete() :当指定的文件或文件夹存在时删除文件或者文件夹并返回true,否则当指定文件或者文件夹不存在时返回false
System.out.println(f2.delete());
System.out.println(f3.delete());
File f6 = new File("c");
System.out.println(f6.delete());//注意:删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹,删除文件或者文件夹不走回收站
}
}
1.4 File类的判断功能
boolean exists():判断指定路径的文件或文件夹是否存在
boolean isAbsolute():判断当前路路径是否是绝对路径
boolean isDirectory():判断当前的目录文件夹是否存在
boolean isFile():判断当前路径是否是一个文件
boolean isHidden():判断当前路径是否是隐藏文件
1.4.1 案例代码三:
package com.itheima_01;
import java.io.File;
import java.io.IOException;
/*
* 判断功能
* boolean exists():判断文件或者文件夹是否存在,如果存在则返回true,否则返回false (用的较多)
* boolean isAbsolute():判断File对象指向的路径是否是绝对路径,如果是绝对路径则返回true,否则返回false
* boolean isDirectory():判断File对象指向的路径是否是文件夹,如果是则返回true,否则返回false (用的较多)
boolean isFile(): 判断File对象指向的路径是否是文件,如果是则返回true,否则返回false (用的较多)
boolean isHidden() :判断File对象指向的路径是否有隐藏属性,如果隐藏了则返回true,否则返回false
*/
public class FileDemo3 {
public static void main(String[] args) throws IOException {
//method();
//method2();
//method3();
method4();
}
private static void method4() {
File f = new File("d:\a\b.txt");
//boolean isHidden() :判断File对象指向的路径是否有隐藏属性,如果隐藏了则返回true,否则返回false
System.out.println(f.isHidden());
}
private static void method3() {
File f = new File("a.txt");
File f2 = new File("b");
* //两者组合使用
//boolean isDirectory() :判断File对象指向的路径是否是文件夹,如果是则返回true,否则返回false
//boolean isFile() : 判断File对象指向的路径是否是文件,如果是则返回true,否则返回false
//System.out.println(f.isDirectory());
//System.out.println(f2.isDirectory());
System.out.println(f.isFile());
System.out.println(f2.isFile());
}
private static void method2() {
//File f = new File("a.txt");
File f2 = new File("d:\a.txt");
//boolean isAbsolute() :判断File对象指向的路径是否是绝对路径,如果是绝对路径则返回true,否则返回false
System.out.println(f2.isAbsolute());
}
private static void method() {
File f = new File("a.txt");
//f.createNewFile();
//boolean exists() : 判断文件或者文件夹是否存在,如果存在则返回true,否则返回false
System.out.println(f.exists());
}
}
1.5 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所指向的路径
1.5.1 案例代码四:
package com.itheima_01;
import java.io.File;
import java.io.IOException;
/*
* 获取功能
File getAbsoluteFile() :以File对象的形式返回当前File对象所有指向的绝对路径
* String getAbsolutePath() : 以String的形式返回File对象所指向的绝对路径
* String getParent() //以字符串的形式返回父路径
* File getParentFile() //以文件的形式返回父路径
* String getName() : 获取文件和文件夹的名称
* String getPath() : 返回创建File对象时给的路径
long lastModified() : 以毫秒值的形式返回最后修改时间
long length() : 返回文件的字节数,文件夹的字节数无法获取
修改功能:
boolean renameTo(File dest): 将当前File对象所指向的路径修改为指定File所指向的路径
* //注意:修改的文件路径不能存在,如果存在则修改失败
*/
public class FileDemo4 {
public static void main(String[] args) throws IOException {
//method();
//method2();
//method3();
File f = new File("d.txt");
File f2 = new File("e.txt");
//boolean renameTo(File dest) : 将当前File对象所指向的路径修改为指定File所指向的路径
//注意:修改的文件路径不能存在,如果存在则修改失败
System.out.println(f.renameTo(f2));
}
private static void method3() {
File f = new File("a.txt");
File f2 = new File("d:\a\b.txt");
File f3 = new File("b");
//String getName() : 获取文件和文件夹的名称
//System.out.println(f.getName());
//System.out.println(f2.getName());
//System.out.println(f3.getName());
//String getPath() : 返回创建File对象时给的路径
//System.out.println(f.getPath());
//System.out.println(f2.getPath());
//System.out.println(f3.getPath());
//long lastModified() : 以毫秒值的形式返回最后修改时间
//System.out.println(f.lastModified());
//2514023311294
//Date d = new Date(2514023311294L);
//System.out.println(d.toLocaleString());
//long length() : 返回文件的字节数,文件夹的字节数无法获取
System.out.println(f.length());
System.out.println(f3.length());
}
private static void method2() throws IOException {
//File f = new File("a.txt");
//File f2 = new File("b","c.txt");
//System.out.println(f2.createNewFile());//会报错,找不到指定的路径
File parent = new File("b");
File f3 = new File(parent,"c.txt");
if(!parent.exists()) {//判断文件夹是否存在
parent.mkdirs();//如果不存在,就创建改文件(用多级创建)
}
System.out.println(f3.createNewFile());//创建是否是成功
//String getParent()
System.out.println(f3.getParent());//以字符串的形式返回父路径
//File getParentFile()
System.out.println(f3.getParentFile());//以文件的形式返回父路径
}
private static void method() {
File f = new File("d:\a\b.txt");
File f2 = new File("a.txt");
//File getAbsoluteFile() :以File对象的形式返回当前File对象所有指向的绝对路径
System.out.println(f2.getAbsoluteFile());
//String getAbsolutePath() : 返回File对象所指向的绝对路径
System.out.println(f2.getAbsolutePath());
}
}
1.6 File类的其它获取功能
String[] list():以字符串数组的形式返回当前路径下所有的文件和文件夹的名称
File[] listFiles():以File对象的形式返回当前路径下所有的文件和文件夹的名称
static File[] listRoots():获取计算机中所有的盘符
1.6.1 案例代码五:
package com.itheima_01;
import java.io.File;
/*
* String[] list() : 返回当前路径下所有的文件和文件夹名称
//注意:只有指向文件夹的File对象才可以调用该方法
File[] listFiles() :返回当前路径下所有的文件和文件夹名称的绝对路径
//注意:只有指向文件夹的File对象才可以调用该方法
static File[] listRoots() : 返回的是所有盘符
*/
public class FileDemo5 {
public static void main(String[] args) {
//method();
//method2();
//static File[] listRoots() : 返回的是所有盘符
File[] files = File.listRoots();
for (File file : files) {
System.out.println(file);
}
}
private static void method2() {
File f = new File("b");
File f2 = new File("D:\workspace\myFile");
File f3 = new File("c.txt");
//File[] listFiles():返回当前路径下所有的文件和文件夹名称的绝对路径
* //注意:只有指向文件夹的File对象才可以调用该方法
File[] files = f3.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
}
private static void method() {
File f = new File("b");
File f2 = new File("D:\workspace\myFile");
File f3 = new File("c.txt");
//String[] list() : 返回当前路径下所有的文件和文件夹名称
//注意:只有指向文件夹的File对象才可以调用该方法
String[] files = f3.list();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
}
}
1.7 File类两个案例
1.7.1 案例代码六
输出指定目录下所有的java文件名(包含子目录)
package com.itheima_02;
import java.io.File;
/*
* 需求:输出指定目录下所有的java文件名(包含子目录)
*/
public class RecurrenceTest {
public static void main(String[] args) {
File f = new File("src");
//File f = new File("src\com\itheima_01\RecurrenceDemo.java");
method(f);
}
//输出指定目录下的所有java文件名(包含子目录)
public static void method(File file) {
if(file.isDirectory()) {//判断是否是文件夹
File[] files = file.listFiles();//将文件夹转为File数组
for (File f : files) {//遍历
//判断是否是文件对象
if(f.isFile()) {
if(f.getName().endsWith(".java")) {//获取文件后缀
System.out.println(f.getName());
}
}
else if(f.isDirectory()){//递归思想
//是一个目录对象
method(f);
}
}
}
}
//输出指定目录下的所有java文件名(不包含子目录)
public static void method2(File file) {
if(file.isDirectory()) {//判断是否是文件夹
File[] files = file.listFiles();//将文件夹转为File数组
for (File f : files) {//遍历
//判断是否是文件对象
if(f.isFile()) {
if(f.getName().endsWith(".java")) {//获取文件后缀
System.out.println(f.getName());
}
}
}
}
}
}
1.7.2 案例代码七
删除指定的目录(包含子目录)
package com.itheima_02;
import java.io.File;
/*
* 需求:删除指定的目录(包含子目录)
*
* 注意:如果要删除一个目录,则需要先删除这个目录下的所有子文件和子目录
*
*/
public class RecurrenceTest2 {
public static void main(String[] args) {
File f = new File("d:\a");
method(f);
}
//删除指定目录下所有文件和目录
public static void method(File file) {
if(file.isDirectory()) {
//干掉自己所有的子文件和子目录
//获取所有的子文件和子目录
File[] files = file.listFiles();
for (File f : files) {
if(f.isFile()) {
//直接干掉他
System.out.println(f.getName());//删除之前输出它的名字
f.delete();
}
else if(f.isDirectory()) {
//继续查看是否还有文件和子目录
method(f);
}
}
//干掉自己
System.out.println(file.getName());
file.delete();
}
}
}
第2章 字符流与字节流
2.1 概述
IO流分类:
按流向分类
输入流 读取数据 FileReader 父类是Reader
从文件中(硬盘中)读出数据到内存中
输出流 写出数据 FileWriter 父类是Writer
把内存里的数据写文件中(到硬盘)中
按操作的数据类型分类
字符流能做的事,字节流都能做,但是字节流能做的事,字符流就不一定能做,比如:复制图片
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
2.2 利用字符流复制文本文件
利用字符流将当前工程下的IODemo.java拷贝到d盘的a文件夹下
2.2.1 案例代码八:
package com.itheima_02;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 使用字符流复制文本文件
*
* 数据源 IODemo.java
* 目的地 d:\IODemo.java
*
*/
public class FileCopyDemo {
public static void main(String[] args) throws IOException {
//创建字符输入流对象
FileReader fr = new FileReader("IODemo.java");
//创建字符输出流对象
FileWriter fw = new FileWriter("d:\IODemo.java");
//一次读写一个字符
/*int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
fw.flush();
}*/
//一次读写一个字符数组
int len;//用于存储读到的字符个数
char[] chs = new char[1024];
while((len = fr.read(chs)) != -1) {
fw.write(chs,0,len);
fw.flush();
}
//释放资源
fw.close();
fr.close();
}
}
2.3 利用字节流复制文本文件
利用字节流将当前工程下的IODemo.java拷贝到d盘下
2.3.1 案例代码九:
package com.itheima_03;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 使用字节流复制文本文件
*
* 数据源 IODemo.java
* 目的地 d:\a\IODemo.java
*
*/
public class FileCopyDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("IODemo.java");
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream("d:\a\IODemo.java");
//一次读写一个字节
/*int by;
while((by = fis.read()) != -1) {
fos.write(by);
}*/
//一次读写一个字节数组
int len;//存储读到的字节个数
byte[] bys = new byte[1024];
while((len = fis.read(bys)) != -1) {
fos.write(bys,0,len);
}
//释放资源
fos.close();
fis.close();
}
}
2.4 复制图片
字节流可以操作所有类型的文件,因为所有的文件在计算机中都是以字节形式存储
而字符流只能用来操作纯文本类型的文件,不能操作字节类型的文件
2.4.1 案例代码十:
package com.itheima_04;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 分别使用字符流和字节流复制图片
*
* 二进制文件(图片、视屏、音频)只能使用字节流进行复制(使用windows自带记事本打开读不懂的(读不出文件的))
* 文本文件的复制即可使用字符流,也可以使用字节流
*
*/
public class CopyImage {
public static void main(String[] args) throws IOException {
//method();
//创建字节输入流对象
FileInputStream fis = new FileInputStream("传智学院.jpg");
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream("d:\传智学院.jpg");
//一次读写一个字节数组
int len;//用于存储读到的字节个数
byte[] bys = new byte[1024];
while((len = fis.read(bys)) != -1) {
fos.write(bys,0,len);
}
//释放资源
fos.close();
fis.close();
}
& //输出不了图片
private static void method() throws FileNotFoundException, IOException {
//创建字符输入流对象
FileReader fr = new FileReader("传智学院.jpg");
//创建字符输出流对象
FileWriter fw = new FileWriter("d:\传智学院.jpg");
//一次读写一个字符数组
int len;//用于存储读到的字符个数
char[] chs = new char[1024];
while((len = fr.read(chs)) != -1) {
fw.write(chs,0,len);
fw.flush();
}
//释放资源
fw.close();
fr.close();
}
}