第二十章 文件和IO一
1.作业回顾
1,编写程序,在main方法中接受5个整数,创建TreeSet类型的集合,将5个整数添加到集合中,使用foreach遍历该集合。提供一个比较器,然后对于集合中的整数进行从大到小的顺序进行排序。然后使用Iterator进行迭代。
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Day19HomeWork {
public static void main(String[] args) {
TreeSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.intValue() - o1.intValue();
}
});
Scanner s = new Scanner(System.in);
for (int i = 1; i <= 5; i++) {
System.out.println("请输入第" + i + "个整数:");
set.add(s.nextInt());
}
for (Integer i : set) {
System.out.println(i);
}
s.close();
}
}
2.File类基本的方法
java.io.File类的对象代表一个文件或者目录,File类提供了对文件或目录的所有操作。
import java.io.File;
import java.io.IOException;
public class Day2002 {
public static void main(String[] args) throws IOException {
//file对象代表一个文件,并不是真正的在磁盘上创建文件
// File file = new File("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test.txt");
File file = new File("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test.txt");
//检查一个文件或目录是否存在
System.out.println(file.exists());
//如果文件不存在就创建并返回true,否则不创建并返回false,是真正的创建文件
System.out.println(file.createNewFile());
//获取文件或目录的名称
System.out.println(file.getName());//test.txt
//获取文件或目录的路径
System.out.println(file.getAbsolutePath());//C:\Users\Czh\Desktop\Czh\Java语言基础\20第二十章 文件和IO一\test.txt
//返回代表其父目录的文件对象
System.out.println(file.getParentFile());
//返回代表其父目录的文件对象
File parent = file.getParentFile();
System.out.println(parent.getName());//获取父目录的文件名称
//获取文件的大小,以字节为单位
System.out.println(file.length());//0
//判断此对象是否代表一个文件
System.out.println(file.isFile());//true
//判断此对象是否代表一个目录
System.out.println(file.isDirectory());//false
//是否是隐藏文件
System.out.println(file.isHidden());//false
//是否可读
System.out.println(file.canRead());//true
//是否可写
System.out.println(file.canWrite());//true
//重命名文件
// System.out.println(file.renameTo(new File("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test1.txt")));
//删除文件
System.out.println(file.delete());
}
}
import java.io.File;
public class Day2003 {
public static void main(String[] args) {
File file = new File("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test1");
if (!file.exists()) {
//在磁盘上创建目录
file.mkdir();
}
//获取目录中的所有文件
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}
}
3.文件过滤
3.1根据文件类型过滤
import java.io.File;
import java.io.FilenameFilter;
public class Day2004 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test1");
if (!file.exists()) {
//在磁盘上创建目录
file.mkdir();
}
//获取目录中所有文件(包括目录和文件)
File[] files = file.listFiles(new FilenameFilter(){
//返回true代表接受文件,返回false代表不接受文件
@Override
public boolean accept(File dir, String name) {
//dir是文件所在目录
//只接受txt文件
return name.endsWith(".txt");
}
});
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}
}
3.2根据文件大小过滤
import java.io.File;
import java.io.FileFilter;
public class Day2005 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test1");
if (!file.exists()) {
//在磁盘上创建目录
file.mkdir();
}
//获取目录中所有文件(包括目录和文件)
File[] files = file.listFiles(new FileFilter(){
//返回true代表接受文件,返回false代表不接受文件
@Override
public boolean accept(File f) {
//只接受5个字节以上的文件
return f.length() >= 5;
}
});
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}
}
4.IO流结构体系
一个I / O流表示输入源或输出目的地。
流可以表示许多不同类型的源和目标,包括磁盘文件,设备,其他程序和内存阵列。
流支持许多不同类型的数据,包括简单字节,原始数据类型,本地化字符和对象。
有些流只传递数据; 有些流还可以操纵和转换数据。
5.流实现文件的读写
FileWriter 提供了关于写文件的基本操作。
5.1流实现文件的写
import java.io.FileWriter;
import java.io.IOException;
public class Day2006 {
public static void main(String[] args) {
FileWriter fw = null;
try {
//创建一个输出流,如果文件不存在,将会创建一个文件
fw = new FileWriter("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test/text.txt");
//向流中写
fw.write("中国你好");
//刷新流
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5.2流实现文件的读
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
public class Day2007 {
public static void main(String[] args) {
FileReader fr = null;
try {
//创建一个输入流
fr = new FileReader("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test/text.txt");
//从流中读
// System.out.println(fr.read());//读取一个字符
char[] chars = new char[256];
//将文件中的内容读到字符数组中,尝试取读chars.length个
//返回实际读到的字符数
int bs = fr.read(chars);
char[] arr = Arrays.copyOf(chars, bs);//得到新数组
String str = new String(arr);
System.out.println(str);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6.流实现文件的拷贝
6.1 单字符拷贝
每次读写一个字符
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Day2008 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
//输入流,连接源文件和程序
fr = new FileReader("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test/text.txt");
//输出流,连接程序和目标文件
fw = new FileWriter("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test1/text.txt");
int c = 0;//保存每次读到的字符
//read方法每次从输入流取读一个字符
//如果read方法读到文件的末尾,那么它就返回-1
while(-1 !=(c = fr.read())) {
fw.write(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭输入流
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
//刷新流
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
//关闭输出流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6.2 字符数组拷贝
每次读写一个字符数组
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Day2009 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
//输入流,连接源文件和程序
fr = new FileReader("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test/text.txt");
//输出流,连接程序和目标文件
fw = new FileWriter("C:/Users/Czh/Desktop/Czh/Java语言基础/20第二十章 文件和IO一/test1/text.txt");
char[] chars = new char[4];//保存取读到的字符
int len = 0;//保存实际取读的字符数
//read方法尝试取读chars.length个字符,返回实际读到的字符数
//如果读到文件的末尾,则返回-1
while(-1 != (len = fr.read(chars))) {
//将字符数组中的字符写入到输出流
//第二个参数表示从字符数组的哪个索引处开始取字符
//第三个参数表示写多少个字符
fw.write(chars, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭输入流
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
//刷新流
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
//关闭输出流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7.字节流与字符流
7.1字节流和字符流拷贝
字节流每次读写一个字节,字符流每次读写一个字符。
字节流可以读写任何文件,字符流只能读写文本文件。
字节流继承于InputStream和OutputStream,字符流继承于Reader和Writer。凡是带Stream的都是字节流,否则就是字符流。
如果要读写二进制文件,就使用字节流。 如果要读写文本文件,并且需要在程序中查看其内容,就使用字符流。
7.2 使用字节流
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Day2010 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test\\1.jpg");
fos = new FileOutputStream("C:\\Users\\Czh\\Desktop\\Czh\\Java语言基础\\20第二十章 文件和IO一\\test1\\1.jpg");
byte[] bs = new byte[256];//保存每次读到的字节
int len = 0;//保存实际读到的字节数
while(-1 != (len = fis.read(bs))) {
fos.write(bs, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
8.练习
1,编写程序,在E盘创建一个目录test,再创建一个子目录abc,在abc中创建一个文件test.txt,使用输出流将往test.txt中写一个字符串,然后再使用输入流,将test.txt中的文本读到程序中。
2,编写程序,在控制台输入源文件路径和目标文件路径,实现任意文件的复制。