首页 > 其他 > 详细

IO流

时间:2021-03-17 14:53:05      阅读:26      评论:0      收藏:0      [点我收藏+]

File类

为什么在具体流外还要有File类

在Java中操作的都是对象,但File是一个文件,想要在程序中使用,需要先声明一个File类来代表要操作的文件,并使用File类中的方法对文件进行操作(用一个File类来代表要操作的文件)

File类的常用构造器

File(String filePath)
File(String parentPath,String childPath)
File(File parentPath,String childPath)

方法

public String getAbsolutePath()//获取绝对路径 *
public String getPath()//获取路径
public String getName()//获取名称
public String getParent()//获取上层文件目录,如果无返回null *
public long length()//获取文件长度(字节数),不能获取目录长度
public long lastModified()//获取最后一次的修改时间,毫秒值
//适用于文件目录
public String[] list() //获取指定目录下的所有文件或文件目录的名称数组
public File[] listFiles() //获取指定目录下的所有文件或文件目录的list数组
//File类的重命名功能
public boolean renameTo(File dest)//把文件重命名为指定的文件路径
//File类的判断功
public boolean isDirector()//判断是否是文件目录 *
public boolean isFile()//判断是否是文件 *
public boolean exists()//判断是否存在 *
public boolean canRead()//判断是否是可读
public boolean canWrite()//判断是否是可写
public boolean isHidden()//判断是否是隐藏
//File类的创建功能
public boolean createNewFile()//创建文件。若文件存在则不创建并返回 false *
public boolean mkdir()//创建文件目录。若文件目录存在则不创建,如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs()//创建文件目录。如果此文件目录的上层目录不存在,一并创建。 *
/*注:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下 */
//File类的删除功能
public boolean delete()//删除文件或文件夹 *
/*注意:java中的删除不走回收站。要删除一个文件目录时,要注意该文件目录内不能包含文件或文件目录

流的分类

  1. 按照操作数据单位的不同:字节流(8bit)、字符流(16bit)
  2. 按照数据流的流向:输入流,输出流
  3. 按照流的角色不同:节点流(直接作用在文件上)、处理流(作用在已有流的基础上)

处理字节流的抽象类:(抽象类不可实例化)

  1. InputStream
  2. OutputStream

处理字符流的抽象类:

  1. Reader
  2. Writer

流的体系结构

  1. InputStream:抽象基类
    1. FileInputStream:节点流(或文件流)
    2. BufferedInputStream:缓冲流(处理流)
  2. OutputStream:抽象基类
    1. FileOutputStream:节点流(或文件流)
    2. BufferedOutputStream:缓冲流(处理流)
  3. Reader:抽象基类
    1. FileReader:节点流(或文件流)
    2. BufferedReader:缓冲流(处理流)
  4. Writer:抽象基类
    1. FileWriter:节点流(或文件流)
    2. BufferedWriter:缓冲流(处理流)

另外四个比较重要的:

  1. 转换流

    1. InputStreamReader(字符流)
    2. OutputStreamWrite(字符流)
  2. 对象流

    1. ObjectInputStream(字节流)
    2. ObjectOutputStream(字节流)

File对象文件路径需要注意的点:

  1. File对象的路径是相对于当前工程的相对路径
  2. 操作具体流的时候,因为写在包内,会出现文件缺失异常
  3. 在main中使用具体流的时候,需要指明当前路径下的具体路径
  4. 在加当前路径下具体路径时,需要注意,\需要两个,因为一个表示转义字符,两个\才表示一个\

main中的路径是相对于本项目的

read读回来的数据是int格式的,需要转成char类型

为了保证流资源一定可以关闭需要使用try-catch-finall来处理

输入输出需要注意的点

  1. 用try-catch-finally来包裹流
  2. 在关闭流之前需要判断流是否打开(fr != null)才可以进行关闭操作
  3. 输出操作,对应的File是可以不存在的,会自动创建此文件
  4. 如果输出对应的文件存在,某人不追加
  5. 如果在创建输出流时加true,则在文件中追加要添加的内容
  6. 字符流不可以处理图片文件

使用InputStream和OutputStream实现文件复制

字节流与字符流的使用

  1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  2. 对于非文本文件(.jpg,.mp3,.avi,.doc,.ppt),使用字节流处理

可以使用字节流实现文本文件的复制

  1. 不可以在执行时,通过控制台程序看要复制的文本文件

    因为文本中的内容是char(2字节)型的,而字节流是byte(1字节)类型的,通过控制台程序toString方法转化时会发生截断,导致数据丢失

  2. 如果只是复制是可以的,相当于把文件当成字节流来处理,可以实现正确复制

  3. 用字符流实现非文本文件是不可以的

处理流

缓冲流

作用:提高文件读写的速度

缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWrite

使用

//BufferedInputStream
bufferedInputStream.read(byte[] buffer)
//BufferOutputStream
bufferedInputStream.Write(byte[] buffer,0,len)
//BufferedReader
bufferedReader.read(char[] cbuffer)
bufferedReader.readline()  + bufferedReader.newline()//不复制换行符,newline相当于换行符
//BufferedWrite
bufferedWrite.Write(char[] cbuffer,0.len)

转换流

作用:提供了字节流和字符流的转换

Java API提供的转换流:

  1. InputStreamReader:将InputStream转换为Reader(将字节输入流转换为字符输入流)
  2. OutputStreamWrite:将Write转换为OutputStream(将字符输出流转换为字节输出流)

好记法:底层是用字节流存的,这两个转换流是为了对文件数据进行存取

在程序对文件进行操作时,操作的是字符,所以这两个是属于字符流的

两者结合可以实现字符集编码转换

标准输入输出流

System.out //默认从控制台输出
System.in //默认从键盘输入

打印流

作用:实现将基本数据类型的数据格式转化为字符串输出

PrintStream
PrintWriter

实现了对print()和println()的各种重载

数据流

作用:为了方便的操作Java语言的基本数据类型String的数据,可以使用数据流

DataInputStream
DataOutputStream

对象流

作用:与数据流类似,但是可以更好的操作对象

注意:读的顺序需要与写入顺序一致

字符集

常见的编码表:

ASCII:美国标准信息交换码。用一个字节的7位表示

ISO8859-1:拉丁码表。欧洲码表。用一个字节的8位表示

GB2312:中国中文编码表。最多两个字节编码所有字符

GBK:中国的中文编码表升级。融合了更多的中文文字符号,最多两个字节编码

Unicode:国家标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示

UTF-8:变长的编码方式,可以使用1-4个字节来表示一个字符

注:

  1. 所有编码方式都兼容ASCII
  2. GBK首位是0表示该文字是以一个字节存储的,首位是1表该字符是以两个字节存储的
  3. UTF-8是每次读8位,是Unicode的具体实现方案,首位是0表示以一个字节存储,前面几位是10表示以两个字节存储,是110表示以三个字节存储以此类推。另跟在表示位之后的字节都需以10开头,剩余空位填充Unicode编码

序列化和反序列化

序列化:Serialization 将对象的状态信息转换为可以存储或传输形式的过程

(对象(内存) -------> 字节数组或字节序列)

反序列化:DeSerialization (字节数组(外存)或字节序列(网络) -------> 对象(内存) )

ObjectOutputStream a.writeObject  //实现序列化
ObjectInputStream b.readObject  //实现反序列化

注:

  1. 没有定义任何操作的接口,作用相当于一种规范(可以用作代码运行时的分支判断)

  2. 需要在类定义时,实现Serializbtion接口(implements Serialization)

  3. static属性不参与序列化

  4. 想要某属性不参与序列化可以加tansient(临时透明 、在内存中存储)实现属性透明 persistance(持久序列化、在外存中存储)

IO流

原文:https://www.cnblogs.com/zhoushuaiyi/p/14548230.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!