IO流的学习-创新互联

文章目录
  • 一、File类的使用
    • 创建File实例
    • File常用方法
    • 总结
  • 二、IO流分类
    • 读入数据的基本操作
      • 步骤(第一种)
      • 步骤(第二种)
    • 写出数据的基本操作
      • 步骤
    • 读入并写出数据的基本操作(复制)
      • 步骤
      • 注意
    • 处理流之一:缓冲流的使用
    • 处理流之二:转换流的使用
    • 其他流(了解)
      • 标准的输入、输出流
      • 打印流
      • 数据流
    • 对象流
      • 随机存取文件流
      • 每日一考

创新互联公司从2013年成立,先为峨眉山等服务建站,峨眉山等地企业,进行企业商务咨询服务。为峨眉山企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。一、File类的使用

1、File类的一个对象,代表一个文件或一个文件目录(俗称就是文件夹)
2、File类声明在java.io包下

创建File实例

1、相对路径:相较于某个指定的路径下,指明的路径
绝对路径:包含盘符在内的文件或文件目录的路径
在这里插入图片描述
2、路径分隔符
在这里插入图片描述
3、实例化的方法
File(String FilePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)

在这里插入图片描述
在这里插入图片描述

File常用方法

1、
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():获取指定目录下的所有文件或文件目录的File数组(有路径的)
public boolean renameTo(File dest):把文件重命名为指定的路径,比如,file1renameTo(file2),要想保证返回true,需要file1在硬盘中是存在的,file2不能在硬盘中存在

2、判断
public boolean isDirectory():判断是否是文件目录(File不是文件目录,就是文件,只能二选一)
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
如果一个文件或文件目录不存在,那么调用这个对象的这些方法时,返回值都是默认值false,所以建议在对File对象进行操作时,先通过exists判断一下他存不存在
3、创建或删除硬盘中对应的文件或文件目录
public boolean createNewFile():创建文件,若文件存在,则不创建,返回false
public boolean mkdir():创建文件目录,如果此文件目录存在,则不创建。如果此文件的赏赐目录也不存在,则也不创建
public boolean mkdirs():创建文件目录。如果此文件的赏赐目录也不存在,则一并创建
public boolean delete():删除文件或文件夹
【注意】要删除文件目录,需要确保这个目录下不能有子文件或

总结

File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,但不涉及写入或读取文件内容的操作,如果需要写入或读取文件内容,需要使用IO流来完成
后续File类对象常会作为参数传入到流的构造器中,指明读取或写入的“终点”

二、IO流分类

按照操作数据的单位不同,可以分为:字符流、字节流
按照数据的流向不同分为:输入流、输出流
按照角色不同分为:节点流、处理流
1、IO流共涉及40多个类,但是主要从四个抽象类衍生出:
在这里插入图片描述
2、有这四个抽象基类派生的:
节点流(文件流):FileInputStream、FileOutputStream、FileReader、FileWriter
缓冲流(处理流的一种):BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter

读入数据的基本操作

1、read()理解:返回读入的一个字符,如果达到文件末尾,返回-1
2、异常的处理:为了保证资源一定可以执行关闭操作,需要使用try-catch-finally
3、读入的文件一定要存在,否则会报 文件不存在的异常

步骤(第一种)

1、实例化File对象,指明要操作的文件(必须存在)
2、提供具体的流(实例化一个流)
3、数据读入
4、流的关闭操作(必须写)

在这里插入图片描述
在这里插入图片描述

步骤(第二种)

read(char[ ] cbuf):返回每次读入cbuf数组中字符的个数。如果达到文件末尾,则返回-1

在这里插入图片描述
错误写法的原因:创建char数组后,加入数组中的数据是helloworld123,每次读入5个,则最后一次只能读入3个,在读入之前,数组中还保留着上次读入的内容即world,但是最后一次只读入了3个字符,把world的前三个覆盖了,所以此时数组中的内容为123ld,按照第一种错误的方式,最后的输出结果是helloworld123

写出数据的基本操作

1、输出操作,对应的File可以是不存在的,如果不存在,会自动创建此文件;如果存在:
如果流使用的构造器是FileWriter(file, false)或fileWriter(file),会对原有文件内容覆盖
如果流使用的构造器是FileWriter(file, true):不会对源文件覆盖,而是在原有文件基础上进行追加操作

步骤

1、实例化File对象,指明要操作的文件
2、提供具体的流(实例化一个流)
3、数据写出
4、流的关闭操作(必须写)

throws后面还需要改成try-catch在这里插入图片描述

读入并写出数据的基本操作(复制) 步骤

1、实例化File对象,指明要读入和写出的文件
2、提供具体的读入和写出流
3、数据读入、写出操作
4、流的关闭操作(必须写)

在这里插入图片描述

注意

1、不能使用字符流处理图片等字节数据
2、对于文本文件(.txt,.c,.java,.cpp),用字符流处理
3、对于非文本文件(.doc,.jpg,.mp3,.mp4,.avi,.ppt等),用字节流处理

处理流之一:缓冲流的使用

1、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
2、作用:对流的读入和写出速度的提升
原因:内部提供了一个缓冲区
3、关闭资源时:先关闭外面,再关闭里面。在关闭外层流的同时,内层流也被关闭,所以内层流的关闭可以省略
4、处理流,就是“套接”在已有流的基础上

在这里插入图片描述
在这里插入图片描述

5、与前面的类不同的是,缓冲流中新定义了两个方法:
readLine():一次读一行
newLine():写出一个换行符
写出操作中有方法:flush(),是刷新缓冲区的,因为这几个缓冲类中都有这个方法,所以可以省略;后买你如果遇到没有的,需要自己写

处理流之二:转换流的使用

1、转换流:属于字符流
InputStreamReader:可以将字节的输入流转换为字符的输入流
OutputStreamWriter:可以将字符的输入流转换为字节的输入流
在这里插入图片描述

2、作用:提供字节流和字符流之间的转换
3、
解码:字节、字节数组——>字符串、字符串数组
编码:字符串、字符串数组——>字节、字节数组
4、参数二指明了字符集,具体取决于文件保存时使用的字符集
在这里插入图片描述

其他流(了解) 标准的输入、输出流

1、System.in:标准的输入流,默认从键盘输入,类型是InputStream
System.out:标准的输出流,默认从控制台输出,类型是PrintStream,是OutputStream的子类
2、System类的setIn()和setOut()重新指定输入输出流

这里的equals前面最好写字符或字符串,后面写变量,能够避免空指针的问题!!!在这里插入图片描述

打印流

1、PrintStream、PrintWriter
2、提供了一系列重载的print()和println()
在这里插入图片描述
作用:不让字符从控制台输出,而是新建了一个打印流,让它输出到指定的地方

数据流

1、DataInputStream、DataOutputStream
2、作用:用于读取或写出基本类型的变量或字符串
在这里插入图片描述
【注意】读取不同类型的顺序,要与当初写出的顺序一致

在这里插入图片描述
在这里插入图片描述

对象流

1、ObjectInputStream、ObjectOutputStream
2、作用:可以存储或读取基本数据类型的数据或对象的处理流
3、对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点,当其他程序获取了这种二进制流,就可以恢复成原来的Java对象
4、
序列化:将内存中的Java对象保存到磁盘或从网络中传输出去
使用ObjectOutputStream
反序列化:将磁盘文件中的对象还原为内存中的一个Java对象
使用ObjectInputStream
5、要想自定义的类能够序列化,必须满足以下要求:
①需要实现Serializable接口
②需要当前类提供一个全局常量serialVersionUID(序列版本号),并提供一个值
③除了当前类需要实现Serializable接口,还必须保证其内部属性也必须是可序列化的(属性所在的类实现Serializable接口、类中有serialVersionUID),默认情况下,基本数据类型都是可序列化的
在这里插入图片描述
序列化:
在这里插入图片描述
反序列化:
在这里插入图片描述
6、补充:ObjectInputStream和ObjectOutputStream不能序列化static和transient修饰的成员变量

随机存取文件流

RandomAccessFile的使用:
1、RandomAccessFile直接继承于java.lang.Object类,而且实现了DataInput和DataOutput接口
2、RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
在这里插入图片描述
3、如果RandomAccessFile作为输出流,写出到的文件如果不存在,则自动创建该文件;如果存在,则会对原有文件内容进行覆盖,默认情况下,覆盖是从头开始
4、void seek(long pos):将文件记录指针定位到pos位置

每日一考

在这里插入图片描述

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:IO流的学习-创新互联
文章URL:http://pwwzsj.com/article/cdiiod.html