Java文件(File)、流(Stream)和IO
Java的IO包中提供了所有操作输入、输出的类。所有这些类表示了输入源和输出目标。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
一、文件操作
在Java中专门提供了针对于文件操作的类——File,位于Java.io包下
下面是常用文件操作:
- File类的创建方法
//第一种
File file = new File("F:/javaFileTest/test.txt"); //传入文件路径
//第二种
File file = new File("F:/javaFileTest,test.txt"); //文件夹+文件
- 文件创建
//方法一
File file = new File("F:/javaFileTest/test.txt");
file.createNewFile();
//方法二
File file = new File("F:/javaFileTest,test.txt");
file.createNewFile();
- 文件夹创建
//前提:javaFileTest已存在
//方法一
File dir = new File("F:/javaFileTest/文件夹1");
dir.mkdir(); //返回布尔结果,该方法只创建一个文件夹
//方法一
File dir = new File("F:/javaFileTest/文件夹1/文件夹2/文件夹3");
dir.mkdirs(); //返回布尔结果,创建一个文件夹和它的所有父文件夹
- 文件移动
File file1 = new File("F:/javaFileTest/test.txt/c.txt") //原文件
File file = new File("F:/javaFileTest/test.txt"); //目标文件
file1.renameTo(destFile);
- 读取目录
import java.io.File;
public class Demo2 {
public static void main(String[] args) {
File dir = new File("F:/Demo"); //申明要遍历的文件对象
File[] files = dir.listFiles(); //将该文件下第一层目录下的所有文件存到文件数组中
listFile(files);
}
/**
*递归遍历文件夹
*/
private static void listFile(File[] files){
if(files != null && files.length>0){ //文件非空且大小大于0
for (File file:files) { //for-each遍历每个文件
if(file.isFile()){ //如果是文件就打印
if(file.getName().endsWith(".java"))
System.out.println("找到目标文件:" + file.getAbsolutePath());
}
else{ //如果是文件夹则继续遍历递归
listFile(file.listFiles()); //递归
}
}
}
}
}
二、流(Stream)和IO(input、output)
如前所述,一个流被定义为一个数据序列。对于java程序,输入流用来读取数据,输出流用来写数据。
以下是输入流与输出流的类层次图
下面演示FileInputStream与FileOutputStream:
- FileInputStream
- 类的创建
//方法一
FileInputStream fis = new FileInputStream("F:/javaFileTest/test.txt"); //传入文件路径
//方法二
File file = new File("F:/javaFileTest/test.txt");
FileInputStream fis = new FileInputStream(file); //传入File对象
- 常用方法
//读
/*这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。*/
public int read(int r)throws IOException{}
//这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
public int read(byte[] r) throws IOException{}
//关闭流
//关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
public void close() throws IOException{}
- FileOutputStream
- 类的创建
//方法一
FileOutputStream fos = new FileOutputStream("F:/javaFileTest/test.txt"); //传入文件路径
//方法二
File file = new File("F:/javaFileTest/test.txt");
FileOutputStream fis = new FileOutputStream(file); //传入File对象
- 常用方法
//写
public void write(int w)throws IOException{} //把指定字符写到输入流中
public void write(byte[] w) //把数组中w.length长度的字节写到OutputStream中
//关闭流
public void close() throws IOException{} //关闭文件输入流并释放与此流有关的资源
- Reader与Writer
由于FileInputStream和FileOutputStream是对二进制数和字符的读写,使用的时候不是很方便,一般都会在外层套用一个包装类
- 代码示例
//Reader的子类BufferedReader的对象创建
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("F:/javaFileTest/test.txt")));
//Writer的子类BufferedWriter的对象的创建
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:/javaFileTest/test.txt")));
- 分析
- BufferedWriter:使用默认缓冲区大小从字符文件中读取文本。
- InputStreamReader:是从字节流到字符流的桥接器:它使用指定的charset读取字节并将其解码为字符。
- FileInputStream:用于读取诸如图像数据的原始字节流。