美文网首页
[java]11、文件

[java]11、文件

作者: 史记_d5da | 来源:发表于2021-10-10 21:02 被阅读0次

1、File

1、文件的分隔符和,路径分隔符

// 获取路径分隔符,文件分隔符
// 路径中的两个反斜杠代表一个反斜杠
System.out.println(File.pathSeparator);
System.out.println(File.separator);

2、文件路径打印

File fil1 = new File("C://a.txt");
System.out.println(fil1.toString());
// 路径分成两部分
File fil2 = new File("C://", "a.txt");
System.out.println(fil2.toString());
// 路径组合
File parent = new File("C://");
File file = new File(parent, "hello.java");
System.out.println(file.toString());

3、getAbsolutePath() 、getPath()

File file1 = new File("/Users/shiji/PacketTracer7/nets");
System.out.println(file1.getAbsolutePath()); // /Users/shiji/PacketTracer7/nets
// 获取当前文件夹下面nets文件路径
File file2 = new File("nets");
System.out.println(file2.getAbsolutePath()); // /Users/shiji/study/java/itcast/nets
// getPath()
File file3 = new File("/Users/shiji/PacketTracer7/nets");
System.out.println(file3.getPath()); // /Users/shiji/PacketTracer7/nets
// 获取当前文件夹下面nets文件路径
File file4 = new File("nets");
System.out.println(file4.getPath());  // nets
System.out.println(file4.toString()); // nets

// getName
File file5 = new File("/Users/shiji/PacketTracer7/nets");
System.out.println(file5.getName()); // nets
File file6 = new File("/Users/shiji/PacketTracer7");
System.out.println(file6.getName()); // PacketTracer7

4、length()、exists()、isDirectory()、isFile()

// Length
File file7 = new File("/Users/shiji/PacketTracer7/nets");
System.out.println(file7.length()); // 130字节
// 判断构造方法中路径是否存在
System.out.println(file7.exists()); // true
// 判断构造方法中给定的路径是否以文件夹结尾
System.out.println(file7.isDirectory()); // false
// 判断构造方法中给定的路径是否以文件结尾
System.out.println(file7.isFile()); // true

4、createNewFile()、mkdir()、mkdirs()

// 1、文件不存在创建文件返回true,否则返回false,
// 2、此方法只能创建文件不能创建文件夹
// 3、createNewFile 抛出IOException异常,路径不存在时抛出异常
File file8 = new File("/Users/shiji/PacketTracer7/1.txt");
System.out.println(file8.createNewFile()); // true
// 1、mkdir 单级文件夹
// 2、mkdirs 单级多级都可以创建
// 3、文件夹不存在返回 true,否则返回false
// 4、此方法只能创建文件夹不能创建文件
File file9 = new File("/Users/shiji/PacketTracer7/a");
System.out.println(file9.mkdir()); // true
File file10 = new File("/Users/shiji/PacketTracer7/b/c/d");
System.out.println(file10.mkdirs()); // true
// delete 删除文件或者目录
File file11 = new File("/Users/shiji/PacketTracer7/b/c/d");
System.out.println(file11.delete());

5、list()、listFiles()

// list() 返回一个string数组,返回目录中的所有子文件或目录
// File[] listFiles() 返回一个File文件数组,返回目录中的所有子文件或目录
File file12 = new File("/Users/shiji/PacketTracer7");
String[] arr = file12.list();
for (String fileName : arr) {
      System.out.println(fileName);
}
File file13 = new File("/Users/shiji/PacketTracer7");
File[] files = file13.listFiles();
for (File fileName : files) {
     System.out.println(fileName);
}

6、打印文件目录下面所有.txt文件

public class Demo01File {
    public static void main(String[] args) throws IOException {
        File file8 = new File("/Users/shiji/PacketTracer7");
        getAllFiles(file8);
    }
    public static void getAllFiles(File dir) {
        File files[] = dir.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                getAllFiles(f);
            } else  {
                String filename = f.getName();
                if (filename.endsWith(".txt"))
                    System.out.println(f.toString());
            }
        }
    }
}

2、文件过滤器

1、FileFilter

// 匿名类
File files[] = dir.listFiles(new FileFilter() {
       @Override
       public boolean accept(File pathname) {
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".txt");
       }
});

2、FilenameFilter

File files[] = dir.listFiles(new FilenameFilter() {
       @Override
       public boolean accept(File dir, String name) {
           return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".txt");
       }
});

3、IO字节流

1、OutputStream:字节输出流
1)、相关方法

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。
    2)、写入数据的原理(内存-->硬盘)
    java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中

构造方法的作用:

  • 创建一个FileOutputStream对象
  • 会根据构造方法中传递的文件/文件路径,创建一个空的文件
  • 会把FileOutputStream对象指向创建号的文件
public class Demo01OutputStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("/Users/shiji/study/java/itcast/day01-code/src/com/sj/IOAndProperties/a.txt");
        // 写数据的时候,会把10机制的整数97转换为二进制整数1100001
        // 记事本存储的是ASCII表中的a
        fos.write(97);
        fos.close();
    }
}

2)、追加写/续写:使用两个参数的构造方法

public class Demo03OutputStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("b.txt", true);
        for (int i = 0; i < 5; i++) { 
            fos.write("你好".getBytes());
            //换行符-- windows: \r\n  linux: \n  mac: \r
            fos.write("\r".getBytes());
        }
        fos.close();
    }
}

2、FileOutStream
1)、一次读取一个字节

public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        // a.txt   ===>  abc
        FileInputStream fis = new FileInputStream("a.txt");
        int len = 0;
        while ((len = fis.read()) != -1) {
            System.out.print((char) len);
        }
        fis.close();
    }
}

2)、一次读取多个字节

public class Demo02InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        // byte可以起到缓冲作用,一次读取多个字节
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = fis.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));
        }
        fis.close();
    }
}

4、IO字符流

字节流在读取中文时,可能会出现读取不完整的情况,出现乱码现象
1、FileReader
文件字符输入流
作用:把硬盘文件中的数据以字符的方式读取到内存中
java.io.FileReader extends InputStreamReader extends Reader

public class Demo02Reader {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("b.txt");
        char[] cs = new char[1024];
        int len = 0;
        while ((len = fr.read(cs)) != -1) {
            System.out.println(new String(cs, 0, len));
        }
        fr.close();
    }
}

2、FileWriter
文件字符输出流:把内存中的字符数据写入到文件中
java.io.FileWriter extends OutputStreamWriter extends Writer
使用步骤
1)、创建FileWriter对象,构造方法中绑定要写入数据的目的地
2)、使用FileWriter中的方法writer,把数据写入到内存缓冲区中(字符转换为字节的过程)
3)、使用flush,把内存缓冲区中数据,刷新到文件中,对象可以继续使用。
4)、释放资源(先刷新到缓存区中,然后通知系统释放资源,流对象不可用)

public class Demo03Writer {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("");
        fw.write(97); // 写入到内存缓冲区中
        fw.flush();
        fw.close(); // 也可以将数据写入到文件中
    }
}

try catch 处理

public class Demo01TryCatch {
    public static void main(String[] args) {
        //提高变量fw的作用域,让finally可以使用
        //变量在定义的时候,可以没有值,但是使用的时候必须有值
        //fw = new FileWriter("09_IOAndProperties\\g.txt",true); 执行失败,fw没有值,fw.close会报错
        FileWriter fw = null;
        try{
            //可能会产出异常的代码
            fw = new FileWriter("w:\\09_IOAndProperties\\g.txt",true);
            for (int i = 0; i <10 ; i++) {
                fw.write("HelloWorld"+i+"\r\n");
            }
        }catch(IOException e){
            //异常的处理逻辑
            System.out.println(e);
        }finally {
            //一定会指定的代码
            //创建对象失败了,fw的默认值就是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在把资源释放
            if(fw!=null){
                try {
                    //fw.close方法声明抛出了IOException异常对象,所以我们就的处理这个异常对象,要么throws,要么try catch
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDK7的异常处理情况

public class Demo02JDK7 {
    public static void main(String[] args) {
        try(//1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
            FileInputStream fis = new FileInputStream("c:\\1.jpg");
            //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
            FileOutputStream fos = new FileOutputStream("d:\\1.jpg");){
            //可能会产出异常的代码
            //一次读取一个字节写入一个字节的方式
            //3.使用字节输入流对象中的方法read读取文件
            int len = 0;
            while((len = fis.read())!=-1){
                //4.使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
                fos.write(len);
            }
        } catch (IOException e){
            //异常的处理逻辑
            System.out.println(e);
        }
    }
}

JDK9异常处理情况

public class Demo03JDK9 {
    public static void main(String[] args) throws IOException {
        //1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("c:\\1.jpg");
        //2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
        FileOutputStream fos = new FileOutputStream("d:\\1.jpg");

        try(fis;fos){
            //一次读取一个字节写入一个字节的方式
            //3.使用字节输入流对象中的方法read读取文件
            int len = 0;
            while((len = fis.read())!=-1){
                //4.使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
                fos.write(len);
            }
        }catch (IOException e){
            System.out.println(e);
        }
        //fos.write(1);//Stream Closed
    }
}

相关文章

网友评论

      本文标题:[java]11、文件

      本文链接:https://www.haomeiwen.com/subject/sgckoltx.html