Java高级语言特性之IO流,线程与进程

IO流基础概念

把数据从数据源输送到数据目的地

1.数据可能存在的位置

1.1.键盘输入(从控制台输入)
1.2.文件输入
1.3.Java代码中

2.主要负责

2.1.输入与输出
2.2.当前代码

3.输入输出方式

3.1.字节---->字节流
3.2.字符----->字符流

4.细分

都是位于java.io包中
4.1.字节输入流:intputStream
4.2.字节输出流:outputStream
4.3.字符输入流:XxxxxxReader
4.4.字符输出流:XxxxxWriter
注:intputStream和outputStream是抽象类

IO流基础操作

1.输入流:

InputStream/Reader
1.1: read();会阻塞代码.从输入流读取一个字节(1字节是8位),把它转换为0-255之间的整数,并返回这一整数。如果遇到输入流的结尾,则返回-1;
1.2: read(byte[] but);会阻塞代码.从流中读取字节数据,把读取到的字节数据放到数组中,一直放满数组。返回的整数表示读取的字节数。如果遇到输入流的结尾,则返回-1;
1.3: read(byte[] b, int off, int len)会阻塞代码.从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的字节数。参数off指定在字节数组中开始保存数据的起始下标,参数len指定读取的字节数目。返回的整数表示实现读取的字节数。如果遇到输入流的结尾,则返回-1;
注:第二个和第三个效率大于第一个。因为:减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。
1.4: available(): 返回可以从输入流中读取的字节数目;
1.5: skip(long): 从输入流中跳过参数n指定数目的字节/字符。
1.6: close(): 关闭输入流,不关闭流,资源被占用,其他进程不能使用
1.7: 字节流 读取到流尾 返回 -1;
1.8: 字符流 读取到流尾 返回 null;
以下是 不常用方法. 使用场景:从流中重复读入数据
1.9. boolean markSupported(): 返回true则表示这个流是否支持重复读入数据。
1.10.void mark(int):从流的当前位置开始设置标记,mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。
1.11. void reset():该方法使输入流重新定位到刚才做了标记的起始位置。
mark祥解:
pos:读取的下一个位置。
markLimit: mark方法后reset方法前 最多允许读取的字节数,这个最大字节数,其实是由markLimit和buffer.size中较大的那个决定的。
当你调用mark方法时,内部会保存一个markPos标志,它的值为目前读取字节流的pos位置,倘若你调用reset方法,这时候会把pos重置为markPos的值,这样你就可以重读已经读过的字节.
eg:有一段字节流是helloworld, 当你读取完字母h调用mark方法(此时markPos指向字母e),接着你继续读取e,l,l,o 然后此时你调用reset方法(内部把pos重置为markPos),当你再读取下一个字节的时候,你会发现你读取到的是e而不是字母w,这样通过mark方法我们就是实现了重复读(re-read the same bytes)

2:输出流

OutputStream/writer
2.1: write(int b): 向输出流写入一个字节;
2.2: write(byte[] b): 把字节数组中的所有字节数据写到输出流;
2.3: write(byte[] b, int off, int len): 把字节数组中的字节从off位置开始的数据写len个长度到输出流.
2.4: flush(): flush()方法强制把缓冲区内的数据写到输出流中。
注:OutputStream类本身的flush()方法不执行任何操作,
但是,一些带有缓冲区的流,在write的时候,是先把数据保存到缓冲区,并不是把数据写到流中,所以需要flash把缓冲区中的数据刷到流中。
2.2.4: close(): 关闭输出流。

IO流 各种流的操作:

前提:io操作涉及到众多的流,接下来也需要学习众多的流,只要是IO操作,用任何一种流都可以完成功能,咱学这么多流的意义在于,可以选更好的流完成。
每个流都是用到上面的基础操作,每个流也有自己的特点。咱要学的就是每个流的特点。
选用原则:
1,效率, 缓冲区字节流 > 字节流 > 缓冲区字符流 > 字符流
2,是否需要操作:基本只能是字符流(只有字符流(每次读取的是字符) 我们才能看懂,才能操作)

3.1: 字节流:

InputStream/OutputStream:

一般是一次读取一个字节
Unicode:16位表示一个字符->两个字节表示一个字符。
utf-8:属于Unicode一个子类: 是根据字符对应的数字大小来确定.
注:在控制台输入的时候 需要注意控制台编码,右键->run as->common->Encoding
String msg = new String(byte[]);
String msg = new String(byte[],start,len);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值