IO流知识点

IO流

1.File类

        java.io.File 类是⽂件和⽬录路径名的抽象表示,主要⽤于⽂件和⽬录的创建、查找和删除等 操作。

1.1构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新 的 File 实例。
  • public File(String parent, String child) :从⽗路径名字符串和⼦路径名字符串创建 新的 File 实例。
  • public File(File parent, String child) :从⽗抽象路径名和⼦路径名字符串创建新的 File 实例

注:

  1. File类创建的对象代表硬盘中实际存在的一个文件或者目录 ,但这个文件或者目录的是否真的存在不影响对象的创建。
// ⽂件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// ⽂件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通过⽗路径和⼦路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过⽗级File对象和⼦路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

 2.2 获取路径的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • public String getPath() :将此File转换为路径名字符串。
  • public String getName() :返回由此File表示的⽂件或⽬录的名称。
  • public long length() :返回由此File表示的⽂件的⻓度。
  • public boolean exists() :此File表示的⽂件或⽬录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为⽬录。
  • public boolean isFile() :此File表示的是否为⽂件。
public class FileGet {
 public static void main(String[] args) {
 File f = new File("d:/aaa/bbb.java");
 System.out.println("⽂件绝对路径:" + f.getAbsolutePath());
 System.out.println("⽂件构造路径:" + f.getPath());
 System.out.println("⽂件名称:" + f.getName());
 System.out.println("⽂件⻓度:" + f.length() + "字节");
 File f2 = new File("d:/aaa");
 System.out.println("⽬录绝对路径:" + f2.getAbsolutePath());
 System.out.println("⽬录构造路径:" + f2.getPath());
 System.out.println("⽬录名称:" + f2.getName());
 System.out.println("⽬录⻓度:" + f2.length());
 }
}
输出结果:
⽂件绝对路径:d:\aaa\bbb.java
⽂件构造路径:d:\aaa\bbb.java
⽂件名称:bbb.java
⽂件⻓度:636字节
⽬录绝对路径:d:\aaa
⽬录构造路径:d:\aaa
⽬录名称:aaa
⽬录⻓度:4096

2.3 创建删除查询方法

  • public boolean createNewFile() :当且仅当具有该名称的⽂件尚不存在时,创建⼀个新 的空⽂件。
  • public boolean delete() :删除由此File表示的⽂件或⽬录。
  • public boolean mkdir() :创建由此File表示的⽬录。
  • public boolean mkdirs() :创建由此File表示的⽬录,包括任何必需但不存在的⽗⽬录。
// ⽂件的创建
 File f = new File("aaa.txt");
 System.out.println("是否存在:" + f.exists()); // false
 System.out.println("是否创建:" + f.createNewFile()); // true
 System.out.println("是否存在:" + f.exists()); // true
  •  public String[] list() :返回⼀个String数组,表示该File⽬录中的所有⼦⽂件或⽬录。
  • public File[] listFiles() :返回⼀个File数组,表示该File⽬录中的所有的⼦⽂件或⽬录。
 File dir = new File("d:\\java_code");
// 获取当前⽬录下的⽂件以及⽂件夹的名称。
 String[] names = dir.list();
 for (String name : names) {
 System.out.println(name);
 }
 // 获取当前⽬录下的⽂件以及⽂件夹对象,只要拿到了⽂件对象,那么就可以获取更多
信息
 File[] files = dir.listFiles();
 for (File file : files) {
 System.out.println(file);
 }

IO流的概念及分类

根据数据的流向分为:输⼊流和输出流。

  • 输⼊流 :把数据从 其他设备 上读取到 内存 中的流。
  • 输出流 :把数据从 内存 中写出到 其他设备 上的流。

格局数据的类型分为:字节流和字符流。

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。

IO流的选择

  1.  要不要读内容 - 要(看得懂) - 缓冲字符流
  2.  要不要读内容 - 不要(不需要看得懂) - 字节流

 2. 字节流

作用:主要用于文件的复制;当控制台中输出的文件内容不需要看得懂,则采用字节流

2.1 字节输入流    FileInputStream

FileInputStream是抽象类InputStream的一个实现类

最底层的单位,有很多的子类,最简单的是FileInputStream,

FileInputStream 类是⽂件输⼊流,从⽂件中读取字节。

   构造方法:

  • FileInputStream(File file) :通过打开与实际⽂件的连接来创建⼀个 FileInputStream ,该⽂件由⽂件系统中的 File对象 file命名。
  • FileInputStream(String name) :通过打开与实际⽂件的连接来创建⼀个 FileInputStream ,该⽂件由⽂件系统中的路径名 name命名。

当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有该⽂件,会抛出 FileNotFoundException 。

⼩贴⼠:

     使⽤数组读取,每次读取多个字节,减少了系统间的IO操作次数,从⽽提⾼了读写的效 率,建议开发中使⽤。

 // 使⽤File对象创建流对象
 File file = new File("a.txt");
 FileInputStream fos = new FileInputStream(file);
 // 使⽤⽂件名称创建流对象
 FileInputStream fos = new FileInputStream("b.txt");
 }

 常用方法:

  • int read( ):每次可以读取⼀个字节的数据,提升为int类型,读取到⽂件末尾, 返回 -1
  • int red(byte[] b):read ⽅法,每次可以读取⼀个字节的数据,提升为int类型,读取到⽂件末尾, 返回 -1
  • public void close() :关闭此输⼊流并释放与此流相关联的任何系统资源。

⼩贴⼠:

        1. 虽然读取了⼀个字节,但是会⾃动提升为int类型。
        2. 流操作完毕后,必须释放系统资源,调⽤close⽅法,千万记得。

2.2 字节输出流 FileOutputStream

        抽象类OutputStream 有很多⼦类,我们从最简单的⼀个⼦类开始。 java.io.FileOutputStream 类是⽂件输出流,⽤于将数据写出到⽂件。

构造方法:

  • FileOutputStream(File file,,boolean) :创建⽂件输出流以写⼊由指定的 File对象表示的 ⽂件。
  • FileOutputStream(String name,,boolean) :创建⽂件输出流以指定的名称写⼊⽂件。

当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有这个⽂件,会创建该⽂ 件。如果有这个⽂件,会清空这个⽂件的数据。

 常用的方法:

  • write(int b) ⽅法,每次可以写出⼀个字节数据
  • write(byte[] b) ,每次可以写出数组中的数据
  • write(byte[] b, int off, int len) ,每次写出从off索引开 始,len个字节

 2.2 缓冲字节输入流  BufferedInputSream

以字节输出流为基础

作用:缓冲字节流提升效率

构造方法

  • BufferedInputStream(InputStream str ):创建一个缓冲字符流对象
new BufferedInputStream(new FileInputStream(filename/file))

方法:跟字节输入流一样

2.4 缓冲字节输出流 BufferedOutputStream

以字节输出流为基础

作用:缓冲字节流提升效率

构造方法:

  • BufferedOutputStream(InputStream s):创建缓冲字节输出流
    new BufferedInputStream(new FileInputStream(filename/file,boolean))

这两个构造⽅法,参数中都需要传⼊⼀个boolean类型的值, true 表示追加数据, false 表示 清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了。

 3.字符流

作用:以字符为 单位读写数据,专⻔⽤于处理⽂本⽂件

3.1 字符输入流 InputStreamReder

        字符流: 以字节流为基础的, 作用就是为了创建缓冲字符流

构造方法:   

  •  new InputStreamReader(inputStream, charset) : 参数为一个字节流,并且可以设置字符集

方法:

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() :从输⼊流读取⼀个字符。返回-1,文件结束
  • public int read(char[] cbuf) :从输⼊流中读取⼀些字符,并将它们存储到字符数组 cbuf 中 。
      返回-1
new InputStreamReader(new FileInputStream(file/filename),charset)

 注:在后面添加charset可以转化成自己需要的字符集,来改变字符集

3.2字符输出流  OutputStreamReade

构造方法:

  •   new OutputStreamReader(outputStream, charset) :

方法:

  • write(int b) :每次可以写出⼀个字符数据
  •  write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次 可以写出字符数组中的数据,⽤法类似FileOutputStream
  • write(String str) 和 write(String str, int off, int len) ,每次可以 写出字符串中的数据

4. 缓冲字符流

以字符流为基础,先把数据存到缓冲区再处理,但除了自动刷新的方法以外,其他的必须要刷新

否则出现读不出来或者写不出来的情况

 4.1 缓冲字符输入流  BufferedReader

字符输入流为基础

构造方法:

  • BufferedReader(reader):上传一个字符输入流对象

方法:

  • String  readLine(): 通常读完一行, 都是要解析的/处理的,读到文件末尾时,返回null值
new BufferedReader(new InputStreamReader(new FileInputStream(file/filename)))

4.2 缓冲字符输出流  PrintWriter

以字符输出流为基础

构造方法:

  • PrintWriter(writer, boolean autoFlush)  :上传一个字符输出流对象,true,false来决定是否自动刷新

构造方法

  • print(): 需要手动刷新
  • println(): 会自动刷新
  • void flush() :刷新该流的缓冲。
  • void close() :关闭此流,但要先刷新它。
new PrintWriter(new OutputStreamReader(new FileOutputStream(file/filename)),boolean  autoFlush)

注:

  1. autoFlush只对println()有效,print()仍需要手动刷新flush(),否则输出的文件中将没有任何内容
  2. IO流需要注意关闭输出流,关闭资源

 1. 虽然参数为int类型四个字节,但是只会保留⼀个字符的信息写出。

2. 未调⽤close⽅法,数据只是保存到了缓冲区,并未写出到⽂件中。

    字节 -> 字符: 解码
    字符 -> 字节: 编码

4. 对象流

作用:把一个对象以具有对象特征的形式存储到文件中 或者文件中读取对象继续使用

前提:必须可序列化 ,要固定类的版本号

  • ObjectInputStream():
       Object readObject() ,一个对象一个对象的读
  • ObjectOutputStream(): 
       writeObject() 一个对象一个对象的写

4.1 序列化: Serializable

作用:可序列化的类对象才能转换成字节,从而实现读写

Serializable接口,是可序列化接口,只要实现Serializable的类才能序列化

    对象 -> 字节: 序列化 -> 文件: 持久化
    字节 -> 对象: 反序列化
    transient: 修饰的属性值不会被序列化
    serialVersionUID: 固定类的版本号
        如果不固定, 会自动生成, 会随着类的内容改变, 而改变
        public static final long serialVersionUID = xxxL;

5.JavaBean规范:

  1.  无参构造器
  2.  属性, 提供get/set
  3.  实现序列化接口
  4.  基本数据类型使用包装类
  5.  不能用final修饰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值