知识点
File流,字节流 基础,练习
- 利用File构造器,new 一个文件目录file
1)在其中创建多个文件和目录,测试自己学过的File类的方法
2)手动编写方法,实现删除file中指定文件的操作
//利用File构造器,new 一个文件目录file
File file1 = new File("E:\\itcast\\test.word");
File file2 = new File("E:\\itcast\\test.pdf");
File file3 = new File("E:\\itcast\\test.pdf");
File file4 = new File("E:\\itcast\\test\\testOne");
File file5 = new File("E:\\CSDN博客");
//1)在其中创建多个文件和目录,测试自己学过的File类的方法
file1.createNewFile();
file2.createNewFile();
file3.createNewFile();
file1.delete();
file4.mkdirs();
System.out.println(file4.isDirectory());
System.out.println(file4.isFile());
//返回文件里的文件名数组
String[] list = file5.list();
for (String s : list){
System.out.println(s);
}
System.out.println();
//返回文件里的文件对象数组
File[] files = file5.listFiles();
for (File file : files){
System.out.println(file.getName());
}
System.out.println(file2.exists());
System.out.println("--------------");
System.out.println(file4.getAbsolutePath());
System.out.println(file4.getPath());
- 判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
public class Work_two {
public static void main(String[] args) {
//通过File类的构造方法生成E:\ 目录的File对象
File file = new File("E:\\itcast");
//获取文件名的数组
String[] list = file.list();
//循环遍历每一个文件名
for (String fileName : list){
//判断该文件是目录还是文件
if (fileName.contains(".")){
//在文件名得到 . 的索引
int indexOf = fileName.lastIndexOf(".");
//截取.索引后的内容 也就是后缀名
String substring = fileName.substring(indexOf);
if (substring.equals(".jpg")){
System.out.println(fileName);
}
}
}
}
}
3. 遍历指定目录所有文件名称,包括子文件目录中的文件(注意这句话,经典递归方法,不知道思路的直接问)。
public class Work_three {
public static void main(String[] args) {
//①根据给定的路径创建一个File对象
File file = new File("E:\\itcast");
getAllFileName(file);
}
//②定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
public static void getAllFileName(File file){
//③获取给定的File目录下所有的文件或者目录的File数组
File[] listFiles = file.listFiles();
//④遍历该File数组,得到每一个File对象
for (File f : listFiles){
// ⑤判断该File对象是否是目录;是:递归调用 ; 不是:获取文件名输出在控制台
if (f.isDirectory()){
getAllFileName(f);
}else{
System.out.println("file:"+f.getName());
}
}
}
}
- 创建一个与a.txt文件同目录下的另外一个文件b.txt
public class Work_four {
public static void main(String[] args) throws IOException {
File file1 = new File("E:\\itcast\\test\\a.txt");
file1.createNewFile();
File file2 = new File("E:\\itcast\\test\\b.txt");
file2.createNewFile();
}
}
填空:下列程序将从file1.dat文件中读取全部数据,然后写到file2.dat文件中。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamInOut {
public static void main(String[] args) {
try {
File inFile = new File("____file1.dat_____");
File outFile = new File("_____file2.dat____");
FileInputStream fis = new FileInputStream(___"file1.dat"______);
FileOutputStream fos = new FileOutputStream(____"file2.dat"_____);
int c;
while ((c = fis.read()) != -1) {
fos.write(c);
}
__fis___.close();
___fos__.close();
} catch (FileNotFoundException e) {
System.out.println("FileStreamsTest:" + e);
} catch (IOException e) {
System.out.println("FileStreamTest" + e);java
}
}
}
5.操作D盘下的my.txt文件
- 判断my.txt文件是否存在
- 若存在则删除;若不存在则创建
public class Work_five {
public static void main(String[] args) throws IOException {
File file =new File("D:\\my.txt");
//1) 判断my.txt文件是否存在
if (file.exists()){
file.delete();
}else{
file.createNewFile();
}
}
}
6.File类的作用是什么?它是一种流吗?
File类的作用是实现java与文件数据交互的类,不是流;
7.使用File类删除某个文件夹(例如D盘下的temp文件夹)下的所有文件和文件夹:
1) 判断temp文件夹下的文件类型,如果是文件则直接删除
2) 如果是文件夹则获取该文件夹下的子文件和文件夹
3) 使用递归的方式删除所有temp文件夹下的文件和文件夹(可参考3题)
public class Work_seven {
public static void main(String[] args) {
File file = new File("D:\\temp");
delFile(file);
}
/**
* 递归删除该文件夹下的所有文件 和 该文件夹
* @param file
*/
public static void delFile(File file) {
File[] listFiles = file.listFiles();
for (File f : listFiles) {
if (f.isDirectory()) {
//2) 如果是文件夹则获取该文件夹下的子文件和文件夹
delFile(f);
} else {
//1) 判断temp文件夹下的文件类型,如果是文件则直接删除
f.delete();
}
}
//3) 使用递归的方式删除所有temp文件夹下的文件和文件夹(可参考3题)
file.delete();
}
}
8.分别使用节点流:FileInputStream、FileOutputStream实现文本文件/图片/视频文件的复制。并比较二者在数据复制方面的效率
public class Work_eight {
public static void main(String[] args) throws IOException {
//数据源
FileInputStream fis1 = new FileInputStream("E:\\itcast\\mn.jpg");
FileInputStream fis2 = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
FileInputStream fis3 = new FileInputStream("E:\\itcast\\窗里窗外.txt");
//目的地
FileOutputStream fos1 = new FileOutputStream("D:\\目的地\\mn.jpg");
FileOutputStream fos2 = new FileOutputStream("D:\\目的地\\字节流复制图片.avi");
FileOutputStream fos3 = new FileOutputStream("D:\\目的地\\窗里窗外.txt");
//复制数据
copyData(fis1,fos1);
copyData(fis2,fos2);
copyData(fis3,fos3);
//释放资源
close(fis1,fos1);
close(fis2,fos2);
close(fis3,fos3);
}
public static void close(FileInputStream fis,FileOutputStream fos) throws IOException {
//释放资源
fos.close();
fis.close();
}
public static void copyData(FileInputStream fis,FileOutputStream fos) throws IOException {
//复制数据
int by;
while((by = fis.read()) != -1){
fos.write(by);
}
}
}
//视频复制得非常慢
9.获取自定义文本上每个字符出现的次数
提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件
public class Work_nine {
public static void main(String[] args) throws IOException {
Map<Character,Integer> map = new HashMap<>();
String s = "aaabbbcabcdcccdd";
Set<Character> keySet = map.keySet();
//获取自定义文本上每个字符出现的次数
for (int i = 0;i < s.length();i++){
//获取key
char key = s.charAt(i);
//根据字母键找到记录个数的value值
Integer value = map.get(key);
//如果value为空则代表该字母第一次出现,将他的值设置为1
if (value == null){
map.put(key,1);
}else {
//不为空则出现过,在原来的值上加一
value++;
map.put(key,value);
}
}
//目的地
FileOutputStream fos = new FileOutputStream("E:\\Work8_0_9\\mapData.txt");
//提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件
for (Character key:keySet){
//数据源
Integer value = map.get(key);
//将value转换为String
String s1 = String.valueOf(value);
//复制数据
fos.write(key);
fos.write(s1.getBytes);
}
//释放资源
fos.close();
}
}
10.编写一个应用程序,将用户从键盘输入的10个整数存入文件,再顺序读出。
public class Work_ten {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//目的目
FileOutputStream fos = new FileOutputStream("E:\\Work8_0_10\\CopyTenIntNumber.txt");
//将用户从键盘输入的10个整数存入文件,
System.out.println("请输入10个以逗号分隔的整数:");
int[] intArr = new int[10];
String s = scanner.nextLine();
String[] split = s.split(",");
//字符串数组转整形数组
//int[] array = Arrays.asList(strings).stream().mapToInt(Integer::parseInt).toArray();
int[] array = Arrays.asList(split).stream().mapToInt(Integer::parseInt).toArray();
Arrays.sort(array);
for (int i = 0; i < intArr.length; i++) {
String i1 = String.valueOf(array[i]);
//复制数据
fos.write(i1.getBytes());
fos.write(" ".getBytes());
}
System.out.println("成功!");
//释放资源
fos.close();
//再顺序读出
FileInputStream fis = new FileInputStream("E:\\Work8_0_10\\CopyTenIntNumber.txt");
int by;
while ((by = fis.read()) != -1){
System.out.print((char) by);
}
//10,14,41,52,36,78,88,42,56,95
}
}
11.编写程序向文本文件中写入自己的信息,
- 格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
- 将该信息读出后显示的屏幕上后把文件删除。
- (思考,为什么读取中文出现乱码?应该用什么流来读取最好??可以往后面的知识看看)
public class Work_eleven {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//编写程序向文本文件中写入自己的信息,
File file = new File("E:\\Work8_0_11\\myselfData.txt");
FileOutputStream fos = new FileOutputStream("E:\\Work8_0_11\\myselfData.txt");
FileInputStream fis = new FileInputStream("E:\\Work8_0_11\\myselfData.txt");
System.out.println("请输入自己的姓名:");
String name = scanner.next();
name = "姓名:"+name;
System.out.println("请输入自己的年龄:");
String age = scanner.next();
age = "年龄:"+age;
System.out.println("请输入自己的性别:");
String sex = scanner.next();
sex = "性别:"+sex;
System.out.println("请输入自己的班级:");
String garde = scanner.next();
garde = "班级:"+garde;
//格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
fos.write(name.getBytes());
fos.write(" ".getBytes());
fos.write(age.getBytes());
fos.write(" ".getBytes());
fos.write(sex.getBytes());
fos.write(" ".getBytes());
fos.write(garde.getBytes());
fos.write(" ".getBytes());
System.out.println("成功!");
//将该信息读出后显示的屏幕上后把文件删除。
//将数据按一组一组数组读
byte[] bytes = new byte[2048];
//一个数组读取的实际字符个数
int len;
while ((len=fis.read(bytes)) != -1){
System.out.print(new String(bytes,0,len));
}
//释放资源
fos.close();
fis.close();
//必须在释放后删除!
file.delete();
}
}