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程序,输入流用来读取数据,输出流用来写数据。

以下是输入流与输出流的类层次图

java 推流并保存 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:用于读取诸如图像数据的原始字节流。