java io 学习
1,io 体系
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
Java.io包中定义了多个流类型类实现输入输出的功能,从不同的角度可以分为:
~按照数据流方向的不同可以分为输入流和输出流。
~按照按照数据处理单位的不同可以分为字节流和字符流。
如下几张图可以直观的描述io体系中的大部分类和关系.根据类名称就可以知道这个类大体是操作什么的.
![](https://images2015.cnblogs.com/blog/1012841/201701/1012841-20170113225728463-13076621.jpg)
![](https://images2015.cnblogs.com/blog/1012841/201701/1012841-20170113225731431-1172163899.jpg)
,2,一个简单的文件复制实例
File f1 = new File(args[0]); // 源文件的File对象 File f2 = new File(args[1]); // 目标文件的File对象 InputStream input = null; // 准备好输入流对象,读取源文件 OutputStream out = null; // 准备好输出流对象,写入目标文件 input = new FileInputStream(f1); out = new FileOutputStream(f2); int temp = 0; while ((temp = input.read()) != -1) { // 开始拷贝 out.write(temp); // 边读边写 } input.close(); // 关闭 out.close(); // 关闭
3,其他相关类
System类对io的支持
system.out其实就是一个打印流printstream,输出对象就是控制台,system.err也一样是printstream,两个其实没有区别,只是逻辑上err来处理错误的信息而已
system.in其实就是一个inputstream,输入的源是键盘等设备而已,在程序中直接用来当做inputstream来获取数据即可,在等待获取数据的时候,线程阻塞等待.
并且system类也提供了setout setin的方法,可以让用户自己定义数据的来源和去处.不过一般上也不去修改这个东西.
InputStream input = System.in ; // 从键盘接收数据 byte b[] = new byte[5] ; // 开辟空间,接收数据 System.out.print("请输入内容:") ; // 提示信息 int len = input.read(b) ; // 接收数据 System.out.println("输入的内容为:" + new String(b,0,len)) ; input.close() ; // 关闭输入流
bufferdreader类,用于从缓冲区中读取内容,先把从inputstream中读取到的字节数据放入到缓冲区然后在读出来.他的构造方法只能够接受字符输入流的实例,因此需要先用inputstreamreader将inputstream转换成reader后,使用,这里其实就体现了javaio体系中使用的一种设计模式,装饰模式( 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。)
BufferedReader buf = null ; // 声明对象 buf = new BufferedReader(new InputStreamReader(System.in)) ; // 将字节流变为字符流 String str = null ; // 接收输入内容 System.out.print("请输入内容:") ; try{ str = buf.readLine() ; // 读取一行数据 }catch(IOException e){ e.printStackTrace() ; // 输出信息 } System.out.println("输入的内容为:" + str) ;
scanner类,是java提供的专门方便使用 的输入数据类,还可以方便的对输入的数据进行验证,他的构造方法支持一个file参数或者一个inputstream参数,使用的时候,直接使用next系列方法,即可获得流中对应的数据.
File f = new File("D:" + File.separator + "test.txt"); // 指定操作文件 Scanner scan = null; scan = new Scanner(f); // 从键盘接收数据 StringBuffer str = new StringBuffer(); while (scan.hasNext()) { str.append(scan.next()).append('\n'); // 取数据 System.out.println("文件内容为:" + str); }
SequenceInputStream合并流,主要是讲两个文件内容合并一个.
InputStream is1 = null ; // 输入流1 InputStream is2 = null ; // 输入流1 OutputStream os = null ; // 输出流 SequenceInputStream sis = null ; // 合并流 is1 = new FileInputStream("d:" + File.separator + "a.txt") ; is2 = new FileInputStream("d:" + File.separator + "b.txt") ; os = new FileOutputStream("d:" + File.separator + "ab.txt") ; sis = new SequenceInputStream(is1,is2) ; // 实例化合并流 int temp = 0 ; // 接收内容 while((temp=sis.read())!=-1){ // 循环输出 os.write(temp) ; // 保存内容 }