IO流(一)IO流概述以及字节流使用
IO流的主要作用:主要是为了操作读取计算机中的文件进行读取,操作,写入,生成新的文件。
其中根据数据流向分为输入流和输出流。
也可根据数据的传输单位分为字节流(InputStream 和OutputStream)和字符流。(Reader和 Writer)
字节流直接操作文件本身,没有使用缓冲区(硬盘中所有的文件都是以字节的方式存在的,字符只存在于内存中)
最常用的FileInputStream和FileOutputStream 访问文件,实现对文件的读写操作
结合ObjectOutputStream 和 ObjectInputStream 实现一下简单将对象写入文件,和从文件中读取对象。
public static void main(String[] args) throws IOException {
testIO();
}
@Data
@Accessors(chain = true)
private static class TestIoObject implements Serializable {
private Integer objectId;
private String objectName;
@Override
public String toString() {
return "TestIoObject{" +
"objectId=" + objectId +
", objectName='" + objectName + '\'' +
'}';
}
}
private static void testIO() throws IOException {
//在E盘testOutput文件夹下创建output.txt文本文件
String fileAddress = "E:\\testOutput\\output.txt";
//获取输出文件流
FileOutputStream fileOutputStream = new FileOutputStream(fileAddress);
//文件作为写入目标地址
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//新建对象
TestIoObject testObject = new TestIoObject().setObjectId(1)
.setObjectName("对象1");
//写入对象,流对象写入
objectOutputStream.writeObject(testObject);
//获取读取文件流
FileInputStream fileInputStream = new FileInputStream(fileAddress);
//文件作为读取目标地址
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
TestIoObject testIoObject = null;
try {
//读取文件中的对象
testIoObject = (TestIoObject) objectInputStream.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(testIoObject);
}
输出读取文件对象结果:
ByteArrayInputStream和ByteArrayOutputStream 字节数组处理流,在内存中建立一个缓冲区作为流使用,从缓存区读取数据比从存储介质(如磁盘)的速率快。相较于fileInputStream和FileOutputStream的数据来源是真实文件,那么ByteArrayInputStream和ByteArrayOutputStream的数据来源是来做电脑的内容中的东西,可以是“abc”,也可以是123,数组,对象…速度快,不建议量太大占用过多内存。
PipedInputStream和PipedOutputStream 管道流,适用在两个线程中传输数据,一个线程通过管道输出流发送数据,另一个线程通过管道输入流读取数据,实现两个线程间的数据通信
和NIO中的channel(通道)差不多,但是channel是双向通道可读可写,管道流是单向的(读写功能固定)
NIO入口待开放:链接地址。。。。
SequenceInputStream 用于合并文件流,将小文件合并为一个大文件。
String fileAddress = "E:\\testOutput\\output.txt";
InputStream s1 = new FileInputStream(fileAddress);
InputStream s2 = new FileInputStream(fileAddress);
//合并两个inputStream并输出到outputSequence.txt中
SequenceInputStream sis = new SequenceInputStream(s1, s2);
InputStreamReader isr = new InputStreamReader(sis);
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(
new FileWriter("E:\\testOutput\\outputSequence.txt"));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
s1.close();
s2.close();
br.close();
bw.close();
待整理:
FilterInputStream和FilterOutputStream 用于装饰Stream(装饰者设计模式),他如下四个子类用于补充功能
1.DataInputStream和DataOutputStream :用于装饰输入流的格式不同,可以输入不同的格式,并对应的读取流中的该格式的数据。
//输出流写入double类型数据、long类型,String类型(所有的基本数据类型)
dataOutputStream.writeDouble(dounbleNum);
dataOutputStream.writeLong(longNum);
dataOutputStream.writeUTF(string);
//对应类型读取
dataInputStream.readDouble();
dataInputStream.readLong();
dataInputStream.readUTF();
2.BufferedInputStream和BufferedOutputStream :是带缓冲区的输入输出流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;
可以结合DataInputStream和ByteArrayInputStream一起使用
public static void main(String[] args) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream dataOutputStream =
new DataOutputStream(new BufferedOutputStream(os));
dataOutputStream.writeUTF("abc");
dataOutputStream.flush();
dataOutputStream.close();
byte[] src =os.toByteArray();
os.close();
DataInputStream dataInputStream =
new DataInputStream(new BufferedInputStream
(new ByteArrayInputStream(src)));
String string = dataInputStream.readUTF();
dataInputStream.close();
System.out.println(string);
};
3.PushBackInputStream 推回输入流:
用于截取一些标识字符串,对流进行处理。
String str = "abc-123456-";
PushbackInputStream push = new PushbackInputStream(
new ByteArrayInputStream(str.getBytes()));
System.out.print("输出:");
int temp = 0;
while ((temp = push.read()) != -1) { // 读取内容
// 判断是否读取到了“.”
if (temp == '-') {
// 放回到缓冲区之中
push.unread(temp);
//读取剩余的除了'-'符号的
temp = push.read();
System.out.print("(拿到了符号" + (char) temp + ")");
} else {
System.out.print((char) temp); // 输出内容
}
}
push.close();
PrintStream 打印流,System.out 就是一个PrintStream。
PrintStream printStream = System.out;
printStream.println(12313);
字节流的输入流(InputStream)和输出流OutputStream的类继承图: