Day23-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\InOut
遞歸
遞歸公式
遞歸結(jié)束語(yǔ)句
package com.recursion;
public class RecursionTest1 {
public static void main(String[] args) {
test1();
}
public static void test1(){
System.out.println("------test1------");
test1();//直接方法遞歸
//StackOverflowError 棧溢出
}
public static void test2(){
System.out.println("------test2------");
test3();
}
public static void test3(){
test2();//間接遞歸
}
}
直接遞歸(常用)
間接遞歸
package com.recursion;
public class RecursionTest2 {
public static void main(String[] args) {
int f5 = f(5);
System.out.println("5的階乘是"+f5);
int f6 = f1(6);
System.out.println("1到6的累加求和是"+f6);
}
public static int f(int n){
//終結(jié)點(diǎn)
if(n==1){
return 1;
}else {
return f(n-1)*n;
}
}
public static int f1(int n){
if(n==1){
return 1;
}else {
return f1(n-1)+n;
}
}
}
文件搜索
package com.recursion;
import java.io.File;
import java.io.IOException;
public class RecursionTest3 {
public static void main(String[] args) throws IOException {
searchFile(new File("C:/"),"aaa");
}
/**
* 去目錄下搜索某個(gè)文件
* @param dir 目錄
* @param fileName 要搜索的文件名稱
*/
public static void searchFile(File dir,String fileName) throws IOException {
//1、先把非法的情況攔截
if(dir == null||!dir.exists()||!dir.isDirectory()){
//? 原代碼此處有 bug:!dir.isFile() 會(huì)導(dǎo)致當(dāng) dir 是文件夾時(shí)也被攔截(因?yàn)槲募A的 isFile() 返回 false),導(dǎo)致搜索無(wú)法執(zhí)行。需修正為 !dir.isDirectory()(判斷是否為文件夾)。
return;//代表無(wú)法搜索
}
//2、dir不是null,存在,一定是目錄對(duì)象
File[] files = dir.listFiles();
//3、判斷當(dāng)前目錄下是否存在一級(jí)文件對(duì)象,以及是否可以拿到一級(jí)文件對(duì)象
if(files!=null&&files.length>0){
//4、遍歷全部一級(jí)文件對(duì)象
for (File file : files) {
//判斷文件是否為文件,還是文件夾
if(file.isFile()){
if(file.getName().contains(fileName)){
System.out.println("找到了"+fileName+"的文件路徑:"+file.getAbsolutePath());
Runtime runtime = Runtime.getRuntime();//這兩行是文件啟動(dòng)程序,exec是啟動(dòng)
runtime.exec(file.getAbsolutePath());//這兩行是文件啟動(dòng)程序,gc是JVM執(zhí)行垃圾回收
}
}else if(file.isDirectory()){
//是文件夾,重復(fù)這個(gè)過(guò)程
searchFile(file,fileName);
}
}
}
}
}
ASCII字符集
使用一個(gè)字節(jié)(8位)存儲(chǔ),首位是0,一共有2^7
GBK字符集
一個(gè)中文字符編碼成兩個(gè)字節(jié),GBK兼容了ASCII字符集,包含了兩萬(wàn)多個(gè)字符
GBK規(guī)定:漢字的第一個(gè)字節(jié)的第一位必須是1,一共2^15,32768個(gè)
Unicode字符集
是國(guó)際組織制定的,可以容納世界上所有文字、符號(hào)的字符集
UTF-32
四個(gè)字節(jié)表示一個(gè)字符
UTF-8
可變長(zhǎng)度的編碼方案,共分為四個(gè)長(zhǎng)度區(qū):1個(gè)字節(jié)、2個(gè)字節(jié)、3個(gè)字節(jié)、4個(gè)字節(jié)
- 英文和數(shù)字等只占1個(gè)字節(jié)(兼容標(biāo)準(zhǔn)ASCII編碼),漢字字符占用3個(gè)字節(jié)
IO流
Input和Output
FileInputStream(文件字節(jié)輸入流)
以內(nèi)存為基準(zhǔn),可以把磁盤(pán)中文件的數(shù)據(jù)以字節(jié)的形式讀入到內(nèi)存中去
每次只讀取一個(gè)字節(jié),讀取性能較差,并且讀取漢字輸出會(huì)亂碼
package Basic.src.com.InOut;
import javafx.application.Application;
import javafx.stage.Stage;
import java.io.*;
public class FileInputStreamTest1 {
public static void main(String[] args) throws IOException {
//1、創(chuàng)建文件字節(jié)輸入流管道,與源文件接通
//InputStream is = new FileInputStream(new File("Basic\\src\\itheima01.txt"));
//下面是簡(jiǎn)化寫(xiě)法,推薦使用
InputStream is = new FileInputStream("Basic\\src\\itheima01.txt");
// //2、開(kāi)始讀取文件的字節(jié)數(shù)據(jù)
// int b1 = is.read();
// System.out.println(b1);
// System.out.println((char)b1);
//
// int b2 = is.read();
// System.out.println((char)b2);
//
// int b3 = is.read();
// System.out.println(b3);//返回-1通知文件已經(jīng)讀完了
// System.out.println((char)b3);
//3、使用循環(huán)改造上述
int b;//用于記住上述代碼
while ((b = is.read()) != -1) {
System.out.print((char)b);
}
//讀取數(shù)據(jù)的性能很差!
//應(yīng)該盡量減少系統(tǒng)調(diào)用硬盤(pán)中的數(shù)據(jù)的頻次
//讀取漢字輸出會(huì)亂碼!無(wú)法避免
//流使用完畢后,必須關(guān)閉!釋放系統(tǒng)資源!
is.close();
}
}
釋放內(nèi)存
try-catch-finally
在finally區(qū)釋放內(nèi)存,無(wú)論try中的程序是正常執(zhí)行了還是出現(xiàn)異常,最后都一定會(huì)執(zhí)行finally區(qū),除非JVM終止
一般用于在程序執(zhí)行完成后進(jìn)行資源的釋放操作(專(zhuān)業(yè)做法)
package Basic.src.com.InOut;
import java.io.*;
public class Test2 {
public static void main(String[] args) {
InputStream is = null;
OutputStream os =null;
try {
//在is和os被賦值之前出現(xiàn)異常的話會(huì)使得is和os在null的情況下被close,出現(xiàn)空指針異常
//需求:復(fù)制照片
//1、創(chuàng)建一個(gè)字節(jié)輸入管道與源文件接通
is = new FileInputStream("Basic\\src\\itheima03.txt");
//2、創(chuàng)建一個(gè)字節(jié)輸出管道與目標(biāo)字節(jié)接通
os = new FileOutputStream("Basic\\src\\itheima03copy.txt");
//3、創(chuàng)建一個(gè)字節(jié)數(shù)組專(zhuān)用字節(jié)數(shù)據(jù)
byte[] buffer = new byte[1024];//1KB
//4、從字節(jié)輸入流中讀取字節(jié)數(shù)據(jù),寫(xiě)出去到字節(jié)輸出流中,讀多少寫(xiě)出去多少
int len;//記住每次讀取多少個(gè)字節(jié)
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
}
//后創(chuàng)建的流要先關(guān)掉,先創(chuàng)建的流要后關(guān)掉
System.out.println("復(fù)制完成");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (os!=null)os.close();//避免因?yàn)閕s和os被賦值前出現(xiàn)異常導(dǎo)致的提前調(diào)用
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
if (is!=null)is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
try-with-resource
開(kāi)始于JDK7
把要用的流對(duì)象放在try后面的( )里面,可以不需要使用finally
( )內(nèi)只能放置資源,否則報(bào)錯(cuò),資源指的是最終實(shí)現(xiàn)了AutoCloseable接口,重寫(xiě)了close()方法
package Basic.src.com.InOut;
import java.io.*;
public class Test3 {
public static void main(String[] args) throws Exception {
try(
//在is和os被賦值之前出現(xiàn)異常的話會(huì)使得is和os在null的情況下被close,出現(xiàn)空指針異常
//需求:復(fù)制照片
//1、創(chuàng)建一個(gè)字節(jié)輸入管道與源文件接通
InputStream is = new FileInputStream("Basic\\src\\itheima03.txt");
//2、創(chuàng)建一個(gè)字節(jié)輸出管道與目標(biāo)字節(jié)接通
OutputStream os = new FileOutputStream("Basic\\src\\itheima03copy.txt");
//這里只能放置資源型對(duì)象(比如流對(duì)象)
//什么是資源呢?資源都是會(huì)實(shí)現(xiàn)AutoCloseable接口
//用完之后會(huì)自動(dòng)被調(diào)用close方法完成釋放資源的操作
//public abstract class OutputStream implements Closeable, Flushable
//public interface Closeable extends AutoCloseable
MyConnection connection = new MyConnection()//因?yàn)镸yconnection類(lèi)實(shí)現(xiàn)了AutoCloseable接口并重寫(xiě)了close()方法,被視為資源型
) {
//在is和os被賦值之前出現(xiàn)異常的話會(huì)使得is和os在null的情況下被close,出現(xiàn)空指針異常
//3、創(chuàng)建一個(gè)字節(jié)數(shù)組專(zhuān)用字節(jié)數(shù)據(jù)
byte[] buffer = new byte[1024];//1KB
//4、從字節(jié)輸入流中讀取字節(jié)數(shù)據(jù),寫(xiě)出去到字節(jié)輸出流中,讀多少寫(xiě)出去多少
int len;//記住每次讀取多少個(gè)字節(jié)
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
}
//后創(chuàng)建的流要先關(guān)掉,先創(chuàng)建的流要后關(guān)掉
System.out.println("復(fù)制完成");
System.out.println(connection);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package Basic.src.com.InOut;
public class MyConnection implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("釋放了與某個(gè)硬件的連接資源");
}
}
字符流
適合讀寫(xiě)文本文件的內(nèi)容
FileReader
把文件(磁盤(pán)或網(wǎng)絡(luò))中的數(shù)據(jù)以字符的形式讀取到內(nèi)存中
package Basic.src.com.InOut.FileReaderWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
public class FileReaderTest1 {
public static void main(String[] args) throws Exception {
try (
//創(chuàng)建一個(gè)文件字符輸入流管道與源文件接通
Reader fr = new FileReader("Basic\\src\\com\\InOut\\FileReaderWriter\\itheima01.txt");
){
// //2、讀取文本文件的內(nèi)容
// int c;
// while ((c = fr.read()) != -1) {//read返回的是int
// System.out.print((char)c);
// }
//3、每次讀取多個(gè)字符
char[] buffer = new char[3];
int len;
while((len = fr.read(buffer))!= -1) {
String str = new String(buffer, 0, len);
System.out.print(str);
}
//性能是比較不錯(cuò)的!
} catch (Exception e) {
e.printStackTrace();;
}
}
}

浙公網(wǎng)安備 33010602011771號(hào)