------- android培训、java培训、期待与您交流! ----------
IO流概述
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
IO流的分类:
流向:
输入流 读取数据
输出流 写出数据
数据类型:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
1、 字节流
在计算机中,无论是文本、图片、音频还是是视屏,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流。
字节输出流操作步骤:
A:创建字节输出流对象
B:写数据
C:释放资源
例:需求:我要往一个文本文件中输入一句话:"nihao java";
//首先需要创建字节输出流对象
File file = new File("fos.txt");
FileOutputStream fos = newFileOutputStream("fos.txt");
【创建字节输出流对象了做了几件事情:
A:调用系统功能去创建文件
B:创建fos对象
C:把fos对象指向这个文件】
//写数据
Fos.write("nihao java".getBytes());
//关闭此文件输出流并释放与此流有关的所有系统资源。
fos.close();
【关流的原因:
A:让流对象变成垃圾,这样就可以被垃圾回收器回收了
B:通知系统去释放跟该文件相关的资源】
如何实现数据的换行?
windows:\r\n
linux:\n
Mac:\r
// 创建一个向具有指定 name 的文件中写入数据的输出文件流。如果第二个参数为 true,//则将字节写入文件末尾处,而不是写入文件开始处。
FileOutputStream fos = newFileOutputStream("fos3.txt", true);
// 写数据
for (int x = 0; x < 10; x++) {
fos.write(("hello"+ x).getBytes());
fos.write("\r\n".getBytes());
}
// 释放资源
fos.close();
字节输入流操作步骤:
A:创建字节输入流对象
B:调用read()方法读取数据,并把数据显示在控制台
C:释放资源
读取数据的方式:
A:int read():一次读取一个字节
B:int read(byte[] b):一次读取一个字节数组
一次读取一个字节:
//创建字节读取流对象
FileInputStream fis = newFileInputStream("java.txt");
int by = 0;
// 读取,赋值,判断
while ((by = fis.read()) != -1) {
System.out.print((char)by);
}
// 释放资源
fis.close();
一次读取一个字节数组:
//创建字节读取流对象
FileInputStream fis = newFileInputStream("java.txt");
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(newString(bys, 0, len));
}
// 释放资源
fis.close();
复制文本的例子:
通过定义数组的方式比以前一次读取一个字节的方式快很多,所以有一个缓冲区还是非常好的。java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
这种类被称为:缓冲区类(高效类)
写数据:BufferedOutputStream
读数据:BufferedInputStream
//定义一个字节写入流缓冲区
BufferedOutputStream bos = newBufferedOutputStream(new FileOutputStream("bos.txt"));
// 写数据
bos.write("hello".getBytes());
// 释放资源
bos.close();
//定义一个字节读取流缓冲区
BufferedInputStream bis = newBufferedInputStream(new FileInputStream("bos.txt"));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
System.out.print(newString(bys, 0, len));
}
// 释放资源
bis.close();
字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
2、字符流:
字符流为了高效读写,也提供了对应的字符缓冲流。
BufferedWriter:字符缓冲输出流
BufferedReader:字符缓冲输入流
BufferedWriter:字符缓冲输出流
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。
//建立一个字符写入流的缓冲区
BufferedWriter bw = new BufferedWriter(newFileWriter("bw.txt"));
//写入数据
bw.write("java");
//刷流
bw.flush();
bw.close();
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。
// 创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(newFileReader("bw.txt"));
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
System.out.print(newString(chs, 0, len));
}
// 释放资源
br.close();
字符缓冲流的特殊方法:
BufferedWriter:
publicvoid newLine():根据系统来决定换行符
BufferedReader:
publicString readLine():一次读取一行数据
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
3、 可以读写基本数据类型的数据
数据输入流:DataInputStream
DataInputStream(InputStreamin)
数据输出流:DataOutputStream
DataOutputStream(OutputStreamout)
// 创建数据输入流对象
DataInputStream dis = new DataInputStream(newFileInputStream("dos.txt"));
// 读数据
byte b = dis.readByte();
short s = dis.readShort();
int i = dis.readInt();
long l = dis.readLong();
float f = dis.readFloat();
double d = dis.readDouble();
char c = dis.readChar();
boolean bb = dis.readBoolean();
// 释放资源
dis.close();
// 创建数据输出流对象
DataOutputStream dos = newDataOutputStream(new FileOutputStream("dos.txt"));
// 写数据了
dos.writeByte(10);
dos.writeShort(100);
dos.writeInt(1000);
dos.writeLong(10000);
dos.writeFloat(12.34F);
dos.writeDouble(12.56);
dos.writeChar('a');
dos.writeBoolean(true);
// 释放资源
dos.close();
4、内存操作流:用于处理临时存储信息的,程序结束,数据就从内存中消失。
字节数组:
ByteArrayInputStream
ByteArrayOutputStream
字符数组:
CharArrayReader
CharArrayWriter
字符串:
StringReader
StringWriter
// 写数据
ByteArrayOutputStream baos = newByteArrayOutputStream();
// 写数据
for (int x = 0; x < 10; x++) {
baos.write(("hello"+ x).getBytes());
}
// 读数据
ByteArrayInputStream bais = newByteArrayInputStream(bys);
int by = 0;
while ((by = bais.read()) != -1) {
System.out.print((char)by);
}
5、打印流
字节流打印流 PrintStream
字符打印流 PrintWriter
打印流的特点:
A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
B:可以操作任意类型的数据。
C:如果启动了自动刷新,能够自动刷新。
D:该流是可以直接操作文本文件的。
// 创建打印流对象
PrintWriter pw = new PrintWriter(newFileWriter("pw2.txt"), true);
pw.println("java");
pw.println(true);
pw.println(100);
pw.close();
6、标准输入输出流
System类中的两个成员变量:
publicstatic final InputStream in “标准”输入流。
publicstatic final PrintStream out “标准”输出流。
InputStreamis = System.in;
PrintStreamps = System.out;
通过字符缓冲流包装标准输入流实现
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
// 获取标准输入流
BufferedWriter bw = new BufferedWriter(newOutputStreamWriter(System.out));
7、序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)
// 创建序列化流对象
ObjectOutputStream oos = newObjectOutputStream(new FileOutputStream("oos.txt"));
// 创建对象
Person p = new Person("张三", 22);
// public final void writeObject(Objectobj)
oos.writeObject(p);
// 释放资源
oos.close();
// 创建反序列化对象
ObjectInputStream ois = newObjectInputStream(new FileInputStream("oos.txt"));
// 还原对象
Object obj = ois.readObject();
// 释放资源
ois.close();
8、Properties:属性集合类。是一个可以和IO流相结合使用的集合类。
Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特殊功能:
public Object setProperty(String key,Stringvalue):添加元素
publicString getProperty(String key):获取元素
public Set<String>stringPropertyNames():获取所有的键的集合
public void load(Reader reader):把文件中的数据读取到集合中
publicvoid store(Writer writer,String comments):把集合中的数据存储到文件