1、File
1.1File的基本用法
概念:代表物理盘符中的一个文件或者文件夹。
常见方法:
方法名 | 描述 |
---|---|
createNewFile() | 创建一个新文件。 |
mkdir() | 创建一个新目录。 |
delete() | 删除文件或空目录。 |
exists() | 判断File对象所对象所代表的对象是否存在。 |
getAbsolutePath() | 获取文件的绝对路径。 |
getName() | 取得名字。 |
getParent() | 获取文件/目录所在的目录。 |
isDirectory() | 是否是目录。 |
isFile() | 是否是文件。 |
length() | 获得文件的长度。 |
listFiles() | 列出目录中的所有内容。 |
renameTo() | 修改文件名为。 |
package Day16_IO1;/*
* @author pyh
* @date 2020/12/7 0007 上午 10:02
* @version 1.0
* @since JDK1.8_241
*/
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo01 {
public static void main(String[] args) {
//路径都是从盘符开始
//File file = new File("E:\\File\\IO1.txt");
//File file = new File("E:\\File", "IO1.txt");
//File file = new File(new File("E:\\File"), "IO1.txt");
//路径从项目开始
File file = new File("E:\\File\\IO1.txt");
System.out.println("文件是否可读:"+file.canRead());
System.out.println("文件是否可写:"+file.canWrite());
System.out.println("文件是否隐藏:"+file.isHidden());
//相对于项目
System.out.println("相对路径:"+file.getPath());
//从盘符开始
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件名:"+file.getName());
System.out.println("文件长度:"+file.length());
//返回的是从1970年1月1日到文件最后修改时间的毫秒数
System.out.println("最后修改时间1:"+file.lastModified());//1607329936234
System.out.println("最后修改时间2:"+getTime(file.lastModified()));//2020-12-7 16:32:16
System.out.println("文件是否可执行:"+file.canExecute());
System.out.println("文件或目录是否存在:"+file.exists());
System.out.println("是否为文件:"+file.isFile());
System.out.println("是否为目录:"+file.isDirectory());
}
public static String getTime(long time){
/* //方法一:
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);*/
//方法二:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(time);
return str;
}
}
1.2 @Test(单元测试)的用法
package Day16_IO1;/*
* @author pyh
* @since JDK1.8_241
* @Test:单元测试
* 1.需要加上注解@Test
* 2.访问修饰符不能是private
* 3.不能是静态的
* 4.包下不能存在Test类
*/
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class Demo02 {
//1.在目录结构存在的情况下创建文件
@Test
public void test1() throws IOException {
File file = new File("E:\\File\\IO1.txt");
//判断文件是否存在,不存在则创建
if (!file.exists()){
//创建文件
file.createNewFile();
}
}
//2.在父目录结构不存在的情况下创建文件
@Test
public void test2() throws IOException {
File file = new File("E:\\File\\IO\\IO1.txt");
//获取文件的目录的抽象路径
//parentFile -- E:\File\IO
File parentFile = file.getParentFile();
//判断是否存在
if (!parentFile.exists()){
//创建指定的目录
parentFile.mkdir();
//判断文件是否存在
if (!file.exists()){
//创建文件
file.createNewFile();
}
}
}
//3.多层父目录结构不存在的情况下创建文件
@Test
public void test3() throws IOException {
File file = new File("E:\\File\\IO\\File\\IO\\IO1.txt");
//获取文件的目录的抽象路径
//parentFile -- E:\File\IO\File\IO
File parentFile = file.getParentFile();
//判断是否存在
if (!parentFile.exists()){
//创建多层父目录
parentFile.mkdirs();
//判断文件是否存在
if (!file.exists()){
//创建文件
file.createNewFile();
}
}
}
//4.删除文件
@Test
public void test4(){
File file = new File("E:\\File\\IO1.txt");
file.delete();
}
//5.删除目录 -- 只能删除空目录
@Test
public void test5(){
File file = new File("E:\\File\\IO");
file.delete();
}
}
1.3File的应用
package Day16_IO1;
import org.junit.Test;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class Demo03 {
//1、输出目录下的所有的文件名(不包含子目录) --listFilea()
@Test
public void test1() throws IOException {
File file = new File("E:\\File");
//获取指定目下的所有文件和目录的File对象
File[] files = file.listFiles();
for (File f:files) {
//判断是否为文件
if (f.isFile()){
System.out.println(f.getName());
}
}
}
//2、输出目录下的所有的文件名(包含所有子目录)
/* public static void main(String[] args) {
File file = new File("E:\\File");
test02(file);
}*/
public static void test2(File file){
//获取目录下所有的目录和文件的File对象
File[] files = file.listFiles();
for (File f:files){
//判断是文件还是目录
if (f.isFile()){
System.out.println(f.getAbsolutePath());
}else{
//获取目录里的所有文件和子目录的File对象
test2(f);
}
}
}
//3.输出目录下所有的txt文件(包含子目录)
public static void main(String[] args) {
File file = new File("E:\\File");
test3(file);
System.out.println("--------");
test4(file);
}
public static void test3(File file){
File[] files = file.listFiles();
for (File f:files) {
//判断是文件还是目录
if (f.isFile()){
//再判断是否为txt文件
if (f.getName().endsWith(".txt")){
System.out.println(f.getAbsolutePath());
}
}else{
test3(f);
}
}
}
private static void test4(File file) {
//数组中包含txt文件和目录
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//过滤非txt文件的内容
if (pathname.isFile()){
//是否为txt文件
if (!pathname.getName().endsWith(".txt")){
return false;
}
}
return true;
}
});
for (File f:files) {
//判断是文件还是目录
if (f.isFile()){
System.out.println(f.getAbsolutePath());
}else {
test3(f);
}
}
}
}
2、IO流
IO流:
- 1、根据数据的传输方向:输入流/输出流
- 2、根据读写单位:字节流,字符流
- 3、根据功能划分:基础流,包装类
下面的例子中会用到工具类IOUtils,所以我就不再下面一一去写了。
作用是关闭资源。
package Day16_IO1.utils;
//关闭输入输出流
import java.io.Closeable;
import java.io.IOException;
public class IOUtils {
public static void closeAll(Closeable...closeables) {
for (Closeable c:closeables) {
if (c != null){
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.1 字节输入流
package Day16_IO1.stream;/*
* @author pyh
* @date 2020/12/7 0007 下午 3:08
* @version 1.0
* @since JDK1.8_241
IO流:
1、根据数据的传输方向:输入流/输出流
2、根据读写单位:字节流,字符流
3、根据功能划分:基础流,包装类
FileInputStream -- 文件字节输入流,基类为InputStream
*/
import Day16_IO1.utils.IOUtils;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo01 {
//读取单个字节
@Test
public void test1(){
//文件字节输入流
FileInputStream fis = null;
try {
fis =new FileInputStream("E:\\File\\IO1.txt");
//读取单个字节
int read = fis.read();
System.out.println((char) read);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源(关闭字节流)
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读取单个字节 -- 循环读取完毕
@Test
public void test02(){
//文件字节输入流
FileInputStream fis = null;
try {
//fis = new FileInputStream(new File("IO1.txt"));
fis = new FileInputStream("E:\\File\\IO1.txt");
//读取到的数据字节
int read;
while((read = fis.read())!= -1){
System.out.println((char)read);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//字节输出流 -- 直接写String类型的数据
@Test
public void test3(){
FileInputStream fis = null;
try {
fis = new FileInputStream("E:\\File\\IO1.txt");
//1024代表数组的长度,也代表一次读取1024个数据字节到数组中
byte[] b = new byte[1024];
//读取到数组中的数据长度
int len;
while ((len = fis.read(b)) != -1){
//第一个参数为存放数据的数组(缓冲区)
//第二个参数是偏移量
//第三个参数是存放在数组中数据的长度
System.out.println(new String(b,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(fis);
}
}
}
2.2 字节输出流
package Day16_IO1.stream;/*
* OutputStream -- 字节输出流的基类
* FileOutputStream -- 文件字节输出流
*/
import org.junit.Test;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo02 {
//写入单个字节
@Test
public void test01(){
FileOutputStream fos = null;
try {
fos = new FileOutputStream("IO1.txt");
fos.write(97);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//写入多个字节
@Test
public void test02(){
FileOutputStream fos = null;
try {
fos = new FileOutputStream("IO1.txt");
//"wasd".getBytes() -- 能把"wasd"转换成byte类型数组
fos.write("wasd".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//末尾添加
@Test
public void test03(){
FileOutputStream fos = null;
try {
fos = new FileOutputStream("IO1.txt",true);
//"wasd".getBytes() -- 能把"wasd"转换成byte类型数组
fos.write("wasd".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.3 字节流的拷贝
package Day16_IO1.stream;
//字节流的拷贝
import Day16_IO1.utils.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//路径指向目标源
fis = new FileInputStream("E:\\File\\IO2.txt");
//路径指向目的源
fos = new FileOutputStream("E:\\File\\IO3.txt");
byte[] b =new byte[1024];
int len;
while ((len = fis.read(b)) != -1){
fos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(fis,fos);
}
}
}
常见字符编码:
编码 | 说明 |
---|---|
ISO-8859-1 | 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。 |
UTF-8 | 针对Unicode的可变长度字符编码。 |
GB2312 | 简体中文。 |
GBK | 简体中文、扩充。 |
BIG5 | 台湾,繁体中文。 |
2.4 字符流
FileWriter:
- public void write(String str) 。
- 一次写多个字符,将b数组中所有字符,写入输出流。
FileReader:
- public int read(char[] c) 。
- 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
package Day16_IO1.charTest;/*
* @author pyh
* @date 2020/12/7 0007 下午 4:50
* @version 1.0
* @since JDK1.8_241
字符流的写法跟字节流类似
输出流会自动创建一个.txt文件,根据你所写的命名
*/
import Day16_IO1.utils.IOUtils;
import org.junit.Test;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo01 {
//读取单个字符
@Test
public void test1(){
FileReader fr = null;
try {
fr = new FileReader("E:\\File\\IO4.txt");
int read = fr.read();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
IOUtils.closeAll(fr);
}
}
//读取多个字符
@Test
public void test2(){
FileReader fr = null;
try {
fr = new FileReader("E:\\File\\IO4.txt");
char[] c = new char[1024];
int len;
while ((len = fr.read(c)) != -1){
System.out.println(new String(c,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(fr);
}
}
//字符输出流 -- 直接写String类型的数据
@Test
public void test3(){
FileWriter fw = null;
try {
fw = new FileWriter("E:\\File\\IO4.txt");
fw.write("good good study");
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(fw);
}
}
//字符流的拷贝
@Test
public void test4(){
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("E:\\File\\IO5.txt");
fw = new FileWriter("E:\\File\\IO6.txt");
int len;
char[] c = new char[1024];
while ((len = fr.read(c)) != -1){
fw.write(c,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeAll(fr,fw);
}
}
}
作业:
package Day16_IO1.charTest;
//删除文件夹,文件夹里有东西
import java.io.File;
public class Demo03 {
public static void main(String[] args) {
File file = new File("E:\\File\\File1");
test1(file);
}
private static void test1(File file){
//获取地址
File[] files = file.listFiles();
for (File f:files) {
//判断是否为文件
if (f.isFile()){
f.delete();//删除文件
}else {
test1(f);//如果有没删完的就继续循环 -- 递归
}
}
file.delete();
}
}