一、File
File : 文件和目录路径名的抽象表示
注意 : java中路径分隔符可以使用/ // \
在使用相对路径时候,在java中默认根路径为当前所在项目根目录
File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建一个新的File实例。
File file1=new File("D://XZ//xiao.txt"); System.*out*.println(file1);
File(String parent, String child)
从父路径名字符串和子路径名字符串创建一个新的File实例。
File file2=new File("D://XZ"); System.*out*.println(file2); File file3=new File(file2,"xiao.txt"); System.*out*.println(file3);
File(File parent, String child)
从父抽象路径名和子路径名字符串创建一个新的File实例。
File file4=new File("D://XZ","xiao.txt"); System.*out*.println(file4); File file5=new File("xiao.txt"); System.*out*.println(file5);
boolean canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。
System.*out*.println(file1.canWrite());
boolean setReadOnly()
标记由此抽象路径名命名的文件或目录,以便只允许读取操作
System.*out*.println(file1.setReadOnly());*//T*System.*out*.println(file1.canWrite());
boolean createNewFile()
当且仅当具有此名称的文件尚不存在时,以原子方式创建以此抽象路径名命名的新的空文件。
File file6=new File("D://XZ//xiaofeixia.txt"); System.*out*.println(file6.createNewFile()); System.*out*.println(file5.createNewFile()); File file7=new File("src/xiaofeixia.txt"); System.*out*.println(file7.createNewFile());
boolean delete()
能够删除文件以及空文件夹 删除此抽象路径名表示的文件或目录。
System.*out*.println(file7.delete()); System.*out*.println(new File(file2,"BBB").delete());
boolean exists()
测试此抽象路径名表示的文件或目录是否存在
System.*out*.println(file1.exists()); System.*out*.println(new File(file2,"BBB").exists());
File getAbsoluteFile()
返回此抽象路径名的绝对形式。
System.*out*.println(file1.getAbsoluteFile());
String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
System.*out*.println(file1.getAbsolutePath());
long getFreeSpace() 通过此抽象路径名返回分区named中未分配的字节数。 long getTotalSpace() 通过此抽象路径名返回分区named的大小。 System.*out*.println(new File("D://").getFreeSpace()); System.*out*.println(new File("D://").getTotalSpace());
String getName() 返回此抽象路径名表示的文件或目录的名称。 System.*out*.println(file1.getName());
String getParent() 返回此抽象路径名的父目录的路径名字符串,如果此路径名未命名父目录,则返回null 。 System.*out*.println(file5.getParent());
File getParentFile() 返回此抽象路径名的父级的抽象路径名,如果此路径名未命名父目录,则返回null 。 System.*out*.println(file5.getParentFile());
boolean isAbsolute() 测试此抽象路径名是否是绝对的。 System.*out*.println(file1.isAbsolute());
boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。 System.*out*.println(file1.isDirectory());
二、IO流
1.IO流
读写文件内部的内容,上传下载,拷贝文件,拷贝文件夹
流:就是管道
以先入先出的方式进行流动
作用:做数据传输
数据源-->目的地
流的分类:(所有分类之间相辅相成)
按流向分:(以程序为中心)
输入流
输出流
按照操作单元:
字节流:万能流
字符流:操作纯文本文件
按照功能划分:
节点流:真实做读入写出的流
处理流|功能流:增强节点流的性能,提高节点流的性能
2.字节流
输入流:InputStream
根据数据源选择节点流:节点流
数据源为字节数组:ByteArrayInputStream字节数组输入流(了解)
数据源为文件:FileInputStream文件字节流
输出流:OutoutStream
步骤:
需求:从文件中读入数据到程序
文件:数据源-->程序:目的地
1) 构建文件字节流输入
FileInputStream(File file)通过打开与实际文件的连接来创建FileInputStream,该文件由系统中的File对象file命名
FileInputStream(String name)通过打开与实际文件的连接来创建FileInputStream,该文件由系统中的路径名name命名
FileInputStream is = new FileInputStream(new File("D://AAA/test2.txt"));
2)读入数据
int num = is.read();
3)使用数据
System.out.println((char)num); System.out.println((char)(is.read())); System.out.println((char)(is.read())); System.out.println(is.read()); 如果读到文件末尾返回-1
4)关闭
is.close();
优化 :
之前使用字节流每次读入一个字节数据,重复读入多次,重复读入的代码过于冗余,不够精简
可以通过循环结构简化重复读入的操作
1.与文件建立联系(数据源文件|目的地文件)
File src = new File("D://AAA/test2.txt");
2.构建流(文件字节输入流)
FileInputStream is = new FileInputStream(src);
3.读入数据
int num; while((num=is.read())!=-1){ • 4.使用数据 System.out.println((char)num); }
5.关闭
is.close();
优化 :
每次读入一个字节,循环读入多次,虽然代码简洁,但是效率较低
可以从每次读入一个字节数据变为每次读入一卡车字节数据
int read(byte[] b) 从输入流中读取一些字节并将它们存储到缓冲区数组b中
返回值 : 为每次读入到字节数组中数据的个数
1.与文件建立联系(数据源文件|目的地文件)
File src = new File("D://AAA/test2.txt");
2.构建流(文件字节输入流)
FileInputStream is = new FileInputStream(src);
3.读入数据
int len; 记录每次读入的数据个数 byte[] car = new byte[1024]; while((len=is.read(car))!=-1){ 4.使用数据 System.out.println(new String(car,0,len)); } byte[] readAllBytes() 从输入流中读取所有剩余字节 System.out.println((char)(is.read())); System.out.println(new String(is.readAllBytes()));
5.关闭
is.close();
异常捕获+资源关闭
jdk7下新增 : try-with-resources,对try中创建的资源在使用完毕之后进行关闭,要求资源的类型必须实现了
AutoCloseable接口
1.idk7之前 cry-->catch-->finally
声明
FileInputStream is = null;
try {
1.与文件建立联系(数据源文件|目的地文件)
2.构建流(文件字节输入流)
is = new FileInputStream("D://XZ/xiao.txt"); int len;记录每次读入的数据个数 byte[] car = new byte[1024]; while ((len = is.read(car)) != -1) { System.*out*.println(new String(car, 0, len)); } } catch (FileNotFoundException e) { e.printStackTrace();用于打印异常的堆栈信息 } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } }
2.jdk7新增 try----> with----->resources
try(FileInputStream is=new FileInputStream("D://XZ/xiao.txt")){ int len; byte[] car=new byte[1024]; while((len= is.read(car))!=-1){ System.out.println(new String(car,0,len)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
3.jdk9之前:
FileInputStream is= null; • try (FileInputStream is2=is){ • int len; • byte[] car=new byte[1024]; • while((len= is2.read(car))!=-1){ • System.*out*.println(new String(car,0,len)); • } • } catch (FileNotFoundException e) { • e.printStackTrace(); • } catch (IOException e) { • e.printStackTrace(); • }
4.jdk9新增:
try(is){ int len; byte[] car=new byte[1024]; while ((len= is.read(car))!=-1){ System.*out*.println(new String(car,0,len)); } }catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
字节输出流 :
OutputStream 这个抽象类是代表字节输出流的所有类的超类
根据目的地选择节点流 :
当目的地为字节数组 : ByteArrayOutputStream 字节数组输出流
当目的地为文件 : FileOutputStream 文件字节输出流
注意 : 如果目的地文件存在并且包含内容,写出默认覆盖,可以调用重载构造器,boolean append-->true追加
false覆盖
如果目的地文件不存在,系统会自动创建目的地文件,但是目的地文件所在路径(文件夹)不会自动创建
步骤:
需求 : 将程序中的数据写出到输出流中,流向目的地文件
1)与目的地文件建立联系
2)构建文件字节输出流
FileOutputStream os = new FileOutputStream("D://AAA/test2.txt"); 默认覆盖 FileOutputStream os = new FileOutputStream("D://AAA/test.txt",true); 追加
3)准备数据
byte data = 97; byte[] arr = "你好".getBytes();
4)写出数据
os.write(data); os.write(arr);
5)刷出
os.flush();
6)关闭
os.close();
异常捕获 FileOutputStream os= null; try { os = new FileOutputStream("D://XZ/xiao.txt",true); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { byte date=97; byte[] arr="你好呀".getBytes(); try { os.write(date); os.write(arr); os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); }