深入学习JAVA-IO流详解

8次阅读

共计 4494 个字符,预计需要花费 12 分钟才能阅读完成。

(一)IO 流基本概念

Java 对数据的操作是通过流的方式,io 是 java 中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java 把不同的输入输出抽象为流,通过流的方式允许 Java 程序使用相同的方式来访问不同的输入、输出。

(二)文件字节输入流

(2.1)使用输入流的 4 个基本步骤

1. 设定输入流的源。
2. 创建指向源的输入流。
3. 让输入流读取源中的数据。
4. 关闭输入流。

(2.2)构造方法

如果对文件读取需求比较简单,从文件系统中的某个文件中获得输入字节,可以使用文件字节输入流 FileInputStream 类。

 构造方法:// 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
    FileInputStream(File file)
 // 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径 name 指定
 FileInputStream(String name)

(2.2)使用输入流读取文件


int read(byte b[])// 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,返回实际读取的字节数目。到达尾部返回 -1.
int read(byte[] b, int off, int len)// 将输入流中最多 len 个数据字节读入 byte 数组。返回实际读取的字节数目。到达尾部返回 -1。off 指定从某个位置开始存取。long skip()// 从源中读取单个字节的数据,该方法返回字节值(0-255),未读取出字节返回 -1。void close()// 关闭流

(三)文件字节输出流

(3.1)使用输出流的 4 个基本步骤

1. 设定输出流的目的地。
2. 创建指定目的地的输出流。
3. 让输出流把数据写入到目的地。
4. 关闭输出流。

(3.2)构造方法

如果对文件读取需求比较简单,可以使用 == 文件字节输出流 FileOutputStream 类。== 字节文件输出流是用于将数据写入到 File,从程序中写入到其他位置。

 构造方法:FileOutputStream(File file)// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
 FileOutputStream(File file, boolean append)// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
 FileOutputStream(String name)// 创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(String name, boolean append)// 创建一个向具有指定 name 的文件中写入数据的输出文件流

(3.3)使用输出流写字节


字节输出流的 write 方法以字节为单位向目的地写入单个数据。void write(int n)输出流调用该方法向目的地写入单个字节。void write(byte b[])输出流调用该方法向目的地写入一个字节数组。void write(byte b[],int off,int len)给定字节数组中起始于偏移量 off 处取 len 个字节写到目的地。void close()关闭输出流

(四)文件字符输入、输出流
java 中字符流主要由两个基类 Reader 和 Writer,分别对应字符输入流和字符输流。使用字符数组读取数据,即以字符为基本单位处理数据。
Reader 的主要方法:
abstract viud close() 关闭流,并且释放该流占用的所有系统资源
int read() 从流中读取单个字符
int read(char[] cbuf) 从当前位置读取 cbuf.length 个字符到 cbuf 数组中,但实际读取的字符个数取决于流中剩余字符个数。返回值为实际读取的字符个数。
abstract int read(char[] cbuf, int off, int len)从当前位置读取 len 个字符到 cbuf 中,第一个字符存放在 cbuf[off]中,第二个字符存放在 cbuf[off+1]中,依次类推。实际读取的字符的个数取决于流中剩余的字符个数,返回值为实际读取的字符个数。
Writer 的主要方法:
Writer append(char c) 追加字符 c 到此 Writer 流中,追加到尾部。返回值为追加后的此 Writer
Writer append(CharSequence csq) 追加字符序列 csq 到此 Writer 流中,追加到尾部,返回值为追加后的此 Writer
Writer append(CharSequence csq,int start,int end)
追加字符序列 csq 的子序列到 Writer 流中, 子序列为序列 csq 的 start 到 end 部分,追加到尾部,返回值为追加后的此序列。
abstract void close()关闭流,在关闭之前先调用 flush()
void write(String str) 将字符串写入到流中
void Write(String str, int off, int len) 将字符串 str 指定位置的子串写入到流中,子串起始位置为 off,子串长度为 len。

(五)缓冲流

(5.1)缓冲流概述

缓冲流是对文件流处理的一种流,增强了读写文件的能力。够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。
flush() 和 close()
flush 是从缓冲区把文件写出,
close 是将文件从缓冲区内写出并且关闭相应的流。

(5.2)构造方法

BufferedReader 字符输入缓冲流
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedWriter 字符输出缓冲流
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。

(六)随机流

(6.1)概述

RandomAccessFile 类创建的流称作随机流,RandomAccessFile 类既不是 InputStream 类的子类,也不是 OutputStream 类的子类。当准备对一个文件进行读写操作时,创建一个指向该文件的随机流即可,这样既可以从这个流中读取文件的数据,也可以通过这个流写入数据到文件。

(6.2)构造方法

==RandomAccessFile(File file, String mode) == 参数 file 是一个 File 对象,给出创建的流的源,也是流目的地。参数 mode 取 r(只读)或 rw(可读写),决定创建的流对文件的访问权力。
RandomAccessFile(String name, String mode): 参数 name 用来确定一个文件名,给出创建的流的源,也是流的目的地。参数 mode 取 r(只读)或 rw(可读写),决定创建的流对文件的访问权力。

(七)数组流

流的源和目的地除了可以是文件,还可以是计算机内存。不需要手动关闭流。只有字节流,没有字符流
字节数组输入流(ByteArrayInputStream)

byte[] src = "IO is easy".getBytes();
InputStream is = new ByteArrayInputStream(src);
byte[] flush = new byte[1024];
int len =-1;
while(len=is.read(flush)!=-1){String str = new String(flush,o,len);
 System.out.println(str);
}

字节数组输出流(ByteArrayOutputStream)

byte[] dest = null;// 其实可以不用,为了风格统一
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String str = "IO is easy";
byte[] datas=str.getBytes();// 字符串 ---> 字节数组(编码)baos.write(datas,0,datas.length);
baos.flush();
dest = baos.toByteArray();// 获取数据
System.out.println(dest.length + new String(dest,0,dest.length));

(八)数据流

(8.1)概述

数据输入流 DataInputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。数据输入流 DataInputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

(8.2)代码实现

import java.io.*;
public class text1 {public static void main(String[] args) throws IOException {DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("aa.txt")));
 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("aa.txt")));
 dos.writeUTF("行大旺");
 dos.writeInt(18);
 dos.writeBoolean(false);
 dos.writeChar('a');
 dos.flush();
 String msg = dis.readUTF();
 int age = dis.readInt();
 boolean flag = dis.readBoolean();
 char ch = dis.readChar();
 System.out.println(msg);
 System.out.println(age);
 System.out.println(flag);
 System.out.println(ch);
 dos.close();
 dis.close();}
}

(九)对象流

======

对象流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作
序列化将一个对象存放到某种类型的永久存储器上称为保持。如果一个对象可以被存放到磁盘或磁带上,或者可以发送到另外一台机器并存放到存储器或磁盘上,那么这个对象就被称为可保持的。

import java.io.*;
public class text1 implements Serializable{
 String xing;
 int age;
 public text1(){}
 public text1(String xing,int age){
  this.xing=xing;
  this.age=age;
 }
}
正文完
 0