近期几天细致学了Java的io流。本来是打算看视频通过视频来学习的。但是后来发现事实上视频看不怎么懂也感觉不是非常easy上手,所以就通过百度和api文档学习了Java的io流
io流能够有两个分类,一个是字节流和字符流,还有一个是输入流和输出流。
先说说字节流和字符流吧:首先实际上字节流在操作的时候是不会用到缓冲区的。是文件本身的直接操作的,可是字符流在操作的时候下会用到缓冲区的。是通过缓冲区来操作文件的。字节流与字符流的其它差别呢就是读写单位不同,毫无疑问,字符流是以字符为单位。字节流是以字节为单位(一个字节8个bit)。由此可知两种的处理对象不同,字节流能处理全部类型的数据,而字符流仅仅能处理字符类型的数据。所以我们能够得到一个结论。那就是仅仅要是处理纯文本数据。就优先考虑使用字符流,除此之外使用字节流。
然后就要说一说输入流和输出流。老实说,从学C语言那时候開始我就输入和输出,output和input非常混乱也非常不明确。须要不断去接触才更加可以牢记差别吧。输入呢通常是指从外部文件(如硬盘,键盘等)获取数据,而输出呢则是指从程序本身向外部输出数据(如写入文件,显示都屏幕上)。
而输入流和输出流还有还有一个差别。那就是对输入流仅仅能进行读操作,而对输出流仅仅能进行写操作。
说完这两个大分类。我们能够来了解下当中更具体的一些内容,看看一个类图吧
由继承图看出来,字符输入流Reader是全部的字符输入流的父类。PIpedReader主要是能够通过与其它线程建成的管道读取数据。
而InputStreamReader是一个连接字节流和字符流的桥梁,能够将字节流转变为字符流。
字符输出流Writer是全部的字符输出流的父类。其它子类分别与Reader的各个子类相相应。
输入字节流InputStream是全部的输入字节流的父类。ByteArrayInputStream、StringBufferInputStream、FileInputStream是分别从相应文件读入数据
而PipedInputStream 是从与其他线程共用的管道中读取数据。
输出字节流OutputSteam 是全部的输出字节流的父类。
其它分别与InputSteam的子类相互相应。
整个IO类中除了字节流和字符流还包含字节和字符转换流。
OutputStreramWriter将输出的字符流转化为字节流
InputStreamReader将输入的字节流转换为字符流
将字节输出流转化为字符输出流Writer out=new
OutputStreamWriter(
new
FileOutputStream(file));
将字节输入流变为字符输入流Reader read=new
InputStreamReader(
new
FileInputStream(file));
new
InputStreamReader(
new
FileInputStream(file));
那有一个问题,神恶魔时候才要用到转换流呢:当字节和字符之间有转换动作时和流操作的数据须要编码或者解码的时候。
以内容为输出输入目的地,使用内存操作流
ByteArrayInputStream 主要将内容写入内容
ByteArrayOutputStream 主要将内容从内存输出
内容操作流一般使用来生成一些暂时信息採用的,这样能够避免删除的麻烦
合并流 SequenceInputStream
SequenceInputStream主要用来将2个流合并在一起。比方将两个txt中的内容合并为另外一个txt。
PushBackInputStream回退流:能够把读取进来的某些数据退回到数据缓冲区
BufferedReader仅仅能接受字符流的缓冲区,由于每个中文须要占领两个字节,所以须要将System.in这个字节输入流变为字符输入流,採用:
BufferedReader buf =
new BufferedReader(
new
InputStreamReader(System.in)); |
new
Scanner(System.in);
// 读一个整数
int
temp = sca.nextInt();
查了下api文档关于scanner的内容发现Scanner的參数代表的是数据从哪里扫描,scanner能够接受不论什么的输入流
为System.out.println()重定向输出(能够把向控制台输出改为写入文件操作)
System.err重定向 (能够将错误信息写入文件保存)
在流操作中常常须要用到:和 不推荐直接用,最好调用两个常量File.separator()与File.pathSeparator(:),这样处理的话跨平台操作会比較兼容
假设想在文件里换行的话。须要使用“ ”