IO流基础

概念

流是一种抽象概念,工作中经常会操作磁盘上的资源,这个过程就实现了数据的操作,数据的操作有输入流和输出流,磁盘上的文件和内存之间进行交互,交互需要有一个媒介或者管道,就称为IO流 (Input Output Stream),用来进行输入输出操作

io流的种类

1.按照流的流向

输入流:将数据读取到Java程序(内存)中使用的流

输出流:将Java程序(内存)向外传输使用的流

2.按照数据单位

字节流:一次性传输一个字节数据,将数据以字节的形式传输

字符流:一次性传输一个字符数据,将数据以字符的形式传输

字节输入流

InputStream类的常用方法

1.void close()
关闭此输入流并释放与该流关联的所有系统资源。

2.int read()
从输入流中读取数据的下一个字节。

3.int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中

4.int read(byte[] b,int off, int len)
将输入流中最多len个数据字节读入 byte 数组

文件输入流FileInputStream

//将文件中的内容读取出来
//读,输入的过程
//字节输入流==》InputStream

//给定一个相对路径,创建文件对象
File f=new File("aaa.txt");
//通过管道建立文件输入流,然后将文件f传入
InputStream is=new FileInputStream(f);
//read()方法   读取一个字节,读不到时返回-1
int a=0;
//每读到一个值,赋给a,只要不是-1就一直读
while((a=is.read())!=-1){
	//将读到的结果转为char类型
System.out.print((char)a);
}

//int read(byte[] b)  每次读取b数组长度个字节,读不到返回-1
byte[] bs=new byte[5];
//读取的个数
int read=0;
//返回的是读取的个数,如果读不到返回-1
while((read=is.read(bs))!=-1){
	//将数组中从第0位开始,向后截取read个字节转换为字符串
	String string = new String(bs, 0,read);
	System.out.print(string);
}

//int read(byte[] b,int offset, int length)
//每次读取length个字节,从第offset为开始赋值,读不到返回-1
byte[] bs=new byte[1024];
is.read(bs, 3, 14);
System.out.println(Arrays.asList(bs).toString());

//关闭管道
is.close();

字节输出流

OutputStream类的常用方法

void close()
关闭此输出流并释放与此流有关的所有系统资源

void flush()
刷新此输出流并强制写出所有缓冲的输出字节

void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流

void write(byte[] b,int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流

void write(int b)
将指定的字节写入此输出流

文件输出流FileOutputStream

//写:这是将java代码中的内容输出到文本中,Output
String a="abcdefg";
File f=new File("aaa.txt");
//FileOutputStream(File file)  在file和java代码创建字节输出流
//FileOutputStream(File file, boolean append)  在file和java代码创建字节输出流,append表示写的时候是跟着往后写还是覆盖写?默认为false(覆盖)
OutputStream os=new FileOutputStream(f);
// void write(int b):一个一个字节的写
byte[] bytes = a.getBytes();
for (int i = 0; i < bytes.length; i++) {
	os.write(bytes[i]);
}

// void write(byte[] b):一个字节数组的写	 
byte[] bytes = a.getBytes();
os.write(bytes);

//void write(byte[] b,int off, int len)
//将b这个数组中,从off开始向后的len个写到目标文件中
byte[] bytes = a.getBytes();
os.write(bytes, 3, 3);

//刷新
os.flush();
//关闭管道
os.close();

字符输入流

Reader类

//File.separator:斜杠\的意思
File file=new File("ref"+File.separator+"aaa.txt");
Reader r=r=new FileReader(file);
//一个字符的读
int a=0;
while((a=r.read())!=-1){
	System.out.println((char)a);
}

//一个字符数组的读
char[] cs=new char[3];
			
while(r.read(cs)!=-1){
	for (int i = 0; i < cs.length; i++) {
		System.out.println(cs[i]);
	}
}

r.close();

字符输出流

Writer类

File file=new File("ref"+File.separator+"aaa.txt");
Writer w=new FileWriter(file);//覆盖原来的写
String a="今天天气不错";
char[] cs=a.toCharArray();
//一个字符的写
for (int i = 0; i < cs.length; i++) {
	w.write(cs[i]);
}
//一个数组的写
w.write(cs);
//直接写一个字符串
w.write(a);

w.flush();
w.close();

字符流与字节流的区别

字节流可以处理任意类型的文件,包含字符文件,而字符流只能处理字符文件

字符流默认使用缓冲区,而字节流没有

如果复制的文件是文本文件 ,用字节流和字符流都可以

如果复制的文件是图片、音乐、电影, 使用字节流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值