Java自学日记之IO流(一):字节流和字符流

系列文章目录

暂无



前言

这两天学了IO流,有点多,整理一下


一、IO流函数总览


接触到的比较常用的就这些,其中PipedInputStream与PipedOutputStream涉及到不同线程之间的通信,因为还不太了解线程,所以没怎么研究
其中,我们不难看出IO流大体上分为字符流字节流


二、字节流与字符流

顾名思义,字节流是以字节为单位读取,字符流是以字符为单位读取
字节流最基本的流函数是FileInputStream和FileOutputStream
字符流最基本的流函数是FileReader和FileWriter
通常我们都用这四个函数进行读取和写入

1.FileInputStream与FileOutputStream

(1)实例化

两个函数的构造函数类似,这里只讨论一个
FileInputStream有三种构造方式

public FileInputStream(String name);
public FileInputStream(File file);
public FileInputStream(FileDescriptor fdObj);

第一个是给一个文件名,内部调用函数构造文件

public FileInputStream(String name) throws FileNotFoundException {
	this(name != null ? new File(name) : null);
}

第二个是直接给一个文件流,不需要构造了
第三个,鬼知道是啥 先不管他

(2)fileInputStream.read()

FileInputStream的实例化只是构造出一个读取的对象,之后我们还要通过read函数对文件流进行读取
read函数有三种调用方法

public int read();
public int read(byte b[]);
public int read(byte b[], int off, int len);

其中
public int read() 实现逐个字符读取
eg:

int read=0;
while((read = inputStream.read())!=-1) {
	System.out.println((char)read);
}

这里的read读到的是ASCII码,所以要转换成char型输出

public int read(byte b[]) 实现读入一个byte数组,返回数组的长度
eg:

int len;
byte[] buffer=new byte[1024];
while((len = inputStream.read(buffer))!=-1) {
	System.out.println(new String(buffer,0,len));
}

public int read(byte b[], int off, int len) 实现对一个byte数组定区间的读入
off为起始位置,len为读取长度,代码类似上一种调用,这里就不举例了

(3)fileOutputStream.write()

写入文件的函数,有三种调用方式

public void write();
public void write(byte b[]);
public void write(byte b[], int off, int len);

前两种方式举例

outputStream.write(99);
outputStream.write("aftermath".getBytes());

2.FileReader与FileWriter

(1)实例化

public FileReader(String fileName)
public FileReader(File file)
public FileReader(FileDescriptor fd)

public FileReader(String fileName, Charset charset)
public FileReader(File file, Charset charset)

因为FileReader和FileWriter是按字符读入,所以有时候我们可能对编码方式有一些要求,后两个构造函数满足了我们的需求
Charset charset:要求的编码方式

(2)fileReader.read()

public int read(java.nio.CharBuffer target)
public int read()
public int read(char cbuf[])
public int read(char cbuf[], int offset, int length)

与上面的字节流相比,主要就是多出了第一个调用,读取缓冲区,其他的用法几乎一样,就是后两个把字节数组改成了字符数组,这里就不举例了

(3)fileWriter.write()

public void write(int c)
public void write(char cbuf[])
public abstract void write(char cbuf[], int off, int len)
public void write(String str)
public void write(String str, int off, int len)

因为这里我们写入的是字符流,所以我们这里可以直接写入字符串

注意事项:因为字符流的写入涉及到缓冲区,所以在写入完毕后调用一下fileWriter.flush()强制读入以清空缓存


3.字符流与字节流的区别

  1. 一个字符可能是由多个字节组成,汉字是最经典的例子,如果你以字节流的方式读写汉字,组成汉字的字节被强行拆开,几乎一定会产生乱码。同样的,如果你以字符流的方式读取字节,很大可能也会出问题(可以试一下图片的读取)
  2. 字节流不会用到缓冲区,字符流会用到缓冲区。
    在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据
  3. 字节流和字符流可以用InputStreamReader与OutputStreamWriter来关联,字节流可以通过这两个函数包装成字符流,这个我在后续会写到。

总结

字节流和字符流差不多就这些了,今天真是太慢了,本来想在今天结束IO流,看来要往后推了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aftermath123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值