Java教程

IO流文字版

本文主要是介绍IO流文字版,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

File类

java.io包

File类

  • 1.用来表示文件或目录(文件夹)的路径的抽象表示形式。

  • 2.File对象可以用来封装一个文件或目录的信息

  • 3.注意

    • a.File对象封装的信息不一定存在,如果不存在可以通过一些方式让其存在。
    •     b.File对象不能操作文件中的数据,仅仅是封装文件相关信息,如:大小,文件名..
      
  • 路径

    • 其实就是字符串,文件或目录所在位置的字符串
  • 绝对路径

    • 带有磁盘名的
  • 相对路径

    • 不带有磁盘名,相对于当前位置去找

构造方法

  • File(String pathname)

    • 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  • File(File parent, String child)

    • 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  • File(String parent,String child)

    • 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

方法

  • 创建和删除

    • 创建文件

      • boolean createNewFile()
    • 创建目录

      • boolean mkdir()

        • 一级目录
      • boolean mkdirs()

        • 多级目录
  • 获取

    • getAbsoluteFile()

      • 获取绝对路径(不保证file封装的内容真实存在)
        返回file类型
    • getAbsolutePath()

      • 获取绝对路径(不保证file封装的内容真实存在)
        返回String类型
    • getName()

      • 获取文件或目录名称
        返回String
    • getParent()

      • 获取父目录,如果父目录不存在返回null
        返回类型为String
    • getParentFile()

      • 获取父目录,如果父目录不存在返回null
        返回类型为file
    • getPath()

      • 将File转为字符串
    • length()

      • 返回文件大小

      • 注:

        • 不能操作目录,即使操作也是错误结果
    • lastModified()

      • 获取文件最后一次修改的时间,返回毫秒值
  • 判断

    • exists()

      • 判断文件或目录是否真实存在
    • isAbsolute()

      • 是否是绝对路径,仅仅看file封装的内容的写法,与真实存在无关
    • isFile()

      • 是否是文件
    • isDirectory()

      • 是否是目录
    • isHidden()

      • 是否是隐藏文件
  • 列出

    • list()

      • 列出指定目录下的内容
        返回String[]
    • listFiles()

      • 列出指定目录下的内容
        返回File[]
    • listRoots()

      • 列出根磁盘 返回File[]
  • 过滤

    • FilenameFilter

      • 文件名过滤器

      • boolean accept(File dir,String name)

        • dir:指定的目录
        • name:指定目录下的每个文件或目录的名称
        • 返回值是true,说明存放到返回的数组中,否则就不存放
    • FileFilter

      • 文件对象过滤器

      • boolean accept(File pathname)

        • pathname:指定目录+目录下的每个内容名 组合是一个file对象
        • 返回值是true,说明存放到返回数组中,否则就不存放
  • 其他

    • rename(File)

      • 重命名返回boolean类型

IO流

初步认识

  • I:inout,
    O:output
    出入输出

  • 输入

    • 内存角度看,数据进入内存的就是输入操作。数据源,文件
  • 输出

    • 内存角度看,数据出内存的就是输出操作。
      目的地,文件
  • IO技术

    • 不同设备的数据进行传输
    • 要操作的数据
  • 根据流的方向分类

    • 输入流和输出流
  • 根据操作的数据类型分类

    • 字节流和字符流
  • 难点

    • 1、选择字符还是字节流?

      • 字节:图片、视频、音频等二进制文件
      •    字符:纯文本文件(txt)
        
      •    实在不清楚该选择哪个流,就用字节流,它是万能的。
        
    • 2、选择输入还是输出

      • 程序执行时需要数据源数据,---输入 read
      •    程序执行时产生一些数据,这些数据要保存 ----输出 write
        
      •    读入写出。
        
  • 总结

    • 1.创建流对象
    • 2.调用read或write方法
    • 3.关闭流
  • 字节流

    • 根类: InputStream OutputStream
    • 子类: FileInputStream FileOutputStream

字节流

  • 根类

    • 输入流:InputStream

    • 输出流:OutputStream

    • 特点:抽象类

    • OutoutStream

      • 方法

        • write(int by)

          • 写入一个字节数据到目的地
        • write(byte[] by)

          • 将by数组写到目的地
        • write(byte[] by,int index,int length)

          • 将by的一部分写到目的地
        • close()

          • 关闭流,并释放资源
        • flush()

          • 刷新数据到目的地
      • 子类

        • FileOutputStream

          • 用于操作文件,向文件中写入数据

          • 构造方法

            • FileOutputStream(String/File filename)

              • 覆盖文件
            • FileOutputStream(String/File filename,true)

              • 不会覆盖文件,末尾追加数据
    • InputStream

      • 方法

        • int read()

          • 读取一个字节数据,读到末尾返回-1
        • int read(byte[] by)

          • 读取数据存储到by中,读到末尾返回-1
        • int read(byte[] by,index,lengh)

          • 读取数据存储到
        • close()

          • 关闭流,并释放资源
        • int available()

          • 返回未被读取的字节数
          • 创建字节数组时,可以通过该方法来指定其大小
          • 注:文件不能太大,如果过大,创建数组空间很大,导致内存溢出
      • 子类

        • FileInputStream

          • 用于读取文件中的数据

          • 构造方法

            • FileInputStream(File/String filename)
  • 字节缓冲流

    • BufferedInputStream和BufferedOutputStream出现的目的就是为了提高读和写的效率。

    • 此流是字节流,并且是InputStream和OutputStream的子类。

    • 此流不能与数据源和目的地直接建立连接,仅仅是将基础流对象进行包装,增强读写功能。
      缓冲流是从缓冲区中进行数据的读和写,缓冲区中的内容是通过基础流操作得来的。

    • close和flush区别

      • close

        • 关闭流,并释放与之相关的资源,关闭前会刷新
          流一旦关闭,不能再使用
      • flush

        • 将缓冲区中的数据刷新到目的地,流可以继续使用
    • 异常处理

      • try(
        流对象的创建
        ){
        流的操作(读或写)
        }catch(异常类型名 变量名){
        异常的处理
        }
      • 使用这种方法方式,不需要手动关闭流,执行完会执行关闭流

解码和编码

  • 编码表(字符集)

    • ASCII、Unicode、GBK、utf-8
  • 解码

    • 将字节数据转为字符数据
  • 编码

    • 将字符数据转为字节数据
  • 乱码

    • 编码和解码使用的不是同一个编码表

字符流

  • 字符流操作字符类型的数据

  • 实际原理

    • 字节流+编码表的融合
  • 字符流

    • 内部维护了一个字节数组
  • 根类

    • Writer

      • 抽象类

      • Writer

        • write(int ch)

          • 写一个字符
        • write(char[] ch)

          • 写字符数组
        • write(char[] ch,index,length)

          • 写子符数组的一部分
        • write(String str)

          • 写字符串
        • write(String str,index,length)

          • 写字符串的一部分
        • flush()

          • 刷新
        • close()

          • 关闭,关闭前会刷新
      • 子类

        • FileWriter

          • 用于操作文字文件的输出流
          • 编码表和缓冲区大小都是默认的
        • 构造方法

          • FileWriter(String/File filename)

            • 覆盖文件
          • FileWriter(String/file filename, boolean append)

            • 追加文件
    • Reader

      • 抽象类

      • Reader

        • int read()

          • 读取一个字符串,读取到末尾返回-1
        • int read(char[])

          • 读取一个字符数组,返回读取的字符个数,读取到末尾返回-1
        • int read(char[],index,lengh)

        • close()

          • 关闭流
      • 子类

        • FileReader

          • 操作文件
        • FileReader(File/String name)

          • 字符流不能操作二进制类型,
            如:图片、视频、音频等文件
  • 字符缓冲区对象

    • BufferedWriter

      • 将文本写入输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入

      • 可以指定缓冲区的大小,或者接受默认的大小,大多数情况下,默认值足够用。

      • 新增方法

        • void newLine()

          • 跨平台的换行符
    • BufferedReader

      • 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

      • 可以指定缓冲区的大小,或者可使用默认的大小,大多数情况,默认值就足够大

      • 新增方法

        • String readLine()

          • 返回一行文本,不包含行终止符,读取到末尾返回null

转换流

  • InputStreamReader和OutputStreamWriter是一对字符流

  • 构造方法

    • InputStreamReader(InputStream) :字节---字符
    • InputStreamReader(InputStream,charsetname):使用charsetname进行读取数据
    • OutputStreamWriter(OutputStream):字节---字符
    • OutputStreamWriter(OutputStream,charsetName):使用charsetname进行写数据
  • 作用

    • 可以使用指定的编码表进行读和写数据
    • 将字节流转为字符流操作
    • 缓冲流--readLine

对象流

  • ObjectInputStream和ObjectOutputStream字节流

  • ObjectOutputStream

    • 字节输出流,除了能写字节数组、字节数据外,新增了很多功能,可以向目的地中写基本类型和Object类型数据,方法名格式:write+类型名。

    • 构造方法

      • ObjectOutputStream(OutputStream)

        • OutputStream指定目的地
  • ObjectInputStream

    • 字节输入流,除了能读字节数组、字节数据外,新增了很多功能,可以读取数据源中写基本类型和Object类型数据,方法名格式:read+类型名

    • 构造方法

      • ObjectInputStream(InputStream)

        • InputStream指定数据源
  • 这对流可以去读取基本类型数据和引用类型数据,一定要注意写入数据的顺序决定了读取的顺序,按照字节的顺序依次进行写。writeInt(1),写入4个字节,并占用四个字节的空间。

  • 序列化与非序列化

    • 序列化

      • 将数据持久存储,按照字节空间及顺序进行存储
    • 反序列化

      • 持久存储的数据读取出来,按照字节空间及顺序进行读取
    • 自定义对象进行序列化与反序列,需实现一个接口,即java.io.Serializable

      • 此接口为标识接口,不需重写
    • 注意

      • 序列化的是对象的属性值,方法不序列化
      • 与系统有关的对象不能序列化,比如:System
    • 问题

      • 属性不想要序列化,使用static修饰即可,但这种方式不建议;

      • 建议专业关键字

        • transient
    • 定义类的版本号

      • ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

格式化输入和输出

  • 输入

    • System.in

      • 类型是InputStream

      • 数据源:键盘

      • 更改数据源

        • setIn(InoutStream in)

          • 重新分配"标准"输入流
    • Scanner

      • 是一个扫描器,只能扫描基本类型(char 除外)和字符串类型数据

      • 构造方法

        • Scanner(File)

          • 扫描文件中数据
        • Scanner(InputStream)

          • 扫描键盘录入的数据
      • 方法

        • next()

          • 扫描字符串,遇到空格、回车键、tab键等结束扫描
        • nextLine()

          • 扫描一行字符串数据,遇到行终止符停止扫描
  • 输出

    • System.out/err

      • 数据类型

        • PrintStream(字节流)
      • 目的地

        • 控制台 可以打印不同类型的数据
      • 更改目的地

        • setOut(PrintStream out)

          • 重新分配"标准"输入流
    • PrintStream

      • 打印字节流

      • 构造方法

        • PrintStream(File file)

          • 创建具有指定文件且不带自动行刷新的新打印流
        • PrintStream(File file,String csn)

          • 创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
        • PrintStream(OutputStream out)

          • 创建新的打印流。
        • PrintStream(OutputStream out, boolean autoFlush)

          • 创建新的打印流。
        • PrintStream(OutputStream out, boolean autoFlush, String encoding)

          • 创建新的打印流
        • PrintStream(String fileName)

          • 创建具有指定文件名称且不带自动行刷新的新打印流。
        • PrintStream(String fileName, String csn)

          • 创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
      • 该类中封装了大量重载的print和println方法,可以将不同类型的数据写到指定的目的地,print不写入换行,println会写入换行。当写字符数组时会看到字符数组元素内容,是因为有print(char[])方法,当写其他类型元素的数组时,调用的是print(Object)方法。

    • PrintWriter

      • 打印字符流

      • 该类与PrintStream用法基本一样,注意该类是一个字符流,不要忘记刷新

      • 开启自动刷新后,只针对println、printf、format这三个方法有效,其他无效。

      • 构造方法

        • PrintWriter(File file)

          •       使用指定文件创建不具有自动行刷新的新 PrintWriter。 
            
        • PrintWriter(File file, String csn)

          •       创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。 
            
        • PrintWriter(OutputStream out)

          •       根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。 
            
        • PrintWriter(OutputStream out, boolean autoFlush)

          •       通过现有的 OutputStream 创建新的 PrintWriter。 
            
        • PrintWriter(String fileName)

          •       创建具有指定文件名称且不带自动行刷新的新 PrintWriter。 
            
        • PrintWriter(String fileName, String csn)

          •       创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。 
            
        • PrintWriter(Writer out)

          •       创建不带自动行刷新的新 PrintWriter。 
            
        • PrintWriter(Writer out, boolean autoFlush)

          •       创建新 PrintWriter。
这篇关于IO流文字版的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!