文章目录
- File类
-
- 构造方法:
- File类的创建功能:
- File类的删除功能
- 重命名功能:
- File的判断功能
- File类的获取功能
-
- 基本获取功能
- 高级获取功能
- 高级获取功能
- 递归
- IO流
-
- BufferedInputStream
- BufferedOutputStream
- 字符流
- InputStreamReader
-
- OutputStreamWriter:字符输出流(字符流通向字节流的桥梁):转换流
- FileReader/FileWriter ---继承自InputStreamReader/OutputStreamWriter
- BufferedReader
- BufferedWriter
- 内存操作流:操作临时数据
File类
构造方法:
- public File(String pathname):里面当前文件夹/文件的路径 (推荐方式)
- public File(String parent,String child):parent的字符串路径名和child的字符串路径名构造一个File
- public File(File parent,String child):参数1:需要描述parent的字符串路径名和子文件字符串路径名:构造一个File
File类的创建功能:
- public boolean createNewFile()throws IOException:创建文件
- public boolean mkdir():创建目录(文件夹):如果存在该文件夹,返回值false
- public boolean mkdirs():
-
创建目录(文件夹):创建多级目录,如果父目录不存在,会自动创建!
- 如果描述文件或者文件夹没有指定盘符,相对路径:默认是当前项目路径下
File类的删除功能
-
public boolean delete():删除目录/文件,
- 如果删除的是目录,那么前提条件:目录必须为空
重命名功能:
- 针对某个文件操作
- public boolean renameTo(File dest):
- 需求:将当前项目下的高圆圆.jpg — 杨桃.jpg
- 情况1:
-
当前文件的路径和该名后的路径相同,仅仅是改名字
- 情况2:
-
当前文件的路径名和该后面的路径名不相同,剪切并重命名
File的判断功能
-
public boolean isFile():判断是否是文件
-
public boolean isDirectory():判断是否是文件夹(目录)
-
public boolean canRead():判断是否可读
-
public boolean canWrite():判断是否可写
-
public boolean exists():判断所file表示的文件/目录是否存在
-
public boolean isAbsolute():判断是否是绝对路径
-
public boolean isHidden():判断是否是隐藏文件
File类的获取功能
-
基本获取功能
- public String getAbsolutePath():获取绝对路径名
- public String getPath():当前文件所表示的路径
- public long length():获取文件长度
-
public long lastModified():获取当前文件最后一次修改的时间(long:毫秒值)
高级获取功能
- public File[] listFiles():获取的是某个盘符下/目录File数组(目录中的文件)
- public String[] list():获取某个盘符/目录的下的所有文件以及目录的字符串数组
分析: * 1)描述下d盘符 d:\\ * File类描述 * * 2)获取当前盘符下所有的文件/文件夹所表示字符串数组/目录下的文件的File数组 * 3)判断如果当前字符串数组或者File数组不为空,遍历获取到每一个文件/目录 * 4)判断当前file是否是表示的文件 * 再次判断是否以".jpg"结尾---->String --> endsWith(".jpg") * 5)输出即可!
public class FileTest { public static void main(String[] args) { //描述下d盘符 d:\\ File file = new File("d:\\") ; //System.out.println(file); //public File[] listFiles() File[] fileArray = file.listFiles() ; //防止空指针 if(fileArray!=null) { //遍历 for(File f:fileArray) { //System.out.println(f); //判断f对象是否描述的文件 if(f.isFile()) { //是文件 //还需要判断:当前文件是否以.jpg结尾 if(f.getName().endsWith(".jpg")) { //是以.jpg结尾 //输出 System.out.println(f.getName()); } } } } } }
高级获取功能
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
在调用这个方法的时候,列表已经获取到了 * FilenameFilter:文件名称过滤器 * 抽象方法: * public class FileTest2 { public static void main(String[] args) { //描述一下D盘 File file = new File("D:\\") ; //public File[] listFiles(FilenameFilter filter):高级功能:获取file表示的目录中文件的File数组 //参数为:文件名称过滤器 File[] fileArray = file.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { //return false; //业务: /** * "所有的以".jpg"结尾的文件!" * dir表示是否文件 * name是否"以.jpg结尾" */ /* File file = new File(dir,name) ; boolean flag1 = file.isFile() ; //true:是文件 boolean flag2 = name.endsWith(".jpg") ;//true:文件名称是以.jpg结尾 //System.out.println(name); return flag1 && flag2 ; */ //一步走: return new File(dir,name).isFile() && name.endsWith(".jpg") ; } }) ; //遍历File数组 if(fileArray!=null) { for(File f:fileArray) { System.out.println(f.getName()); } } } } boolean accept(File dir,String name):是否将文件添加到文件列表中 * 返回值为true:添加到指定文件列表中; * 方法业务:根据具体的情况判断 * "所有的以".jpg"结尾的文件!" * dir表示是否文件 * name是否"已.jpg结尾"
递归
什么是方法递归呢? * 方法递归: * 就是方法本身调用方法一种现象! * * Math.max(10,Math.max(40,70)) ; 方法嵌套方法 * 举例: * 伪代码 * public void show(int n){ //10 * //出口条件(方法结束条件) * if(n<0){ * * * System.exit(0) ;//Java虚拟机终止了 * } * System.out.println(n) ; * show(n--) ; * } * * 递归: * 1)必须定义一个方法:方法调用方法 * 2)满足一定的规律 * 3)方法必须有出口条件(结束条件)--->否则:就是死递归! * * *注意事项: * 构造方法不存在递归!
需求
* 需要删除带内容的目录
* 删除当前项目下:demo文件夹
*
* 分析:
* 1)描述下当前demo文件夹:File file = new File("demo") ;
* 2)定义一个方法:delete(file) 递归删除的方法(删除目录)
* 2.1)高级获取功能:获取当前file所表示的文件以及文件夹的File数组[]
* 2.2)判断当前File数组不为空
* 判断当前file是否是文件夹 isDirectory()
* 是文件夹,回到2)步继续调用
*
* 不是文件夹,是文件
* 直接删除:调用delete()删除(查看删除的是
* 那个文件:获取文件名称)
*
* 2.3)删除文件夹:调用delete()删除当前空目录
public class Test3 {
public static void main(String[] args) {
//1)使用File 描述当前项目下的demo文件夹
File srcFile = new File("demo") ;
//2)定义一个删除目录的方法
delete(srcFile) ;
}
private static void delete(File srcFolder) {
//获取srcFolder文件夹下面的所有文件以及文件夹的File数组
File[] fileArray = srcFolder.listFiles() ;
if(fileArray!= null) {
//遍历
for(File file :fileArray) {
//获取到每一个file对象,判断当前是否是文件夹
if(file.isDirectory()) {
//回到2)进行递归删除
delete(file);//aaa bbb ccc
}else {
//不是文件夹,直接删除
System.out.println(file.getName()+"---"+file.delete());
}
}
//删除目录
System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
}
IO流
IO流
* 在设备之间进行数据传输的操作!
*
* 按流的方向划分:
* 输入流
* 输出流
*
* 按流的类型划分
* 字节流
*
* 字节输入流:InputStream
* 字节输出流:OutputStream
* 字符流
* 字符输入流:Reader
* 字符输出流:Writer
*
* 字符流是在字节输入流之后出现的,解决了中文乱码问题!
* 一般情况:针对某个文本文件进行读写复制操作: 优先采用字符流 (使用记事本打开并且能读懂!)
*
* 字节流
*
* 字节输入流:InputStream
* 字节输出流:OutputStream
*
* 两个抽象类,不能直接实例化,提供了一些具体的子类
* XXXInputStream
* XXXOutputStream
* 都是字节输入流和字节输出流的子类
*
* 需求:需要在当前项目下输出文件:fos.txt文件,并同时输出内容:"hello,OutputStream"
*
* FileOuputStream:针对文件操作:文件输出流(文件字节输出流)
* public FileOutputStream(String name):
* public FileOutputStream(File file)
* 推荐使用第一种:直接跟当前的具体路径!
* 使用步骤
* 1)创建OutputStream字节输出流对象,同时指向某个文件路径
* 2)写数据:给文件中写入内容
* 3)关闭相关的系统资源
文件字节输入流:FileInputStream
*
* 构造方法
* public FileInputStream(String name)throws FileNotFoundException
* 读数据
* public abstract int read():一次读取一个字节
* public int read(byte[] b) throws IOException:一次读取一个字节数组
*
* 使用步骤
* 1)创建FileInputStream对象:指向哪个文件
* 2)读数据 :public abstract int read():读取一个字节
* 展示结果
* 3)关闭资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
* 读写复制操作
*
* 在d盘下有一个FileInputStreamDemo.java文件的内容
*
*
* 复制到当前项目路径下:Copy.java文件中
*
* 分析:
* 1)封装d盘的文件FileInputStreamDemo.java ---源文件
* 使用输入流读取FileInputStreamDemo.java文件的内容
*
* 2)封装目标文件:当前项目下:Copy.java
* 使用文件字节输出流写数据,将上面的内容复制进来!
*
* 3)两种方式
* 要么1)一次读取一个字节
* 要么2)一次读取一个字节数组
*
*
* 复制图片文件/视频文件...
*
*
*
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//封装d盘的文件FileInputStreamDemo.java ---源文件
//创建字节文件输入流对象
FileInputStream fis = new FileInputStream("d:\\FileInputStreamDemo.java") ;
//封装目标文件:当前项目下:Copy.java
FileOutputStream fos = new FileOutputStream("Copy.java") ;
/*
//读写复制操作
//方式1):1次读取一个字节
int by = 0 ;
while((by=fis.read())!=-1) {
//读一个字节,写一个字节到fos流对象中
fos.write(by);
}
*/
//方式2:一次读取一个字节数组
//定义一个数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=fis.read(bytes))!=-1) {
//写一个字节数组:从0开始,写入实际字节数
fos.write(bytes, 0, len);
}
//释放资源
fos.close();
fis.close();
}
}
BufferedInputStream
- BufferedInputStream extends InputStream:字节缓冲输入流
- 构造方法
- BufferedInputStream(InputStream in)
BufferedOutputStream
- BufferedOutputStream extends OutputStream:字节缓冲输出流
- 构造方法
- public BufferedOutputStream(OutputStream out)
- 创建一个缓冲输出流对象,默认缓冲区大小
- 目前:当前缓冲流只是在流中提供了byte[] 缓冲区,默认足够大,一般通过带一个参的构造方法创建!
- 只是提供缓冲区,具体文件读写复制操作还是需要用底层流(InputStream/OutputStream)
字符流
InputStreamReader
InputStreamReader:字符输入流 (字符流通向字节流的桥梁)字符转换输入流
*
- 构造方法:
- public InputStreamReader(InputStream in):使用默认字符集进行解码(gbk格式)
- public InputStreamReader(InputStream in, String charsetName)
- 使用指定的字符集进行解码
- 成员方法:
- 读的功能
- public int read():读单个字符
- public int read(char[] cbuf):读字符数据
- public int read(char[] cbuf,int offset,int len)读字符数组的一部分
OutputStreamWriter:字符输出流(字符流通向字节流的桥梁):转换流
- 构造方法
- public OutputStreamWriter(OutputStream out):gbk格式 使用默认字符集进行编码的字符输出流
- public OutputStreamWriter(OutputStream out, Charset cs)
- 使用指定的字符集构造出一个字符输出流
- 成员方法
-
public void write(int c):写入单个字符
-
public void write(char[] cbuf):写入字符数组
-
public abstract void write(char[] cbuf,int off,int len) 写入字符数组的一部分
-
public void write(String str):写入字符串内容
-
public void write(String str,int off,int len):写入字符串一部分
- flush()和close()
- 一个刷新流:将缓冲的数据刷新出来(中文:默认gbk格式:一个中文对两个字节),流刷新之后还可以
- 继续写入数据;
- close()方法:将跟该流相关的系统资源释放掉,
- 不再指向当前操作的文件,关闭之后不能再写入数据否则出现IOException
为了简化字符流读写复制操作:
*
- 提供了字符转换输入流和字符转换输出流的便捷类
-
FileReader/FileWriter —继承自InputStreamReader/OutputStreamWriter
- FileReader(String pathname)
- FileWriter(String pathname)
BufferedReader
- BufferedReader:字符缓冲输入流
- 构造方法
- BufferedReader(Reader r):构造一个字符缓冲输入流提供默认缓冲区大小
- 特有功能:
- public String readLine():一次读取一行内容,当读取到\n(换行了),就终止!
-
*Scanner(InputStream in)
*BufferedReader(Reader r):可以作为键盘录入(使用流的方式)
BufferedWriter
- BufferedWriter:字符缓冲输出流
- 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
- public BufferedWriter(Writer out):构造一个缓冲输出流,默认缓冲区大小
- 成员方法
- 特有功能
-
public void newLine():写入行的分隔符(换行)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
*
* 键盘录入:
*
* 1)Scanner(InputStream in)
* 2)BufferedReader(Reader r):可以作为键盘录入(使用流的方式)
*
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
/*
Scanner sc = new Scanner(System.in) ;
System.out.println("请您输入String数据:");
String str = sc.nextLine() ;
System.out.println(str);
*/
//使用BufferedReader(Reader r):可以作为键盘录入
/*
//分步走
InputStream in = System.in ;
//创建Reader流对象
Reader r = new InputStreamReader(in) ; //字符转换流:通向字节流的桥梁
//创建BufferedReader流对象
BufferedReader br = new BufferedReader(r) ;
*/
//一步走
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) ;
System.out.println("请您输入一个数据:"); //"100" 数字字符串
//利用BufferedReader:的readLine()读取一行数据
String line = br.readLine() ; //"100"
//String---int: Integer.parseInt(String str)
int num = Integer.parseInt(line) ;
System.out.println("您录入的字符串是:"+num);
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 使用BufferedReader/BufferedWriter:读写复制操作:文本文件复制
* 利用特有功能(一种新的方式)
*
* 项目下的Demo.java---复制到D盘下:a.java文件中
* 使用BufferedReader:字符缓冲输入流的readLine():一次读取一行
* 使用BufferedWriter:newLine()可以实现换行
*
* 总结针对文本文件的复制操作:
* InputStreamReader/OutputStreamWriter:一次读取一个字符
* InputStreamReader/OutputStreamWriter:一次读取一个字符数组
* (同上)
* FileReader/FileWriter一次读取一个字符
* FileReader/FileWriter一次读取一个字符数组
*
* BufferdReader/BufferedWriter:一次读取一个字符
* BufferdReader/BufferedWriter:一次读取一个字符数组
* BufferedReader/BufferedWriter:一次读取一行
*
*
*
*/
public class Test {
public static void main(String[] args) throws IOException {
//封装源文件
BufferedReader br = new BufferedReader(new FileReader("Demo.java")) ;
//封装目标文件
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.java")) ;
//读写
String line = null ;
while((line=br.readLine())!=null) {
//读一行,bw写一行
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
-
内存操作流:操作临时数据
- ByteArrayOutputStream:内存操作输出流
- 构造方法:
- public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
- 成员方法
- public byte[] toByteArray():将内存操作输出流中流对象—数组格式
- ByteArrayInputStream:内存操作输入流
- 构造方法:
-
public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
dReader(new FileReader(“Demo.java”)) ;
//封装目标文件
BufferedWriter bw = new BufferedWriter(new FileWriter(“D:\a.java”)) ;
//读写
String line = null ;
while((line=br.readLine())!=null) {
//读一行,bw写一行
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
* ## 内存操作流:操作临时数据
* ByteArrayOutputStream:内存操作输出流
* 构造方法:
* public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
* 成员方法
* public byte[] toByteArray():将内存操作输出流中流对象---数组格式
*
* ByteArrayInputStream:内存操作输入流
* 构造方法:
* public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
* 内存操作输入流