本篇文章借鉴于博主 xiaolong18312093514 的 java 输入输出流详解及分类
File类的方法
方 法 原 型 | 说 明 |
---|---|
boolean exists() | 判断文件是否存在,存在返回true,否则返回false |
boolean isFile() | 判断是否为文件,是文件返回true,否则返回false |
boolean isDirectory() | 判断是否为目录,是目录返回true,否则返回false |
String getName() | 获得文件的名称 |
String getAbsolutePath() | 获得文件的绝对路径 |
long length() | 获得文件的长度(字节数) |
boolean createNewFile() throws IOException | 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 |
boolean delete() | 删除文件,删除成功返回true,否则返回false |
File[] listFiles() | 返回文件夹内的子文件与子文件夹的数组 |
// 我只写了部分,想测试的小伙伴可以看上面的方法自行测试哈
@Test
public void method1() {
String path1 = "E:/图标.ico";
// File 类可以表示 具体的文件或目录
File file1 = new File(path1);
// isFile() 判断是一个文件
System.out.println(file1.isFile());
// isDirectory() 判断是一个目录
System.out.println(file1.isDirectory());
System.out.println("名称:"+file1.getName());
System.out.println("是否可读="+ file1.canRead());
System.out.println("是否可写="+ file1.canWrite());
System.out.println("是否可执行="+ file1.canExecute());
System.out.println("文件大小="+file1.length()/1024+"KB");
}
流的分类(输入输出是相对与内存的)
流分为 字符流 和 字节流 :这两个流分别有输入输出流,只是字符流比字节流多了一步缓冲区(可以简单的理解为一块特殊的内存)。
使用字节流InputStream、OutputStream
时不用关闭资源也可以把资源输出到文件中(最好关闭)。
使用字符流Reader、Writer
时需要关闭资源才可以把数据输出到文件,也可以不用关闭资源,但是需要flush()
方法强制写入数据才可以。
详细内容请阅读Java进阶(四十五)java 字节流与字符流的区别
字符流:也是特殊的字节流(就是在字节流的基础上,加上编码,形成的数据流)(纯文本的文件是字符流 .txt .xml .html .properties
)
Reader
输入流(下面的是子类)BufferedReader
缓冲输入流InputStreamReader
输入流
Writer
输出流(下面的是子类)BufferedWriter
缓冲输出流OutputStreamWriter
输出流
字节流
InputStream
输入流FileInputStream
输入流BufferedInputStream
缓冲输入流
OutputStream
输出流FileOutputStream
输出流BufferedOutputStream
缓冲输出流
实战小测试(字节流操作)
将图片复制到另一个文件夹
@Test
public void method1() {
// 为了关闭资源
InputStream inputStream = null;
OutputStream outputStream = null;
// 读取 使用 输入流
try {
// 得到了一个文件的输入流
inputStream = new FileInputStream("E:/图片/6.png");
// 输出流
// outputStream = new FileOutputStream("E:/test.png"); // 只能写文件,不能创建文件夹
// 想要创建文件夹需要判断
File outFile = new File("E:/test/test.png");
// 得到写出文件ParentFile
File parentFile = outFile.getParentFile();
System.out.println(parentFile);
// 判断写出文件的ParentFile如果不存在,则创建它
if(!parentFile.exists()) {
parentFile.mkdirs();
}
outputStream = new FileOutputStream(outFile);
// 第一种写法(文件可能会增大)
/* // 开始读这个文件
// 从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞
// 下一个数据字节,如果已到达文件末尾,则返回-1
int t = -1;
while((t=inputStream.read()) != -1) {
// 输出的是数据字节
//System.out.print(t+"\t");
// 输入流每读取一个数据字节,则使用输出流写一个字节
outputStream.write(t);
}
*/
// 第二种写法
// 定义了一个2048个大小的byte的数组
byte[] bytes = new byte[2048];
int len = -1;
/*
* len = inputStream.read(bytes) 每次将文件的字节读入到给定的bytes的数组种
* 并且返回这次一共读了多少个字节。如果读了文件的末尾则返回-1
*/
while((len = inputStream.read(bytes)) != -1) {
System.out.println(len);
// 下行代码的写法会增大文件的大小,因为会将未填满的字节也使用上了
// outputStream.write(bytes);
// 下行代码限制了写入的开头结尾,未填满bytes数组,也会结束
outputStream.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally { // 关闭使用的流(后使用完的先关闭)
// if(outputStream != null) {
// try {
// outputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if(inputStream != null) {
// try {
// inputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// 简化
try {
if(outputStream != null) {
outputStream.close();
}
if(inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
实战小测试(字符流操作)
将文本中的内容复制粘贴到另一个文件中
public void method1() {
File inFile = new File("E:/info.txt");
File outFile = new File("E:/test.txt");
Reader reader = null;
Writer writer = null;
try {
// FileReader(文件名)
// 对文件名指定的文件创建一个读入流
reader = new FileReader(inFile);
// FileWriter(文件名)
// 对文件名指定的文件创建一个写出流
writer = new FileWriter(outFile);
char[] chars = new char[1024];
int len = -1;
// read()方法读取指定文件中的字符。读取完毕,read()方法返回-1
while((len = reader.read(chars))!= -1) {
// write()把文字写入到指定文件
writer.write(chars,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(writer != null) {
writer.close();
}
if(reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}