1.1、FileInputStream 通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等)。Java也提供了FileReader专门读取文本文件。

FileInputStream的构造方法:

  • FileInputStream(File file)------------从File对象的文件读入数据。
  • FileInputStream(String name)-------------从指定文件读入数据,这里要写具体文件路径。
  • public  int  available();  返回可以从输入流中读取的字节数目。
  • public  void  close();  关闭输入流。
  • 1.2、FileOutputStream 通过字节的方式写数据到文件中,适合所有类型的文件。

    FileOutputStream的构造方法:

  • FileOutputStream(File file)-------------向File对象的文件写入数据
  • FileOutputStream(File file,  boolean append);------向File对象的文件追加写入数据,当append的值为true时,向文件中写入的数据会追加到原数据的后面,否则会重写该文件的数据。默认为false。
  • FileOutputStream(String  path)-------------向指定文件写入数据
  • FileOutputStream(String path,  boolean append);--------向指定文件追加写入数据。
  • 常用方法:

  • public void write( int b);   向文件中写入一个字节大小的数据
  • public void write( byte[] b);   将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • public void write( byte[] b, int off, int len);   指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
  • public void close();  关闭输出流。
  • public void flush();   强制将缓冲区的数据写入到输出流中。
  • 1.3、ByteArrayInputStream

    字节数组输入流在内存中创建一个字节数组缓冲区,从内存中的字节数组中读取数据。

    创建字节数组输入流对象有以下几种方式。

    接收字节数组作为参数创建:

    ByteArrayInputStream bArray = new ByteArrayInputStream(byte [] a);
    ByteArrayInputStream bArray = new ByteArrayInputStream(byte []a, 
                                                           int off, 
                                                           int len)

    1.4、ByteArrayOutputStream类

    字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。创建字节数组输出流对象有以下几种方式。

    // 下面的构造方法创建一个32字节(默认大小)的缓冲区。
    OutputStream bOut = new ByteArrayOutputStream();
    // 另一个构造方法创建一个大小为 a 字节的缓冲区。
    OutputStream bOut = new ByteArrayOutputStream(int a)

    1.5、BufferedInputStream

    BufferedInputStream 继承于FilterInputStream,提供缓冲输入流功能。缓冲输入流相对于普通输入流的优势是,它提供了一个缓冲数组,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源(譬如文件)读取速度快

    //构造方法
    BufferedInputStream(InputStream in)
    // 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个长度为 size 的内部缓冲区数组并将其存储在 buf 中。 BufferedInputStream(InputStream in,
    int size) //下一字节是否可读 synchronized int available() //关闭 void close() //标记, readlimit为mark后最多可读取的字节数 synchronized void mark(int readlimit) //是否支持mark, true boolean markSupported() //读取一个字节 synchronized int read() //读取多个字节到b synchronized int read(byte[] b, int off, int len) //重置会mark位置 synchronized void reset() //跳过n个字节 synchronized long skip(long n)
     public static void main(String[] args) throws Exception {  
            // 指定要读取文件的缓冲输入字节流  
            BufferedInputStream in = new BufferedInputStream(new FileInputStream("F:\\test.jpg"));  
            File file = new File("E:\\test.jpg");  
            if (file != null) {  
                file.createNewFile();  
            // 指定要写入文件的缓冲输出字节流  
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));  
            byte[] bb = new byte[1024];// 用来存储每次读取到的字节数组  
            int n;// 每次读取到的字节数组的长度  
            while ((n = in.read(bb)) != -1) {  
                out.write(bb, 0, n);// 写入到输出流  
            out.close();// 关闭流  
            in.close();  
    

    1.6、BufferedOutputStream

    //创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    public BufferedOutputStream(OutputStream out);
    //创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
    public BufferedOutputStream(OutputStream out,int size);
    //向输出流中输出一个字节
    public void write(int b);
    //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
    public void write(byte[] b,int off,int len);
    //刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。
    public void flush();

     3:   File类操作文件的常用方法:

              3-1: 文件夹或文件的创建:        

    1  //获取File对象
    2         File file = new File("E:\\file");
    3         //创建单个文件夹
    4         boolean mkdir = file.mkdir();
    5         System.out.println(mkdir);
    6         //创建多层级的文件夹的:
    7         File file1 = new File("e:\\file\\demo1\\demo2\\demo3");
    8         boolean mkdirs = file1.mkdirs();
    9         System.out.println(mkdirs);
    //创建文件:
               boolean newFile = file.createNewFile();

                   删除文件或者文件夹:                 

    2        File file = new File("test2.txt");
    4         boolean delete = file.delete();
    6         System.out.println(delete);

                   文件或文件夹的重命名:

            File file = new File("OnlyFileTest/test.txt");
    //路径相同为重命名,路径不同为剪切并重命名: File file1
    = new File("OnlyFileTest/Demo2.txt"); boolean demo2 = file.renameTo(file1); System.out.println(demo2);

                  File类的判断功能:            

              File file = new File("OnlyFileTest/test.txt");
           //判断是否是文件夹:
    boolean directory = file.isDirectory(); //判断是否是文件: boolean file2 = file.isFile();
    //判断是否存在:
    boolean exists = file.exists();

                   File类的获取功能:

      File file = new File("OnlyFileTest/test.txt");
            //获取文件的名字:
           String name = file.getName();
             //获取文件的绝对路径:
            String absolutePath = file.getAbsolutePath();
            //获取文件的相对路径:
            String path = file.getPath();
            //获取文件的长度,字节数;
            long length = file.length();
            //获取文件最后一次修改的毫秒值:
            long l = file.lastModified();

                     高级获取功能:

     File file = new File("OnlyFileTest/test.txt");
            //获取指定目录下所有文件或者文件夹名称的数组:
            String[] list = file.list();
            //获取指定目录下所有文件或则文件夹的File数组:
            File[] files = file.listFiles();

    案例:输出指定目录下以 .jpg 结尾的所有文件:

    * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称 * 分析: * A:封装e判断目录 * B:获取该目录下所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象,然后判断 * D:是否是文件 * 是:继续判断是否以.jpg结尾 * 是:就输出该文件名称 * 否:不搭理它 * 否:不搭理它 public class FileDemo { public static void main(String[] args) { // 封装e判断目录 File file = new File("e:\\"); // 获取该目录下所有文件或者文件夹的File数组 File[] fileArray = file.listFiles(); // 遍历该File数组,得到每一个File对象,然后判断 for (File f : fileArray) { // 是否是文件 if (f.isFile()) { // 继续判断是否以.jpg结尾 if (f.getName().endsWith(".jpg")) { // 就输出该文件名称 System.out.println(f.getName()); View Code * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称 * A:先获取所有的,然后遍历的时候,依次判断,如果满足条件就输出。 * B:获取的时候就已经是满足条件的了,然后输出即可。 * 要想实现这个效果,就必须学习一个接口:文件名称过滤器 * public String[] list(FilenameFilter filter) * public File[] listFiles(FilenameFilter filter) public class FileDemo2 { public static void main(String[] args) { // 封装e判断目录 File file = new File("e:\\"); // 获取该目录下所有文件或者文件夹的String数组 // public String[] list(FilenameFilter filter) String[] strArray = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // return false; // return true; // 通过这个测试,我们就知道了,到底把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false // 所以,这个的true或者false应该是我们通过某种判断得到的 // System.out.println(dir + "---" + name); // File file = new File(dir, name); // // System.out.println(file); // boolean flag = file.isFile(); // boolean flag2 = name.endsWith(".jpg"); // return flag && flag2; return new File(dir, name).isFile() && name.endsWith(".jpg"); // 遍历 for (String s : strArray) { System.out.println(s); View Code

                递归遍历出所有以  .java  结尾的文件:

    * 需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。 * 分析: * A:封装目录 * B:获取该目录下所有的文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D:判断该File对象是否是文件夹 * 是:回到B * 否:继续判断是否以.java结尾 * 是:就输出该文件的绝对路径 * 否:不搭理它 public class FilePathDemo { public static void main(String[] args) { // 封装目录 File srcFolder = new File("E:\\JavaSE"); // 递归功能实现 getAllJavaFilePaths(srcFolder); private static void getAllJavaFilePaths(File srcFolder) { // 获取该目录下所有的文件或者文件夹的File数组 File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象 for (File file : fileArray) { // 判断该File对象是否是文件夹 if (file.isDirectory()) { getAllJavaFilePaths(file); } else { // 继续判断是否以.java结尾 if (file.getName().endsWith(".java")) { // 就输出该文件的绝对路径 System.out.println(file.getAbsolutePath()); View Code