java io 流
Java IO流是既可以从中读取,也可以写入到其中的数据流。流通常会与数据源、数据流向目的地相关联,比如文件、网络等等
流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,
除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。
某些类似PushbackInputStream 流的实现允许你将数据重新推回到流中,以便重新读取。然而你只能把有限的数据推回流中,并且你不能像操作数组那样随意读取数据。
流中的数据只能够顺序访问。
Java IO流通常是基于字节或者基于字符的。
字节流通常以“stream”命名,比如InputStream和OutputStream。
除了DataInputStream 和DataOutputStream 还能够读写int, long, float和double类型的值以外,其他流在一个操作时间内只能读取或者写入一个原始字节。
字符流通常以“Reader”或者“Writer”命名。字符流能够读写字符(Unicode字符)。 Readers and Writers获取更多关于字符流输入输出的信息。
InputStream 字节输入流
java.io.InputStream类是所有Java IO输入流的基类
输入流中的read()方法读取数据。read()方法返回一个整数,代表了读取到的字节的内容(0 ~ 255)。当达到流末尾没有更多数据可以读取的时候,read()方法返回-1。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("D:/Sunxy_workspace/readme.txt");
int data = inputStream.read();
while (data != -1){
System.out.print((char)data);
data=inputStream.read();
}
inputStream.close();
}
}
输出
inputStream
Process finished with exit code 0
OutputStream 字节输出流
java.io.OutputStream是Java IO中所有输出流的基类.将内存中的字节数组输出到目标媒介中。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class OutStreamTest {
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("D:/Sunxy_workspace/readme.txt");
outputStream.write("write Hello to readme.txt".getBytes(StandardCharsets.UTF_8));
outputStream.close();
}
}
OutputStream 构造函数 决定输出内容覆盖或者追加
输出内容 追加到readme.txt文本内容最后一行
OutputStream output = new FileOutputStream("D:/Sunxy_workspace/readme.txt", true);
输出内容 覆盖原文本
OutputStream output = new FileOutputStream("D:/Sunxy_workspace/readme.txt", false);
BufferedInputStream,BufferedOutputStream 字节缓冲流
InputStream,OutputStream 每次读取/写入一个字节是很慢的;
BufferedInputStream 字节缓冲区输入流,可以从磁盘中一次读取一大块数据,然后再从读到的数据块中获取字节。
BufferedOutputStream 字节缓冲区输出流,实现将大块数据批量地写入到磁盘(或者相应的流)中。
默认缓冲区大小8 * 1024B 即8KB
import java.io.*;
import java.nio.charset.StandardCharsets;
public class BufferedStream {
public static void main(String[] args) throws IOException {
// 字节缓冲区大小为 8KB
InputStream bis = new BufferedInputStream(new FileInputStream("D:/Sunxy_workspace/readme.txt"),8 * 1024);
int data = bis.read();
while (data != -1) {
System.out.println((char) data);
data = bis.read();
}
bis.close();
OutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Sunxy_workspace/readme.txt"),8 * 1024);
bos.write("我爱北京天安门".getBytes(StandardCharsets.UTF_8));
bos.close();
}
}
DataInputStream DataOutputStream
DataInputStream可以从输入流中读取Java基本类型数据,而不必每次读取字节数据。
把InputStream包装到DataInputStream中,可以从此输入流中读取基本类型数据
DataOutputStream可以往输出流中写入Java基本类型数据
import java.io.*;
import java.nio.charset.StandardCharsets;
public class DataStreamT {
public static void main(String[] args) throws IOException {
DataInputStream input = new DataInputStream(new FileInputStream("D:/Sunxy_workspace/readme.txt"));
int read = input.read();
char c = input.readChar();
boolean b = input.readBoolean();
float v = input.readFloat();
double d = input.readDouble();
input.close();
DataOutputStream output = new DataOutputStream(new FileOutputStream("D:/Sunxy_workspace/readme.txt"));
output.write("我不做大哥好多年".getBytes(StandardCharsets.UTF_8));
output.writeBoolean(true);
output.writeDouble(3.1415926);
output.writeFloat(6.6f);
output.writeChars("Type String");
output.close();
}
}
Java IO: 序列化Serializable与ObjectInputStream、ObjectOutputStream
类能够序列化和反序列化,必须实现Serializable接口
ObjectInputStream,ObjectOutputStream
ObjectInputStream能够让你从输入流中读取Java对象,而不需要每次读取一个字节.
ObjectOutputStream能够让你把对象写入到输出流中,而不需要每次写入一个字节
import java.io.*;
public class ObjectStreamT {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person = new Person();
person.setAge("18");
person.setName("小虎");
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("D:/Sunxy_workspace/object.txt"));
output.writeObject(person);
output.close();
ObjectInputStream input = new ObjectInputStream(new FileInputStream("D:/Sunxy_workspace/object.txt"));
Person p = (Person)input.readObject();
System.out.println(p.getName());
}
}
// 内部类
class Person implements Serializable {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}