java基础io_Java基础——IO

I/O流 对象流:ObjectInputStream和ObjectOutputStream 对象流是过滤流,需要节点流作参数来构造对象,用于直接把对象写入文件和从文件中读取对象。 只有实现了Serializable接口的类型的对象才可以被读写,Serializable接口是个标记接口,其中没有定义方法。

一、概述

I/O,Input/Output输入输出。输入机制比如读取文件数据、用户键盘输入等,输出,比如将数据输出到磁盘等。

Java的IO是以流(Stream)为基础的。

流的叫法十分形象,你可以想象数据在被读取或写入时动态的状态。

如果把输入(出)设备当成一个管道,那么流就是这个管道中的information信息或数据。

82ed366874c7220c5e1b940ba8a226a3.png

二、体系

f9e6601c0d84711a115ab703ee722e20.png

IO体系结构大致如上图所示,流式部分是基础也是重点。

三、分类

java中存在各式各样的流,按照不同的分类角度,先做个大致的了解。 依据 内容 流向 输入流、输出流 数据单元 字节流、字符流 角色 节点流、处理流

1、流向

输入流:只读不写

输出流:只写不读

从程序运行所在内存的角度来理解“方向”:

1)输出

12472e70ea3ee86d649c5eb27ac986a8.png

2)输入

1dc65b8d94018d00e5c49a8ada3e3383.png字节流的操作演示 1.将一个文本通过字符流操作复制到指定目录下 2.将一个文本通过字节流操作复制到指定目录下 3.将一个Mp3文件通过字节流操作方式复制到指定目录下,并加入缓冲技术 4.简写复制Mp3文件的代码 import java.io.BufferedInputStream;import java

2、数据单元

字节、字符流的用法几乎完全一样,最大的区别就在于前者操作的是8位的字节,而后者是16位的字符。

字节流的基类是InputStream、OutputStream,字符流是Reader和Writer。

下面通过InputStream和Reader看一下,操作十分类似,核心方法read()也只是参数类型不同,一个byte,一个char。同样输出流也是如此。

public abstract class InputStream implements Closeable {

public int read(byte b[]) throws IOException {

return read(b, 0, b.length);

}

......

}

public abstract class Reader implements Readable, Closeable {

public int read(char cbuf[]) throws IOException {

return read(cbuf, 0, cbuf.length);

}

}

字符/节的输出

前面提到InputStream、Reader等都是抽象基类,因此例子中使用的实现类FileReader或FileInputStream。

public static void main(String[] args) {

try {

//字符流

FileReader fis=new FileReader("G:/TGB/Demo/TaotaoResult.java");

char[] biff=new char[32];

//字节流

/*FileInputStream fis=new FileInputStream("G:/TGB/Demo/TaotaoResult.java");*/

/*byte[] biff=new byte[1024];*/

int hasRead=0;

//重复读取

while((hasRead=fis.read(biff))>0){

System.out.println(new String(biff,0,hasRead));

}

//关闭文件流

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

执行后,在Console中输出“G:/TGB/Demo/TaotaoResult.java”中的代码内容。

字符/节的输入

与输出相比,输入就比较容易了,不会涉及大量的循环读取。

FileWriter fw;

try {

fw = new FileWriter("G:/TGB/Demo/1.txt");

fw.write("你好");

fw.write("hi");

fw.write("hello");

} catch (IOException e) {

e.printStackTrace();

}

运行程序后,会在制定路径下生成1.txt文件,内容即给定的信息。

3、角色

节点流是与特定节点(如内存、设备等)读写数据,又称低级流。相应的,处理流是对一个已经存在的流进行连接或封装,高级流。

处理流包装节点流是一种装饰模式的体现,更封装更加方便,因此也称为包装流。

以InputStreamReader为例,来介绍处理流的使用。

public static void main(String[] args) {

try {

//将System.in转换成Reader

InputStreamReader reader=new InputStreamReader(System.in);

//包装成BufferedReader,缓冲

BufferedReader br=new BufferedReader(reader);

String line=null;

//只有输入exit时,程序退出

while((line=br.readLine())!=null){

if(line.equals("exit")){

System.exit(1);;

}

System.out.println("输出:"+line);

}

} catch (Exception e) {

}

}

System.in是java的标准输入流,即键盘输入。他是InputStream的实例,不方便使用。首先InputStreamReader将输入的文本内容转换为字符输入流,还可以包装一层缓冲,利于读取。

小结

6e6020a91fc0942d3606be077449fede.png

本篇博客介绍了Java IO的基本概念和操作,下篇博客继续介绍IO中的重要内容:序列化和NIO。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值