JavaIO流的简单笔记

1.java.io.File类
  构造方法:public File(String pathname):给定路径名字创建File实例
  public File(String parent, String child):从父路径名>字符串和子路径创建
  public File(File parent, String child):从父抽象路径名和子路径创建
  1.1、获取文件和目录基本信息的方法
    - `public String getName()` :返回由此File表示的文件或目录的名称。
    - `public long length()` :返回由此File表示的文件的长度。
    - ` public String getPath() ` :将此File转换为路径名字符串。
    - `public long lastModified()`:返回File对象对应的文件或目录的最后
  1.2、路径问题
    - ` public String getPath() ` :将此File转换为路径名字符串。
    - `public String getAbsolutePath() ` :返回此File的绝对路径名字符串。
    - `String getCanonicalPath()`:返回此File对象所对应的规范路径名。
  1.3、判断功能
    - `public boolean exists()` :此File表示的文件或目录是否实际存在。
    - `public boolean isDirectory()` :此File表示的是否为目录。
    - `public boolean isFile()` :此File表示的是否为文件。
    - `public isAbsolute()`:判断File对象对应的文件或目录是否是绝对路径
    - `public boolean canRead()`:判断File对象对应的文件或目录是否可读
    - `public boolean canWrite()`:判断File对象对应的文件或目录是否可写
    - `public boolean isHidden()`:判断File对象对应的文件或目录是否是否隐藏
  1.4、创建删除功能
    - `public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    - `public boolean delete()` :删除由此File表示的文件或目录。 只能删除空目录。
    - `public boolean mkdir()` :创建由此File表示的目录。
    - `public boolean mkdirs()` :创建由此File表示的目录,包括任何必需但不存在的父目录。
  1.5、创建和删除临时文件
    -`public void deleteOnExit()`:当退出JVM时,删除文件,一般用于删除临时文件,一旦请求,无法取消。
    - public static File createTempFile(String prefix,String suffix) throws IOException在默认临时文件目录中创建一个空文件,
   使用给定前缀和后缀生成其名称。调用此方法等同于调用 createTempFile(prefix, suffix, null)。
    - prefix - 用于生成文件名的前缀字符串;必须至少三个字符。
    - suffix - 用于生成文件名的后缀字符串;如果为 null,默认为 ".tmp"
    - public static File createTempFile(String prefix,String suffix,File directory)throws IOException在指定目录中创建一个新的空文件,
   使用给定的前缀和后缀字符串生成其名称。
    - prefix - 用于生成文件名的前缀字符串;必须至少三个字符。
    - suffix - 用于生成文件名的后缀字符串;如果为 null,默认为 ".tmp"
    - directory - 将创建的文件所在的目录;如果使用默认临时文件目录,则该参数为 null
  1.6、重命名
    - `public boolean renameTo(File dest)`:重命名文件或目录
  如果是重命名文件,那么重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,
  该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。
  1.7、目录的遍历
    - `public String[] list()` :返回一个String数组,表示该File目录中的所有子文件或目录。
    - `public File[] listFiles()` :返回一个File数组,表示该File目录中的所有的子文件或目录。
    - `public File[] listFiles(FileFilter filter)`:返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。
  否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
    - `public File[] listFiles(FilenameFilter filter)`:返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。
  否则,当且仅当在路径名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
    - `public static File[] listRoots()`:列出可用的文件系统根。
2.IO流
  2.1、IO分类
  All:InputStream,OutputStream,Reader,Writer,FileInputStream FileOutputStrean FileReader FileWriter,StringReader StringWriter,
ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter , PipedInputStream、PipedOutputStream、PipedReader、PipedWriter,
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter,InputStreamReader、OutputStreamReader,DataInputStream、DataOutputStream
ObjectInputStream、ObjectOutputStream
  输入流:把数据从其他设备读取到内存中的流。InputStream ,Reader
  输出流:把数据从内存写入设备的流。OutputStream, Write

  字节流:以字节为单位,读写数据的流。InputStream,OutputStream
  字符流:以字符为单位。。。。。。。。Reader,Writer

  节点流:从特定的地方(节点)读写数据。FileReader,FileWriter。FileInputStream,FileOutputStream等
  处理流:是对一个已存在的流进行连接和封装,通过所封装的流的功能调用实现数据读写。BufferedReader等
  (字节流和字符流)
  2.2顶级抽象父类之字节流
    2.2.1字节输出流(OutputStream)
  `java.io.OutputStream `抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。
它定义了字节输出流的基本共性功能方法。
     - `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.2.2字节输出流的子类之一(FileOutputStream)
    构造方法:
    - `public FileOutputStream(File file)`:创建文件输出流以写入由指定的 File对象表示的文件。
    - `public FileOutputStream(String name)`: 创建文件输出流以指定的名称写入文件。
  当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。
  如果有这个文件,会清空这个文件的数据。
    写出字节数据:
      1、写出字节:`write(int b)` 方法,每次可以写出一个字节数据,
      2、写出字节数组:`write(byte[] b)`,每次可以写出数组中的数据
      3、写出指定长度字节数组**:`write(byte[] b, int off, int len)` ,每次写出从off索引开始,len个字节
  数据追加续写(保留数据后添加数据的方法):
    - `public FileOutputStream(File file, boolean append)`: 创建文件输出流以写入由指定的 File对象表示的文件。
    - `public FileOutputStream(String name, boolean append)`: 创建文件输出流以指定的名称写入文件。
    写出换行(*.write("\r\n".getBytes());)
    2.2.3字节输入流(InputStream)
    `java.io.InputStream `抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。
  它定义了字节输入流的基本共性功能方法。
    - `public void close()` :关闭此输入流并释放与此流相关联的任何系统资源。
    - `public abstract int read()`: 从输入流读取数据的下一个字节。
    - `public int read(byte[] b)`: 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
    2.2.4字节输入流子类之一(FileInputStream)
    构造方法:
    - `FileInputStream(File file)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
    - `FileInputStream(String name)`: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名
  读取字节数据:
    1、读取字节数据:read`方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回`-1`
    2、使用字节数组读取:read(byte[] b)`,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回`-1`
    3.
  2.3顶级父类之字符流
    2.3.1字符输入流(Reader)
  `java.io.Reader`抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。
  它定义了字符输入流的基本共性功能方法。
    - `public void close()` :关闭此流并释放与此流相关联的任何系统资源。
    - `public int read()`: 从输入流读取一个字符。
    - `public int read(char[] cbuf)`: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
    2.3.2字符子类之一(FileReader)
  java.io.FileReader `类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
  构造方法:
    - 'FileReader(File file)`: 创建一个新的 FileReader ,给定要读取的File对象。
    - `FileReader(String fileName)`: 创建一个新的 FileReader ,给定要读取的文件的名称。
  读取字符数据:
    1、读取字符**:`read`方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回`-1`,
    2、使用字符数组读取**:`read(char[] cbuf)`,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回`-1`
    2.3.3字符输出流(Write)
   `java.io.Writer `抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。
  它定义了字节输出流的基本共性功能方法。
    - `void write(int c)` 写入单个字符。
    - `void write(char[] cbuf) `写入字符数组。
    - `abstract void write(char[] cbuf, int off, int len) `写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    - `void write(String str) `写入字符串。
    - `void write(String str, int off, int len)` 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    - `void flush() `刷新该流的缓冲。
    - `void close()` 关闭此流,但要先刷新它。
    2.3.4字符输出流的子类之一(FileWriter)
    java.io.FileWriter `类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
  构造方法:
    - FileWriter(File file)`: 创建一个新的 FileWriter,给定要读取的File对象。
    - `FileWriter(String fileName)`: 创建一个新的 FileWriter,给定要读取的文件的名称。
  基本写出数据:
    写出字符:`write(int b)` 方法,每次可以写出一个字符数据,
  关闭和刷新!!!!:
    因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。
如果我们既想写出数据,又想继续使用流,就需要`flush` 方法了。
    - `flush` :刷新缓冲区,流对象可以继续使用。
    - `close `:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
  写出其他数据:
    1、写出字符数组** :`write(char[] cbuf)` 和 `write(char[] cbuf, int off, int len)` ,
每次可以写出字符数组中的数据,用法类似FileOutputStream,
    2、写出字符串:write(String str)` 和 `write(String str, int off, int len)` ,每次可以写出字符串中的数据,更为方便,
    3、续写和换行:操作类似于FileOutputStream
  2.4牛皮的缓冲流
  缓冲流,也叫高效流,按照数据类型分类:
  - **字节缓冲流**:`BufferedInputStream`,`BufferedOutputStream`
  - **字符缓冲流**:`BufferedReader`,`BufferedWriter`
  缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,
  通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
    2.4.1字节缓冲流
  构造方法:
    - public BufferedInputStream(InputStream in)` :创建一个 新的缓冲输入流。
    - `public BufferedOutputStream(OutputStream out)`: 创建一个新的缓冲输出流。
    2.4.1字符缓冲流
  构造方法:
    - public BufferedReader(Reader in)` :创建一个 新的缓冲输入流。
    - `public BufferedWriter(Writer out)`: 创建一个新的缓冲输出流。
  字符的特有方法
 字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,
    - BufferedReader:`public String readLine()`: 读一行文字。
    - BufferedWriter:`public void newLine()`: 写一行行分隔符,由系统属性定义符号。
  2.5转换流(字节与字符之间的桥梁)
  当编码和解码不一致时会出现乱码;>>然后出现转换流
    2.5.1Reader子类InputStreamReader类 (指定编码读取)
  转换流`java.io.InputStreamReader`,是Reader的子类,是从字节流到字符流的桥梁。
  它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
  构造方法:
    - InputStreamReader(InputStream in)`: 创建一个使用默认字符集的字符流。
    - `InputStreamReader(InputStream in, String charsetName)`: 创建一个指定字符集的字符流
    2.5.2Write子类:OutputStreamWrite(指定编码写出)
  构造方法:
    - OutputStreamWriter(OutputStream in)`: 创建一个使用默认字符集的字符流。
    - `OutputStreamWriter(OutputStream in, String charsetName)`: 创建一个指定字符集的字符流。
  2.6数据流(处理基础数据类型的流)
  可以使用DataOutputStream进行写,随后用DataInputStream进行读取,而且顺序要一致。
  2.7序列化(用字节序列表示一个对象)(传输对象)
  序列化和反序列化,用字节传输对象。
    2.7.1 ObjectOutputStream类
    java.io.ObjectOutputStream ` 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。
    构造方法:
      public ObjectOutputStream(OutputStream out) `: 创建一个指定OutputStream的ObjectOutputStream。
    序列化操作:
    - 该类必须实现`java.io.Serializable ` 接口,`Serializable` 是一个标记接口,
不实现此接口的类将不会使任何状态序列化或反序列化,会抛出`NotSerializableException` 。
    - 如果对象的某个属性也是引用数据类型,
那么如果该属性也要序列化的话,也要实现`Serializable` 接口
    - 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,
则该属性必须注明是瞬态的,使用`transient` 关键字修饰。
    - 静态变量的值不会序列化
写对象方法:public final void writeObject (Object obj)` : 将指定的对象写出。
    2.7.2ObjectInputStream类
    ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
    构造方法:
    public ObjectInputStream(InputStream in) `: 创建一个指定InputStream的ObjectInputStream。
    反序列化操作:
    如果能找到一个对象的class文件,我们可以进行反序列化操作,
    调用`ObjectInputStream`读取对象的方法:
      - `public final Object readObject ()` : 读取一个对象。
  注:对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 `ClassNotFoundException` 异常。
另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个`InvalidClassException`异常。
发生这个异常的原因如下:
    - 该类的序列版本号与从流中读取的类描述符的版本号不匹配
    - 该类包含未知数据类型
  `Serializable` 接口给需要序列化的类,提供了一个序列版本号。`serialVersionUID` 该版本号的
目的在于验证序列化的对象和对应类是否版本匹配。
    2.7.3序列化的另一个接口:java.io.Externalizable接口
    除了Serializable接口之外,还可以实现java.io.Externalizable接口,但是要求重写:
    - void readExternal(ObjectInput in)
    - void writeExternal(ObjectOutput out)
   关于哪些属性序列化和反序列化,由程序员自己定。**虽然可以自己决定任意属性的输出和读取,但是还是建议不要输出静态的和transient属性

          (部分代码)
          import java.io.Externalizable;
          public class Student implements Externalizable{
          private static String school = "atguigu";
          private String name;
          private transient int age;
          private int score;
          public void writeExternal(ObjectOutput out) throws IOException {
          //在这个方法中,程序员自己定,哪些属性需要序列化,及其顺序
          out.writeUTF(school);
          out.writeUTF(name);
          out.writeInt(score);
          out.writeInt(age);
          }
          public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
          //读取的顺序要与写的顺序一致
          school = in.readUTF();
          name = in.readUTF();
          score = in.readInt();
          age = in.readInt();
          }
/*
* 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
* 序列化接口没有方法或字段,仅用于标识可序列化的语义。
*
* java.io.Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。
* 则它要实现 Externalizable 接口的 writeExternal 和 readExternal 方法。
*
* void readExternal(ObjectInput in)
* void writeExternal(ObjectOutput out)
*
* 虽然可以自己决定任意属性的输出和读取,但是还是建议不要输出静态的和transient属性
*/
}
  2.8重新认识PrintStream和Scanner、System.in和out
  改变打印流向:public PrintStream(String fileName) `: 使用指定的文件名创建一个新的打印流。
  改变Scanner输入流向:
  构造方法:
  - Scanner(File source) :构造一个新的 Scanner,它生成的值是从指定文件扫描的。
  - Scanner(File source, String charsetName) :构造一个新的 Scanner,它生成的值是从指定文件扫描的。
  - Scanner(InputStream source) :构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。
  - Scanner(InputStream source, String charsetName) :构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。
  常用方法:
  - boolean hasNextXxx(): 如果通过使用nextXxx()方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 Xxx 值,则返回 true。
  - Xxx nextXxx(): 将输入信息的下一个标记扫描为一个Xxx

posted @ 2021-11-09 19:16  Just&Walking  阅读(46)  评论(0编辑  收藏  举报