Java知识--IO流操作(一)
导语
Java中IO流体系是很重要的基础,我相信一开始接触Java,很多人最头疼的就是这些了,搞不清时,真的会把自己绕进去。在程序中所有数据的传输又都是以流的方式进行的,为了能搞清楚这部分的知识,有必要重新整理一下Java基础,为以后的编程打下良好的基础。
1什么是IO流?
IO指的是Input/Output,IO流:输入输出流。 我们称为数据流。
在Java程序中,对于数据的输入 / 输出操作都是以流的方式进行的。
JDK中提供了各种各样的流类,用以获取不同种类的数据。
常见的2种IO流分类:
1.按流向分:
输入流:程序可以从中读取数据的流
输出流:程序能向其中写入数据的流
2. 按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
为了能更好的了解Java中的IO流,下面用一张图来说明:
2IO流的基类和分类
下面用一张表格详细讲解IO流的分类:
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
特殊流 | DataInputStream | DataOutputStream |
以上流都是继承四个抽象基类:
字节输入流:InputStream 字符输入流:Reader
字节输出流:OutputStream 字符输出流:Writer
为了更好的学习Java流体系,下面主要先从四个抽象基类开始分析。
3InputStream和OutputSteam
InputStream 字节输入流:继承自InputStream的流都是用于向程序中输入数据的。
OutputStream 字节输出流 :继承自OutputStream的流是程序用于向外输出数据的。
下面举个例子来说,继承自这两个流的文件字节操作流FileInputStream和FileOutputStream的使用。
例子:现在有个需求是要将一份音乐文件从e:\src复制到e:\dest。
public static void main(String[] args) {// TODO Auto-generated method stubString srcPath = "E:\\src\\media.mp4";
String destDir = "E:\\dest";
File destDirFile = new File(destDir);if (!destDirFile.exists()) {
destDirFile.mkdir();
}
FileInputStream fInputStream = null;
FileOutputStream fOutputStream = null;//从Src读:输入流//写入dest:输出流try {
fInputStream = new FileInputStream(srcPath);
fOutputStream = new FileOutputStream(destDirFile.getAbsolutePath()+File.separator+"cp_media.mp4");//循环通过输入流,读取数据,边读边写byte[] buff = new byte[100];int len=-1;while ((len=in.read(buff,0,buff.length))!=-1) {//返回值:是真实读取到的字节数,如果到了流的末尾,返回-1//通过输出流写出fOutputStream.write(buff,0,len);//推荐使用这个方法,读到多少字节就写入多少字节}
} catch (IOException e) {
}finally{try {if (fInputStream != null) {
fInputStream.close();
}if (fOutputStream != null) {
fOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}}}
4Reader 和Writer
Reader 字符输入流,继承自Reader的流都是用于向程序中输入数据的。
Writer 字符输出流,继承Writer的流都是向程序中输出的。
下面同样举个例子来说,继承自这两个流的文件字符操作流FileWriter和FileReader的使用。
例子:用FileWriter和FileReader完成文件的复制[把D盘中的Stream.txt复制到C盘的根目录下]
public static void main(String[] args) {
File filesrc=new File("D:\\iotest2\\Stream.txt");
File filedest=new File("C:\\"+"copy.txt"); try {
Reader in=new FileReader(filesrc);
Writer out=new FileWriter(filedest); char[]cs=new char[1024]; int len=-1;//实际的位置
while((len=in.read(cs,0,cs.length))!=-1){
out.write(cs,0,len);
}
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
5总结
今天主要是介绍了Java基础中很重要的IO流,主要讲了IO流的作用和分类。由于这块内容比较多,一篇文章讲完篇幅比较长,所以最重要的缓存流和转换流以及如何选择用哪些流来操作就明天继续更新了,欢迎大家继续关注本公众号的技术博文。