File

File是文件和路径名的抽象表示,File封装的并不是一个真正存在的文件,是一个路径名,可以存在也可以不存在

常用方法:

  • 创建文件:createNewFile()
  • 创建目录:mkdir()
  • 创建多级目录:mkdirs()
  1. import java.io.File;
  2. import java.io.IOException;
  3. public class FileDemo {
  4. public static void main(String[] args) throws IOException {
  5. // 最好不要这样写,如果创建文件,最好指明文件类型
  6. // File f1 = new File("D:\\javaee.txt");
  7. File f1 = new File("D:\\javaee.txt");
  8. System.out.println(f1.createNewFile());
  9. File f2 = new File("D:\\javaee");
  10. System.out.println(f2.mkdir());
  11. File f3 = new File("D:\\JavaSe\\java");
  12. System.out.println(f3.mkdir());
  13. File f4 = new File("D:\\JavaSe\\java");
  14. System.out.println(f4.mkdirs());
  15. }
  16. }

File类别判断和获取功能:

  • isDirectory:测试此抽象路径名表示的File是否为目录
  • isFile:是否为文件
  • exists:是否存在
  • getAbsolutePath:绝对路径名字符串
  • getPath:路径名字符串
  • getName:文件或目录的名称
  • list:目录中的文件和目录的名称字符串数组
  • listFiles:目录中的文件和目录的File对象数组
  1. import java.io.File;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. File f = new File("C:\\Users\\yourname\\Desktop\\code\\java_project");
  5. boolean exists = f.exists();
  6. System.out.println(exists);
  7. System.out.println(f.isFile());
  8. System.out.println(f.isDirectory());
  9. System.out.println(f.getAbsolutePath());
  10. System.out.println(f.getPath());
  11. System.out.println(f.getName());
  12. System.out.println(f.list());
  13. System.out.println(f.listFiles());
  14. String[] file_list = f.list();
  15. for(String s:file_list){
  16. System.out.println(s);
  17. }
  18. File[] listFiles = f.listFiles();
  19. for(File x:listFiles){
  20. System.out.println(x);
  21. }
  22. }
  23. }

File有了list方法,但是还是有listFiles方法,这时因为list生成的就是String,而listFiles生成的File对象,这样还可以继续使用File中的方法

删除目录时注意事项:如果一个目录中有内容(目录,文件),不能直接删除,而应该先删除目录中的内容

递归

递归指的是方法定义中调用方法本身的现象

递归需要有递归出口和递归规则

递归求5的阶乘的过程:

题目:

  1. import java.io.File;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. File file = new File("C:\\Users\\yourname\\Desktop\\code\\java_project");
  5. fileOutPut(file);
  6. }
  7. public static void fileOutPut(File f){
  8. if(f.isFile()){
  9. System.out.println(f.getAbsolutePath());
  10. }else{
  11. File[] files = f.listFiles();
  12. for(File file:files){
  13. fileOutPut(file);
  14. }
  15. }
  16. }
  17. }

IO流

流是一种抽象的概念,是对数据传输的总成,也就是说数据在设备间的传输成为流,流的本质是数据传输

IO流就是用来处理设备间数据传输问题的,如文件复制、文件上传、文件下载

分类:

  • 数据流向:输入流和输出流
  • 数据类型:字节流和字符流

可以读懂的就用字符流,读不懂的用字节流,不知道用什么就用字节流

字节流抽象基类:

  • InputStream:这个抽象类是表示字节输入流的所有类的超类
  • OutputStream:这个抽象类是表示字节输出流的所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀
  1. // FileOutputStream的write的三种写
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. public class Demo {
  6. public static void main(String[] args) throws IOException {
  7. FileOutputStream fos = new FileOutputStream("./My_File/demo.txt",true);
  8. fos.write(98);
  9. byte[] bys = "abcde".getBytes(StandardCharsets.UTF_8);
  10. fos.write(bys);
  11. fos.write(bys,1,3);
  12. fos.close();
  13. }
  14. }

如果想换行,则需要输入

文件名.write("\n".getBytes())

在ASCII码中,换行符为10

finally

在异常处理时提供finally块来执行所有清除操作,比如IO流中的释放资源

字节流读数据

  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. public class Demo {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream fis = new FileInputStream("./My_File/demo.txt");
  7. int by;
  8. while((by=fis.read())!=-1){
  9. System.out.print((char)by);
  10. }
  11. }
  12. }

字节流复制文件

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class Demo {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream fis = new FileInputStream("My_File/demo.txt");
  7. FileOutputStream fos = new FileOutputStream("My_File/src/demo6/demo.txt");
  8. int by;
  9. while((by=fis.read())!=-1){
  10. fos.write(by);
  11. }
  12. }
  13. }

字节数组读数据

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. public class Demo {
  4. public static void main(String[] args) throws IOException {
  5. FileInputStream fis = new FileInputStream("My_File/src/demo7/hello.txt");
  6. byte [] bys = new byte[5];
  7. // byte [] bys = new byte[20];
  8. int len = fis.read(bys);
  9. System.out.println("第一次读取情况:");
  10. System.out.println(len);
  11. // System.out.println(new String(bys));
  12. System.out.println(new String(bys,0,len));
  13. len = fis.read(bys);
  14. System.out.println("第二次读取情况:");
  15. System.out.println(len);
  16. // System.out.println(new String(bys));
  17. System.out.println(new String(bys,0,len));
  18. len = fis.read(bys);
  19. System.out.println("第三次读取情况:");
  20. System.out.println(len);
  21. // System.out.println(new String(bys));
  22. System.out.println(new String(bys,0,len));
  23. }
  24. }

实际上用字节数组读数据为改进的代码:

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. public class Demo {
  4. public static void main(String[] args) throws IOException {
  5. FileInputStream fis = new FileInputStream("My_File/demo.txt");
  6. byte [] bys = new byte[1024];
  7. int read;
  8. while((read=fis.read(bys))!=-1){
  9. System.out.println(new String(bys,0,read));
  10. }
  11. }
  12. }

注意,如果是直接读,返回的是读出的值,int类型

如果是读字节,那么把读出的数据存储到byte中,返回的是读出的长度,int类型

复制图片:

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class Demo {
  5. public static void main(String[] args) throws IOException {
  6. FileOutputStream fos = new FileOutputStream("My_File/src/demo9/mn.jpg");
  7. FileInputStream fis = new FileInputStream("mn.jpg");
  8. byte [] bys = new byte[1024];
  9. int len;
  10. while((len=fis.read(bys))!=-1){
  11. fos.write(bys);
  12. }
  13. fis.close();
  14. fos.close();
  15. }
  16. }

字节缓冲流:

字节缓冲输出流可以向底层输出流写入字节,而不必为写入的每个字节导致系统底层的调用

字节缓冲输入流和字节缓冲输出流差不多,都是为了提高效率的

  1. import java.io.*;
  2. import java.nio.charset.StandardCharsets;
  3. public class Demo {
  4. public static void main(String[] args) throws IOException {
  5. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("My_File/src/demo10/demo.txt"));
  6. bos.write("Hello".getBytes(StandardCharsets.UTF_8));
  7. bos.write(97);
  8. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("My_File/src/demo10/demo.txt"));
  9. byte [] bys = new byte[1024];
  10. int len;
  11. while((len=bis.read(bys))!=-1){
  12. System.out.println(new String(bys,0,len));
  13. }
  14. bis.close();
  15. bos.close();
  16. }
  17. }

如果像我这样写,是不会有输出的,因为先写,并且都还没关闭文件,也就是还没结束写的过程就去读,是不会有结果的,可以把bos.close()放到bis开始前

为什么有字符流,因为例如汉字之类的可能直接输出会出现乱码

  1. // My_File/demo.txt文件中有汉字
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. public class Demo {
  6. public static void main(String[] args) throws IOException {
  7. FileInputStream fis = new FileInputStream("My_File/demo.txt");
  8. // 读方法一
  9. /*
  10. int read;
  11. while((read = fis.read())!=-1){
  12. System.out.println((char)read);
  13. }
  14. */
  15. // 读方法二
  16. byte [] bys = new byte[1024];
  17. int len;
  18. while((len=fis.read(bys))!=-1){
  19. System.out.println(new String(bys,0,len));
  20. }
  21. fis.close();
  22. }
  23. }

用方法一即一个字节一个字节读取会出现乱码,而用字节数组则不会有这样的问题

字符流=字节流+编码表

上述过程包含了解码问题,new String的时候按照默认的UTF-8进行了解码

对上述代码换成字符流进行读取

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. public class DemoModify {
  5. public static void main(String[] args) throws IOException {
  6. InputStreamReader isr = new InputStreamReader(new FileInputStream("My_File/demo.txt"));
  7. int ch;
  8. while((ch=isr.read())!=-1){
  9. System.out.print((char)ch);
  10. }
  11. }
  12. }

同样是读read(),但是前面的字节流会乱码,而字符流不会

这时因为字符流中的read一次读一个字符,而默认的UTF-8是一个字符对应3个字节(汉字),然后解码出来就是正常的汉字

  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import java.io.OutputStreamWriter;
  4. public class Test {
  5. public static void main(String[] args) throws IOException {
  6. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test.txt"));
  7. osw.write(97);
  8. // 如果使用了close,那么不需要使用flush
  9. osw.flush();
  10. osw.close();
  11. }
  12. }

字符流复制文件

  1. import java.io.*;
  2. public class Demo {
  3. public static void main(String[] args) throws IOException {
  4. InputStreamReader isr = new InputStreamReader(new FileInputStream("My_File/src/demo12/Test.java"));
  5. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("My_File/src/demo13/Test.java"));
  6. // 一次读一个字符
  7. /*
  8. int len;
  9. while((len=isr.read())!=-1){
  10. osw.write(len);
  11. }
  12. */
  13. // 一次读一个字符数组
  14. char [] ch = new char[1024];
  15. int len;
  16. while((len=isr.read(ch))!=-1){
  17. osw.write(ch,0,len);
  18. }
  19. isr.close();
  20. osw.close();
  21. }
  22. }

在上面介绍的字符流中,InputStreamReaderOutputStreamWriter有编码解码功能,其子类FileReaderFileWriter没有这两个功能,但是简洁很多,而且构造方法中,不用传入InputStreamOutputStream,可以直接传入字符串或者文件

字符缓冲流

  • BufferedWriter(writer out)
  • BufferedReader(Reader in)

字符缓冲流特有功能

  • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
  • public String readLine():读一行文字,结果包含行的内容的字符串,不包括任何终止字符,如果到达结尾,则为null

用自己的话对文件内容小结:

  • 首先是File类,File类创建的是一个文件对象,可以进行createNewFilemkdirmkdirs,并且还有listlistFilesisDirectorygetName等函数
  • 然后是字节流,字节流中,可以直接传入文件名的字符串,这样write时会自动创建文件
  • 字节流中,可以一次读一个字节,或者一次读一个字节数组,读字节数组时,建议输出时加上0,len这样的内容,不然会出现空值
  • 字节流每次调用都会使用系统底层的东西,建议使用缓冲字节流,缓冲字节流创建时是stream类型的,要注意下
  • 接着是字符流,字符流是字节流+编码方式,当然也可以继续用字节流中的字节数组读取,这样会有解码,也可以使用字符流,但是注意构造方法传入的参数,FileReaderFileWriter都可以直接传入字符串

复制单级文件夹

  1. import java.io.*;
  2. public class Demo {
  3. public static void main(String[] args) throws IOException {
  4. // 将My_File/src/demo7文件复制到D:Java_Content中,如果不存在文件夹则创建
  5. File src_file = new File("My_File/src/demo7");
  6. String src_fileName = src_file.getName();
  7. File dest_File = new File("D:/Java_Content",src_fileName);
  8. dest_File.mkdirs();
  9. File[] src_files = src_file.listFiles();
  10. for(File file:src_files){
  11. String fileName = file.getName();
  12. File dest_file = new File(dest_File,fileName);
  13. copyFile(file,dest_file);
  14. }
  15. }
  16. private static void copyFile(File file, File dest_file) throws IOException {
  17. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  18. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest_file));
  19. byte [] bys = new byte[1024];
  20. int len;
  21. while((len=bis.read(bys))!=-1){
  22. bos.write(bys,0,len);
  23. }
  24. }
  25. }

复制多级文件

  1. import java.io.*;
  2. public class Demo {
  3. public static void main(String[] args) throws IOException {
  4. // 将My_Set文件夹复制到D盘
  5. File src_folder = new File("My_Set");
  6. File dest_folder = new File("d:");
  7. copyFolder(src_folder,dest_folder);
  8. }
  9. private static void copyFolder(File src_folder, File dest_folder) throws IOException {
  10. if(src_folder.isDirectory()){
  11. String src_folderName = src_folder.getName();
  12. File new_folder = new File(dest_folder,src_folderName);
  13. if(!new_folder.exists()){
  14. new_folder.mkdirs();
  15. }
  16. File[] listFiles = src_folder.listFiles();
  17. for(File file:listFiles){
  18. copyFolder(file,new_folder);
  19. }
  20. }else{
  21. File dest_file = new File(dest_folder,src_folder.getName());
  22. copyContent(src_folder,dest_file);
  23. }
  24. }
  25. private static void copyContent(File src_folder, File dest_file) throws IOException {
  26. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src_folder));
  27. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest_file));
  28. byte [] bys = new byte[1024];
  29. int len;
  30. while((len=bis.read(bys))!=-1){
  31. bos.write(bys,0,len);
  32. }
  33. bis.close();
  34. bos.close();
  35. }
  36. }

Java学习笔记-基础语法Ⅸ-文件的更多相关文章

  1. Java学习笔记-基础语法Ⅳ

    多态:同一个对象,在不同时刻表现出来的不同形态 例如: 猫 cat = new 猫(); 动物 animal = new 猫(); 这里的猫在不同时刻表现出来不同的形态,这就是多态 多态的前提和体现: ...

  2. Java学习笔记-基础语法

    Java基础包含关键字,标识符,注释,常量和变量,运算符 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 Java的关键字 用于定义数据类型的关键 ...

  3. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  4. JAVA 学习笔记 - 基础语法1

    1. 类的定义 public class  与  class的区别 一个java文件只有一个public class, 而且类名必须与文件名一致. 一个java文件可以有多个class定义,javac ...

  5. Java学习笔记-基础语法ⅩⅠ-UDP、TCP

    网络编程 三要素:IP地址.端口.协议 IP地址:使用ipconfig查看,如果装了VM的话,会有VMnet1.VMnet8和WLAN,net1不能从虚拟机到主机,net8不能从主机到虚拟机,net0 ...

  6. Java学习笔记-基础语法Ⅷ-泛型、Map

    泛型 泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类.方法和接口中,分别为泛型类.泛型方法 ...

  7. Java学习笔记-基础语法Ⅴ

    学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...

  8. Java学习笔记-基础语法Ⅲ

    继承:子类使用extends来继承父类,子类可以有父类的内容,还可以有子类自己特有的内容 继承的好处: 提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要 ...

  9. JAVA 学习笔记 - 基础语法 2

    ---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null;             //在堆栈中申明变量名称 数组名称 =  new  数据类型[10];       // ...

随机推荐

  1. vulnhub靶机Tr0ll:1渗透笔记

    Tr0ll:1渗透笔记 靶场下载地址:https://www.vulnhub.com/entry/tr0ll-1,100/ kali ip:192.168.20.128 靶机和kali位于同一网段 信 ...

  2. jQ模拟打字效果插件typetype

    typetype是一个jquery插件,可以模拟人类的打字效果. 效果图如下所示: 查看演示 http://weber.pub/demo/160828/jQuery.Type/jQuery.type. ...

  3. 关于js中this指向的总结

    js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对 ...

  4. python计算项目净现值和内部回报率

     代码: import numpy as np from numpy import irr import warnings def project(number, period_list): rate ...

  5. CCF201609-2火车购票

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

  6. IDEA修改代码后不用重新启动项目即可刷新

    1.File--Settings--Build 2.Build,Execution,Deplyment--Compiler 3.选中打勾 "Build project automatical ...

  7. java基础-多线程-线程组

    线程组 * Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. * 默认情况下,所有的线程都属于主线程组.  * public fi ...

  8. IO流入门+简单案例实现

    IO流 总结内容 1. IO流是什么 2. 字符流和字节流 3. File常用API(前面类型为返回类型) 4. 编码转换 5. IO流实现流程 6. 输入输出流简单实现 7. 输入输出流简单实现 总 ...

  9. 在 Mac 上开发 .NET MAUI

    .NET 多平台应用程序 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用程序,这些应用程序可以从单个共享代码库在 Android.iOS.macO ...

  10. 【java】密码检查

    [问题描述] 开发一个密码检查软件,密码要求: 长度超过8位 包括大小写字母.数字.其它符号,以上四种至少三种 不能有相同长度超2的子串重复 [输入形式] 一组或多组长度超过2的子符串.每组占一行 [ ...