目录
File
-
获取它目录下所有的文件
-
String[] list()
-
File[] listFiles()
-
import java.io.File;
public class Test {
/*
目标:能够使用API提供的方法,实现遍历某一层文件夹下的所有文件
*/
public static void main(String[] args) {
// 先关联到itheima的文件夹
File file = new File("day08-Stream-Exception-File/src/com/itheima");
// 再调用方法获取里面的所有的文件名称/文件对象
String[] fileNames = file.list();
// 遍历
for (String fileName : fileNames) {
System.out.println(fileName);
}
System.out.println("-------------------------");
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getName());
}
System.out.println("-------------------------------------");
// 关联的是一个不存在的路径
File file2 = new File("day08-Stream-Exception-File/src/com/itheima2");
System.out.println(file2);
// 空的数组对象
File[] files1 = file2.listFiles();
System.out.println(files1); // null
// 出现空指针异常
/* for (File file1 : files1) {
System.out.println(file1);
}*/
System.out.println("--------------------------");
// 关键的是一个空的文件夹
File file3 = new File("day09-file-IO/file");
File[] files2 = file3.listFiles();
System.out.println(files2); // [Ljava.io.File;@119d7047
System.out.println(files2.length); // 0
}
}
递归
-
概念
-
方法自己调用自己
-
-
格式
-
直接递归
-
方法自己调用自己
-
-
间接递归
-
方法相互调用
public class Test { /* 目标: 能够说出递归的执行流程 */ public static void main(String[] args) { // method(); a(); } // 直接递归,方法调用自己 public static void method() { System.out.println("这里是执行了method的方法~~~11"); method(); // 自己调用自己 System.out.println("这里是执行了method的方法~~~22"); } // 间接递归,方法相互调用 public static void a() { System.out.println("执行了a方法"); b(); System.out.println("执行完了a方法"); } public static void b() { System.out.println("执行了b方法"); a(); System.out.println("执行完了b方法"); } }
-
-
-
流程
-
层层递进,不断回归
-
-
使用场景
-
多层包含的时候
-
文件夹遍历
-
类目的创建
-
-
算法
-
二分查找
-
斐波那契数列
-
汉诺塔
-
-
import java.io.File;
public class Test {
/*
目标:能够使用递归的思想,实现找出某一个文件夹下所有的java
*/
public static void main(String[] args) {
searchJava(new File("D:\\java_code\\JAVASE\\Java190"));
}
/*
1.定义一个方法,接收一个文件夹对象[File]
2.先判断传递归来的对象是否为null ,或者 先判断调用这个方法是否为空 ,再去 listFile长度是否为0,如果是,则直接结束方法
3.遍历传递过来的File对象
4.遍历的时候,判断每一个file对象的类型
4.1 如果是文件,我们还需要判断这个文件是否为 java文件==> 获取文件名字,再判断是否以java结尾
如果是,则输出绝对经路径
4.2 如果是文件夹
直接递归
*/
public static void searchJava(File f) {
// 2.先判断传递归来的对象是否为null ,或者 先判断调用这个方法是否为空 ,再去 listFile长度是否为0,如果是,则直接结束方法
if (f == null || !f.exists() || !f.isDirectory() || f.listFiles().length == 0) {
return;
}
// 3.遍历传递过来的File对象
File[] files = f.listFiles();
for (File file : files) {
// 4.遍历的时候,判断每一个file对象的类型
if (file.isFile() && file.getName().endsWith(".java")) { // 如果是文件,我们还需要判断这个文件是否为 java文件==> 获取文件名字,再判断是否以java结尾
System.out.println(file.getAbsolutePath());
} else if (file.isDirectory()) {
searchJava(file);
}
}
}
}
IO流
字符的编码和解码
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class Test {
/*
了解如何实现字符的编码和解码
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "黑马Java";
// 编码
byte[] bytes = str.getBytes();// 使用系统默认的
// 1110xxxx 10xxxxxx 10xxxxxx ,
// [-23, -69, -111, -23, -87, -84, 74, 97, 118, 97]
System.out.println(Arrays.toString(bytes));
// 指定字符集 --> utf-8
byte[] bytes2 = str.getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(bytes2));
byte[] bytes3 = str.getBytes("gbk");
// [-70, -38, -62, -19, 74, 97, 118, 97]
System.out.println(Arrays.toString(bytes3));
System.out.println("---------------解码----------------------");
// 先解bytes
String s1 = new String(bytes);
System.out.println(s1); // 黑马Java
// 解gbk的字节数组
String s2 = new String(bytes3, Charset.forName("gbk"));
System.out.println(s2);
// 用gbk解utf-8
String s3 = new String(bytes2, "gbk");
System.out.println(s3); // 榛戦┈Java
}
}
-
概念
-
输入(Input)\输出(Out)流
-
-
分类
-
字节流
-
使用对象
-
所有的文件
-
-
字节输入流
-
作用
-
把文件的内容读取到java程序中
-
-
方法
-
读一个字节
-
read(int n)
-
-
读多个字节,返回读到的长度
-
int read(byte[] bytes)
-
-
读所有字节,返回读到的字节数组
-
byte[] readAllBytes()
-
-
关流
-
close()
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) throws Exception { // 1.先要创建一个输入流,关联文件 FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png"); // 2.也要创建一个输出流,把内容写出到指定的地方 FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun3.png"); // 3.定义一个数组,用于存放读取到的内容 byte[] bytes = new byte[1024 * 8]; // 8kb的容器 // 4.定义一个整数,用于记录读取到的长度 int len; // 5.使用循环去读数据 ,写数据 【一边读,一边写】 while ((len = fis.read(bytes)) != -1) { fos.write(bytes, 0, len); } // 6.关流 fos.close(); fis.close(); } private static void copyAll() throws IOException { // 1.使用字节输入流,读取原文件 FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png"); // 2.一次性读取所有的内容,用一个数组保存 byte[] bytes = fis.readAllBytes(); // 3.创建一个字节输出流,指定文件保存的位置 FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun2.png"); // 4.把读取到的数组写出去即可 fos.write(bytes); // 5.关流 --> 先开后关 fos.close(); fis.close(); } }
-
-
-
-
字节输出流
-
作用
-
把Java程序中的内容,输出到指定的文件
-
-
方法
-
写出一个字节
-
write(int n)
-
-
写出一个字节数组
-
write(byte[] bytes)
-
-
写出一个字节数组的部分内容
-
write(byte[] bytes , 起始位置, 长度)
-
-
关流
-
close()
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Arrays; public class Test { /* 目标: 能够使用字节数组去存储读取的内容。然后 对比跟读取跟个字节的方法 */ public static void main(String[] args) throws Exception { // 先用流关联到文件 FileInputStream fis = new FileInputStream("day09-file-IO/file/b.txt"); // 我们创建一个字节数组,用于存放读取的内容 //byte[] bytes = new byte[3]; // {0 ,0 ,0} // 定义足够大的数组 byte[] bytes = new byte[1024]; // {0 ,0 ,0} // 我们需要对字节数组进行编码 ==> String的构造器 /* int len = fis.read(bytes); System.out.println("len:" + len); // 3 System.out.println("bytes:" + Arrays.toString(bytes));// [74, 97, 118] String s1 = new String(bytes); // 解码 System.out.println(s1); // Jav int len2 = fis.read(bytes); System.out.println("len2:" + len2); System.out.println("bytes:" + Arrays.toString(bytes));// [97, 83, 69] String s2 = new String(bytes); // 解码 System.out.println(s2); // aSE int len3 = fis.read(bytes); System.out.println("len3:" + len3);// 2 System.out.println("bytes:" + Arrays.toString(bytes)); // [97, 97, 69] *//* String s3 = new String(bytes); // 如果使用这个方法,会把69也进行解码 System.out.println(s3); // aaE*//* String s3 = new String(bytes , 0 , len3); System.out.println(s3); // aa */ // 用于记录当前读取的内容的长度 int len; while ((len = fis.read(bytes)) != -1) { String s = new String(bytes, 0, len); System.out.print(s); } fis.close(); } }
-
-
-
-
-
字符流
-
使用对象
-
文本
-
-
-
IO流整体练习
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws Exception {
// 1.先要创建一个输入流,关联文件
FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
// 2.也要创建一个输出流,把内容写出到指定的地方
FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun3.png");
// 3.定义一个数组,用于存放读取到的内容
byte[] bytes = new byte[1024 * 8]; // 8kb的容器
// 4.定义一个整数,用于记录读取到的长度
int len;
// 5.使用循环去读数据 ,写数据 【一边读,一边写】
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
// 6.关流
fos.close();
fis.close();
}
private static void copyAll() throws IOException {
// 1.使用字节输入流,读取原文件
FileInputStream fis = new FileInputStream("day09-file-IO/file/kun.png");
// 2.一次性读取所有的内容,用一个数组保存
byte[] bytes = fis.readAllBytes();
// 3.创建一个字节输出流,指定文件保存的位置
FileOutputStream fos = new FileOutputStream("day09-file-IO/file/kun2.png");
// 4.把读取到的数组写出去即可
fos.write(bytes);
// 5.关流 --> 先开后关
fos.close();
fis.close();
}
}