java io流

数据传输

在Java程序中,对于数据的输入/输 出操作,都是以"流"的方式进行

流就是将数据传输的管道抽象成对象,分为输入流和输出流

根据数据的流向分为:输入流和输出流
输入流 :把数据从其他设备上读取到程序中的流
输出流 :把数据从程序中写出到其他设备上的流

根据数据的类型分为:字节流和字符流
字节流 :以字节为单位(byte),读写数据的流
字符流 :以字符为单位(char),读写数据的流

//一个字节一个字节读或者一个字符(一次两个字节)一个字符读

在这里插入图片描述

流的结构

在Java中,和IO流相关的类,主要是在 java.io 包下的定义的
几乎所有的流,都是派生自四个抽象的父类型:
InputStream ,代表字节输入流类型
OutputStream ,代表字节输出流类型
Reader ,代表字符输入流类型
Writer ,代表字符输出流类型

流的使用

1.声明流/创建流

2.使用流(调用方法)

3.关闭流(一定要关闭)

in.read()方法和out.write方法

字节流 byte InputStream OutputSream

任意类型的数据 read write

节点流 int read() void write(int)//一个字节的10进制转换成字节写入

​ //返回拿到一个字节的10进制 void write(byte[])

​ int read(byte[]) void write(byte b[], int off, int len)

​ //返回放进去字节的数量 flush

​ int read(byte b[], int off, int len) close

​ //读取字节的容器,字节数组放置的起始位置,最多存访的长度

​ //返回放进去字节的数量

​ ByteArrayInputStream ByteArrayOutputStream

​ PipedInputStream PipedOutputStream

​ FileInputStream FileOutputStream

两种缓冲流(不能单独存在,没有无参构造器,必须放普通流)

​ 基本数据类型DataInputStream DataOutputStream

​ 字符串缓冲 BufferedInputStream BufferedOutputStream

字符流 char Reader Writer

文本类型 read write

​ 类似,把byte换成char

​ CharArrayReader CharArrayWriter

​ PipedReader PipedWriter

​ FileReader FileWriter

缓冲流

​ BufferedReader BufferedWriter

​ String readLine() write(String)

try可以加括号写语句自动关闭流,但是流要实现closeable接口

控制台

使用字节流,从控制台读取数据,以及向控制台中写数据。

java.lang.System

字节数组

使用字节流,从字节数组中读取数据,以及向字节数组中写数据。

java.io.ByteArrayInputStream 负责从字节数组中读取数据

java.io.ByteArrayOutputStream 负责把数据写入到字节数组中

管道

使用字节流,可以从管道中读取数据,以及向管道中写数据。

java.io.PipedInputStream 负责从管道中读取数据

java.io.PipedOutputStream 负责将数据写入到管道中

使用管道之前先对接再使用

管道分为两个线程同时进行,使用join方法

文件
java.io.File 类,是java中对文件和目录的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

常用方法:
public String getAbsolutePath() ,返回file的绝对路径
public String getPath() ,返回创建file对象时传入的路径参数(有可能是相对路径)
public String getName() ,返回file的名字
public long length() ,file如果表示文件,则返回文件内容的长度(字节个数)

public boolean exists() ,判断此文件或目录是否真的存在
public boolean isDirectory() ,判断File表示的是否是一个目录
public boolean isFile() ,判断file表示的是否是一个文件

public boolean createNewFile() ,创建一个文新文件
public boolean delete() 删除文件或目录
public boolean mkdir() 创建一个目录
public boolean mkdirs() 创建多级目录

public String[] list() ,返回目录中所有的子文件或子目录,返回值是String类型数组
public File[] listFiles() ,返回目录中所有的子文件或子目录,返回值是File类型数组

使用字节流,可以从文件中读取数据,以及向文件中写数据。

java.io.FileInputStream ,负责从文件中读取数据

java.io.FileOutputStream ,负责把数据写入到文件中

IO

字节流 InputStream OutputStream

​ int read() write(int)

​ int read(byte[]) write(byte[])

​ int read(byte[],index,len) write(byte[],index,len)

​ flush()//刷新此输出流并强制输出

​ close

​ ByteArrayInputStream ByteArrayOutputStream//数据来源与去向不同

管道流

使用字节流,可以从管道中读取数据,以及向管道中写数据。
java.io.PipedInputStream 负责从管道中读取数据
java.io.PipedOutputStream 负责将数据写入到管道中
注意,一般可以在一个线程中,使用管道输出流,将数据写入到管道中,在另一个线程中,读取管道中的数据。

转换流(字节流和字符流的转换)
在这里插入图片描述
java.io.OutputStreamWriter ,可以将字节输出流转换为字符输出流,并指定编码

OutputStreamWriter 本身就是一个字符输出流,它继承了 Writer

java.io.InputStreamReader ,可以将字节输入流转换为字符输入流,并指定编码

InputStreamReader 本身就是一个字符输出流,它继承了 Reader

关闭流先从里往外关

对象流(对象与字符数组的转化)

Java 提供了一种对象序列化的机制,可以将对象和字节序列之间进行转换:

序列化
程序中,可以用一个字节序列来表示一个对象,该字节序列包含了对象的类型、对象中的数据等。
如果这个字节序列写出到文件中,就相当于在文件中持久保存了这个对象的信息
反序列化
相反的过程,从文件中将这个字节序列读取回来,在内存中重新生成这个对象,对象的类型、对象
中的数据等,都和之前的那个对象保持一致。(注意,这时候的对象和之前的对象,内存地址可能
是不同的)

完成对象的序列化和反序列化,就需要用到对象流了

在java中,并非所有对象都可以进行序列化和反序列化,而是只有实现了指定接口的对象才可以进行。 java.io.Serializable 接口

对象输出流
java.io.ObjectOutputStream ,将Java对象转换为字节序列,并输出到内存、文件、网络等地方
注意,具体输出到什么地方,要看 ObjectOutputStream “包裹”的是哪一个节点流

对象输入流
java.io.ObjectInputStream ,从某一个地方读取出对象的字节序列,并生成对应的对象。
注意,具体是从输什么地方读取字节,要看 ObjectInputStream “包裹”的是哪一个节点流

transient
java中的关键字 transient ,可以修饰类中的属性,它的让对象在进行序列化的时候,忽略掉这个被修
饰的属性。
常用在一些敏感属性的修饰,例如对象中的password属性,我们并不想将这个敏感属性的值进行序列化
保存,那么就可以使用 transient 来对他进行修饰
transient 的单词含义就是短暂的、转瞬即逝。

序列化版本号
Serializable 接口给需要序列化的类,提供了一个序列版本号:serialVersionUID
该版本号的目的,是用于验证序列化的对象和对应类是否版本匹配

随机访问流

java.io.RandomAccessFile 是JavaAPI中提供的对文件进行随机访问的流

public class RandomAccessFile extends Object{
    public RandomAccessFile(File file, String mode)throws FileNotFoundException{
    //...
    }
    public void seek(long pos) throws IOException {
    //...
    }
}

可以看出,它并没有继承之前介绍到的那四个抽象父类型

之前使用的每一个流,那么是读数据的,要么是写数据的,而这个随机访问流,它的对象即可用作文件
内容的读,又可以用作文件内容的写,同时它还可以任意定位到文件的某一个文件进行读或者写操作
对象即可读也可以写
随机定位文件中的任意字节位置进行读或写,并且可以前后反复定位
创建该类的对象时,需要指定要操作的文件和操作的模式:
“r” 模式,以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛
出IOException异常。
“rw” 模式,以读写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
“rws” 模式,以读写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新
都同步写入到底层设备。
“rwd” 默认,以读写方式打开指定文件。相对于”rw” 模式,还要求对文件内容每个更新都同步写入
到底层设备。
程序中,以r和rw模式最为常用,r模式表示只读,rw模式表示既能读又能写

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值