递归
方法自己调用自己
递归累加求和:计算1~n的和
开头和末尾也就是最大值和最小值他是固定不变的.真正变化的也就递归内容,就是中间部分,也就是我们写代码的部分**.最大值我们固定,让程序递归到最小值返回结束**
中间部分无外乎两种情况:1递增(n+1)+(n+2)+(n+3)… 规律就是n每一次都多减1 =>return sum(n+1)
2递减(n-1)+(n-2)+(n-3)… 规律就是n每一次都多减1 => return sum(n-1)
public class t1 {
public static void main(String[] args) {
System.out.println(show01(10));
}
private static int show01(int i){
if (i==1){
return 1;
}
return i+show01(i-1);//开头就是i,结尾递归到1.满足了开头末尾.
}
}
递归求阶乘
public class t1 {
public static void main(String[] args) {
System.out.println(show01(3));
}
private static int show01(int i) {
if (i==1){
return 1;
}
return i*show01(i-1);
}
}
递归打印多级目录
import java.io.File;
public class t1 {
public static void main(String[] args) {
File file = new File("D:\\");
getAllFile(file);
}
private static void getAllFile(File dir) {
System.out.println(dir);//打印被遍历的目录名称
File[] files = dir.listFiles();
for (File f : files) {
if (f.isDirectory()){
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
通过上述案例实现文件搜索功能
import java.io.File;
public class t1 {
public static void main(String[] args) {
File file = new File("D:\\");
getAllFile(file);
}
private static void getAllFile(File dir) {
File[] files = dir.listFiles();
for (File f : files) {
if (f.isDirectory()){
getAllFile(f);//递归
}else{
if (f.getName().toLowerCase().endsWith(".java")){//链式编程
System.out.println(f);
}
}
}
}
}
FileFilter过滤器的原理和使用
当return false时数据就是空,return true时就是输出.等同于一个开关
创建FileFilter实现类FileFilterImple
import java.io.File;
import java.io.FileFilter;
public class FileFilterImple implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
}
主程序
import java.io.File;
public class t1 {
public static void main(String[] args) {
File file = new File("D:\\");
getAllFile(file);
}
private static void getAllFile(File dir) {
File[] files = dir.listFiles(new FileFilterImple());//传递过滤器对象
for (File file : files) {
if (file.isDirectory()){
getAllFile(file);
}
else {
System.out.println(file);
}
}
}
}
匿名内部类实现过滤接口FileFilter
import java.io.File;
import java.io.FileFilter;
public class t1 {
public static void main(String[] args) {
File file = new File("D:\\");
getAllFile(file);
}
private static void getAllFile(File dir) {
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".java");
}
});//传递过滤器对象
for (File file : files) {
if (file.isDirectory()){
getAllFile(file);
}
else {
System.out.println(file);
}
}
}
}
因为FileFilter接口中只有一个accept方法所以可以使用Lambda表达式
import java.io.File;
import java.io.FileFilter;
public class t1 {
public static void main(String[] args) {
File file = new File("D:\\");
getAllFile(file);
}
private static void getAllFile(File dir) {
File[] files = dir.listFiles((File d)->
d.getName().toLowerCase().endsWith(".java"));//传递过滤器对象
for (File file : files) {
if (file.isDirectory()){
getAllFile(file);
}
else {
System.out.println(file);
}
}
}
}
字符输出流OutputStream
使用场景:
实现把内存中的数据写入到硬盘文件中
代码实现数据由内存中写入到硬盘中
import java.io.*;
public class t1 {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
fileOutputStream.write(49);
fileOutputStream.write(48);
fileOutputStream.write(48);
//一次写多个字节
byte[] bytes = {65,66,67,68,69};
fileOutputStream.write(bytes);//ABCDE
//释放资源
fileOutputStream.close();
}
}
import java.io.*;
public class t1 {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
fileOutputStream.write(49);
fileOutputStream.write(48);
fileOutputStream.write(48);
byte[] bytes = {65,66,67,68,69};
fileOutputStream.write(bytes,1,2);//BC
//释放资源
fileOutputStream.close();
}
}
在这里插入图片描述
utf8是三个字节是一个中文
gbk是两个字节是一个中文
import java.io.*;
import java.util.Arrays;
public class t1 {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
fileOutputStream.write(49);
fileOutputStream.write(48);
fileOutputStream.write(48);
byte[] bytes2 = "你好".getBytes();
System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67]
fileOutputStream.write(bytes2);
//释放资源
fileOutputStream.close();
}
}
续写和换行
import java.io.*;
public class t1 {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt");
for (int i = 0; i < 10; i++) {
fileOutputStream.write("你好".getBytes());
fileOutputStream.write("\r\n".getBytes());
}
fileOutputStream.close();
}
}
字节输入流FileInputStream
使用场景:
可以实现把硬盘文件中的数据,读取到内存中使用
代码实现字节输入流read()一次读取一个字节
import java.io.FileInputStream;
import java.io.IOException;
public class t1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
int read = fileInputStream.read();//每读一次指针向后移动一位
System.out.println(read);
fileInputStream.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
public class t1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
int len = 0;
while ((len = fileInputStream.read())!=-1){
System.out.println(len);
}
}
}
代码实现字节输入流read(byte[] b),一次读取多个字节
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class t1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
byte[] bytes = new byte[2];
int read = fileInputStream.read(bytes);
System.out.println(read);//2
System.out.println(Arrays.toString(bytes));//[97,98]
fileInputStream.close();
}
}
案例文件复制
一次读取1个字节
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class t1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\1.png");
FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.png");
int len = 0;
while ((len=fileInputStream.read())!=-1){
fileOutputStream.write(len);
}
}
fileInputStream.close();
fileOutputStream.close();
}
一次读取多个字节
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class t1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\1.png");
FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.png");
byte[] bytes = new byte[1024];
int len = 0;
while ((len=fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
}
fileInputStream.close();
fileOutputStream.close();
}
}
使用字节流读取中文的问题
产生原因:因为一个中文会占用多个字节,而字节流一次只能读取一个,这时就会产生问题
解决办法:java为我们提供了字符流,字符流一次可以读取一个字符,这样就避免了上述的问题了.