File:文件,文件夹
- 相对路径:里面有一个参照文件,通常参照当前的java工程文件
- 绝对路径:Windows平台是指从盘符开始的路径
获取文件的绝对路径:getAbsolutePath()
URL:统一资源定位符
协议名://主机名:端口号/文件路径/文件名
https://www.w3school.com.cn:443/index.html
http: 超文本传输协议 默认端口号是80
https: http+SSL 安全套接 安全性更高 默认端口号443
URI:统一资源标识符
jdbc:mysql://localhost:3306/数据库名
DNS:域名解析服务器–>将网址解析成IP地址
文件字节输入流的使用
- 1.准备好源文件
- 2.创建文件字节输入流对象
- 3.读取数据
- 4.关闭资源
文件字节输出流的使用
- 1.创建一个目标文件
- 2.创建一个文件字节输出流对象
- 3.写数据
文件字符输入流
FileReader
文件字符输出流
FileWriter
缓冲字符输入输出流
BufferedWriter
BufferedReader
使用字节输入流输出流实现文件的复制操作:
public static void main(String[] args) {
//准备好源文件和目标文件
File sf = new File(“4.jpg”);
File df = new File(“风景.jpg”);
//先将源文件读取到程序中,然后再写到目标文件
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建文件字节输出和输入流对象
fis = new FileInputStream(sf);
fos = new FileOutputStream(df);
//准备一个 缓冲字节数组
byte[]bs = new byte[100];
//先读取数据,在将读取的数据写到文件中
int len = fis.read(bs);
while (len!=-1) {
//将数组中读取的数据写到文件中
fos.write(bs, 0, len);
fos.flush();//刷流
len = fis.read(bs);//继续读取
}
System.out.println(“文件复制完毕!”);
} catch (Exception e) {
e.printStackTrace();
}finally{
//资源关闭遵循先进后出
try {
if (null!=fos) {
fos.close();
}
if (null!=fis) {
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
*使用缓冲流实现文件的读取和写出操作
public class FileWriterDemo {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
//创建缓冲字符输入输出流
br = new BufferedReader(new FileReader(new File(“abc.txt”)));
bw = new BufferedWriter(new FileWriter(new File(“aaa.txt”)));
//边读边写的操作
String lines = br.readLine();
while (lines!=null) {
//将读取的字符串写到文件中
if (!lines.equals("\r\n")) {
bw.write(lines);
bw.newLine();//换行
bw.flush();//刷流–将内存中的数刷到文件中
}
lines = br.readLine();//循环读取
}
System.out.println(“读写完毕”);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if (bw!=null) {
bw.close();
}
if (br!=null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
递归
方法体中,存在自己调用自己就称之为递归
输出斐波拉切数列的第n项
斐波拉切数列:0 1 1 2 3 5 8 13 21
f(1) = 0 第一位
f(2) = 1 第二位
f(3) = f(1)+f(2)
f(4) = f(2)+f(3)
public class DiGui {
public static void main(String[] args) {
int f = fibo(40);//有栈针限制,调用太多次会报错
System.out.println(f);
}
//方法体中,存在自己调用自己就称之为递归
public static int fibo(int n){//n代表第多少位
if (n<=1) {
return 0;
}else if(n==2){
return 1;
}else{
return fibo(n-1)+fibo(n-2);
}
}
}
例:
统计代码行数 给一个文件目录,遍历该目录下的所有文件,如果是.java文件,利用字符流读取该java源文件,
统计全部java文件的代码共有多少行,java文件个数有多少
提示:先获取所有文件,如果文件名以java结尾则表示是Java文件。然后再计算所有Java文件的行数总 合,以及Java文件的个数。
public class Demo01 {
public static int count1;// 代表java文件个数
public static int count2;// 代表java文件代码行数
public static BufferedReader br;//
/**
*
* @param path需要读取的文件路径
* @throws Exception
*/
public static void listFiles(File f) {
if (f.isFile()) {// 这个文件对象是一个文件
String fn = f.getName();// 获取这个文件的名字
if (fn.endsWith(".java")) {// 判断文件名是否以.java结束
count1++;// java文件个数加1
try {
br = new BufferedReader(new FileReader(f));
String msg = br.readLine();// 一次读取一行数据
while (msg != null) {
count2++;
msg = br.readLine();// 循环读取
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} else {// 这个文件对象是一个文件夹
File[] fs = f.listFiles();// 将目录中的所有文件展开到文件对象数组中
for (File file : fs) {// file代表文件数组中的元素
// 自己调用自己
listFiles(file);
}
}
}
public static void main(String[] args) {
File f = new File("D:\\lzh");
try {
listFiles(f);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("java文件个数是:" + count1 + ",java代码行数是:" + count2);
}
}