`

Java学习系列(十)Java面向对象之I/O流(上)

 
阅读更多

IO流

我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存。面向IO流编程就是一种很好的选择。IO:Input/Output 完成输入输出,所谓输入:是指将外部存储器把数据读入内存,而输出:是指将内存中的数据写入外部存储器(如硬盘、磁盘、U盘)中。

File:代表磁盘上的文件或目录。它的特征是只能盘问磁盘上的文件和目录,但无法访问文件内容,必须使用IO流。

举例说明1(遍历根目录):

Java代码收藏代码
  1. publicclassFileTest{
  2. publicstaticvoidmain(String[]args){
  3. //列出系统中所有的根目录
  4. File[]roots=File.listRoots();
  5. for(Fileroot:roots){
  6. System.out.println(root);
  7. }
  8. //下面是相对路径,生成的mydir文件和src同一目录;
  9. //注意只有从根目录开始的路径才是绝对路径
  10. FilemyFile=newFile("mydir");
  11. if(!myFile.exists()){
  12. //创建相应目录
  13. myFile.mkdir();
  14. }
  15. }
  16. }

举例说明2(遍历某个磁盘上的所有文件):

Java代码收藏代码
  1. /**
  2. *@authorlhy
  3. *@description递归遍历某个磁盘下的所有目录及其子目录
  4. */
  5. publicclassFileTest{
  6. publicstaticvoidmain(String[]args){
  7. Filef=newFile("f:/");
  8. myList(f);
  9. }
  10. publicstaticvoidmyList(Filedir){
  11. System.out.println(dir+"目录下包含的目录和子文件有:");
  12. //返回当前目录所包含的目录和子文件
  13. File[]files=dir.listFiles();
  14. for(Filefile:files){
  15. System.out.println(""+file);
  16. //如果file是目录,继续列出该目录下的所有文件
  17. if(file.isDirectory()){
  18. myList(file);
  19. }
  20. }
  21. }
  22. }

举例说明3(过滤文件):

Java代码收藏代码
  1. publicclassFileTest{
  2. publicstaticvoidmain(String[]args){
  3. Filef=newFile("f:/");
  4. File[]files=f.listFiles(newFileFilter(){
  5. @Override
  6. publicbooleanaccept(Filepathname){
  7. try{
  8. //getCanonicalPath()规范路径名是绝对路径名,并且是惟一的。
  9. if(pathname.getCanonicalPath().endsWith(".txt")){
  10. returntrue;
  11. }
  12. }catch(IOExceptione){
  13. e.printStackTrace();
  14. }
  15. returnfalse;
  16. }
  17. });
  18. for(Filefile:files){
  19. System.out.println(file);
  20. }
  21. }
  22. }



IO流的分类(如果要访问文件内容,必须使用IO流):
a)按流的方向来分(从程序所在内存的角度来看):分为输入流、输出流。输入流是指将外部输入读入当前程序所在内存;而输出流是指将当前程序所在的内存的数据输出到外部。
b)按流处理的数据来分:分为字节流、字符流。字节流处理的数据单元是字节,适应性广、能共强大;而字符流处理的数据单元是字符,通常来说它主要用于处理文本文件,而且它在处理文本文件时比字节流更方便。
c)按流的角色来分:分为节点流、包装流(处理流/过滤流)。节点流直接和一个IO的物理节点(磁盘上的文件、键盘、网络等)关联;而包装流以节点为基础,经包装之后得到的流。

流的概念模型
输入流:只要你得到一个输入流对象,你就相当于得到一根“水管”,每个水滴就代表数据单元(字节/字符)。
输出流:只要你得到一个输出流对象,你也相当于得到一根“水管”,水管中无水滴。

下面讲下IO里面常用的几个类。

FileInputStream类的使用:

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. //准备水桶,可以装“1024”个水滴(数据单元)
  4. byte[]bt=newbyte[1024];
  5. FileInputStreamfis=null;
  6. try{
  7. fis=newFileInputStream("f:/Test.java");
  8. inthasRead=-1;
  9. while((hasRead=fis.read(bt))>0){
  10. System.out.println(newString(bt,0,hasRead));
  11. }
  12. }catch(Exceptione){
  13. e.printStackTrace();
  14. }finally{
  15. try{
  16. fis.close();
  17. }catch(IOExceptionex){
  18. ex.printStackTrace();
  19. }
  20. }
  21. }
  22. }

FileOutputStream类的使用:

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. FileOutputStreamfos=null;
  4. try{
  5. fos=newFileOutputStream(newFile("f:/1.txt"));
  6. fos.write("Java学习系列(十)Java面向对象之I/O流".getBytes());
  7. }catch(IOExceptione){
  8. e.printStackTrace();
  9. }finally{
  10. try{
  11. fos.close();
  12. }catch(IOExceptione){
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }

文件的复制:

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. FileOutputStreamfos=null;
  4. FileInputStreamfis=null;
  5. try{
  6. fis=newFileInputStream(newFile("f:/Test.java"));
  7. fos=newFileOutputStream(newFile("f:/Copy.java"));
  8. inthasRead=-1;
  9. //作為水桶
  10. byte[]buff=newbyte[1024];
  11. while((hasRead=fis.read(buff))>0){
  12. fos.write(buff,0,hasRead);
  13. }
  14. }catch(IOExceptione){
  15. e.printStackTrace();
  16. }finally{
  17. try{
  18. fis.close();
  19. fos.close();
  20. }catch(IOExceptione){
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }

ByteArrayOutputStream的使用:

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. ByteArrayOutputStreambos=newByteArrayOutputStream();
  4. Stringstr="你好,世界!";
  5. try{
  6. bos.write(str.getBytes());
  7. System.out.println(newString(bos.toByteArray()));
  8. }catch(IOExceptione){
  9. e.printStackTrace();
  10. }finally{
  11. try{
  12. bos.close();
  13. }catch(IOExceptione){
  14. e.printStackTrace();
  15. }
  16. }
  17. }
  18. }


缓冲流:我们知道外部存储器的速度要比内存速度慢,所以外部存储器的读写与内存的读写是不同步的。注意:流用完了,别忘了调用flush(把缓冲中的内容刷入实际的节点)或者调用close()也可-系统会在关闭之前,自动刷缓冲。

节点流与缓冲流的联系:
节点流:直接与IO节点关联,--IO节点很多:键盘、网络、文件、磁带....
过滤流:建立在节点流的基础之上。

好处:消除底层节点之间的差异。使用过滤流的方法执行IO更加便捷。

PrintStream的使用:

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. PrintStreamps=null;
  4. try{
  5. //过滤流
  6. ps=newPrintStream(newFileOutputStream("f:/1.txt"));
  7. ps.println("春");
  8. ps.println("夏");
  9. ps.println("冬");
  10. ps.println("冬");
  11. }catch(FileNotFoundExceptione){
  12. e.printStackTrace();
  13. }
  14. }
  15. }

重定向标准输入输出
System.setOut(new PrintStream("out.txt"));//将标准输出重定向到指定的输出流 -->out.txt

将字节流装换为字符流(使用BufferedReader可以每次读一行):

Java代码收藏代码
  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. BufferedReaderbr=null;
  4. try{
  5. br=newBufferedReader(newInputStreamReader(newFileInputStream(
  6. "f:/Test.txt")));
  7. StringhasLine=null;
  8. while((hasLine=br.readLine())!=null){
  9. System.out.println(hasLine);
  10. }
  11. }catch(IOExceptione){
  12. e.printStackTrace();
  13. }finally{
  14. try{
  15. br.close();
  16. }catch(Exceptione2){
  17. }
  18. }
  19. }
  20. }

规律】除DataInputStream和DataOuputStream(这两个类后面会讲)这两个特殊的过滤流外,其它所有以Stream结尾的都是字节流,所有以Reader/Writer结尾的结尾的都是字符流。还有两个类:InputStreamReader、OutputStreamWriter是转换类,负责将字节流转换成字符流。

结束语

由于IO流的的内容比较多,所以打算分两次讲。

分享到:
评论

相关推荐

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...

    基于I/O、多线程、GUI的标准考试系统v1.0(JAVA实现)

    本系统是基于JAVA开发平台,运用Socket网络编程,I/O文件流,线程,Swing图形界面等技术,实现的一套标准化考试系统。通过该系统可以完成多个科目的标准化考试工作。 该系统共分为三个模块:考生客户端,服务器端和...

    Java知识点总结大全(五) -- IO流.xmind

    Java知识点总结大全(五) -- io流,关注后面会分享面向对象,io,集合,多线程,网络,sql的总结

    Java面向对象程序设计:第2版:英文

    全书共12章,内容包括面向对象程序设计概述,Java语言概述,Java语言基础,类、对象和接口,包和Java基础类,Java异常处理,Java图形用户界面设计,Applet及其应用,I/O系统,多线程编程,多媒体编程和网络编程等。

    java面向对象File (I O)

    操作文件或目录的属性,读写文本文件,二进制文件的读写

    java面向对象

    《Java面向对象程序设计》通过丰富、实用的精选实例系统地介绍了使用Java语言进行面向对象程序设计的方法和技术,注重提高读者运用Java语言和面向对象技术解决实际问题的能力。全书共12章,内容包括面向对象程序设计...

    Java 面向对象(继承、多态、接口、异常).ppt

    掌握类的继承、方法重写、super关键字的使用、final关键字、抽象类和接口、多态的使用以及异常的处理方式 熟悉面向对象继承和多态的概念

    java学习文档(快速学习-非常使用)

    Day1 一、 从面向过程编程到面向对象编程的思维转变 二、 什么是字节码和虚拟机: 三、 环境变量的设置 四、 kate工具的使用 五、 我们的第一个Java程序 ...一.I/O 流(java 如何实现与外界数据的交流)

    Java程序设计与开发源代码

    本书以Java语言面向对象的编程理念为出发点,循序渐进地介绍Java语言...通过融入Java面向对象的编程思想,使读者在学习理论知识的同时,初步掌握面向对象的系统分析、设计与开发能力,为大型软件的设计和开发奠定基础。

    JAVA SE 开发手册.CHM

    8、JAVA面向对象之函数、堆和栈、访问修饰符 9、JAVA面向对象关键字 10、JAVA面向对象抽象类abstract 11、JAVA面向对象接口interface 12、JAVA面向对象之内部类、匿名内部类 13、JAVA集合框架之简介 14、JAVA...

    java 坦克大战 (只是点线程面向对象和流)

    这是一个坦克大战的小游戏,虽然是个游戏,但是他对于初学java的人来说是个很好的练习运用知识的地方。它涵盖了java很多种的方面如 java线程、javaI/O流、java集合、最重要的是java面向对象的思想。

    基于 Java Swing + 人脸识别编写的学校考试系统源代码Java基础大作业

    几乎涵盖了 Java 基础面向对象,封装继承多态,I/O 流,多线程,网络,数据库的所有知识 项目用到的主要技术 利用阿里云的短信API服务提供登录注册时的短信发送 利用 Java Mail 实现发送邮件 用户密码采用 MD5 加盐...

    java_diary_18.rar_JFC_swing_反射机制_国际化 java

    Day03:面向对象 Day04:修饰符与类权限 Day05:类与接口 Day06:集合类型 Day07:反射机制与内部类 Day08:异常与Swing图形界面 Day09:swing图形界面与AWT事件模型 Day10:JFC基础类库(具体类查看API) Day11:多...

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    第5章 Java面向对象程序设计(上) 第6章 Java面向对象程序设计(下) 第7章 Java异常处理机制 第8章 Java反射机制 第9章 数据结构与集合类 第3篇 图形用户界面 第10章 Java Swing(上) 第11章 Java Swing(下) 第...

    JAVA清华大学教程

    ★ 第四讲 Java的例外处理和I/O流 ◇课前索引 ◇4.1 什么是例外 ◇4.2 例外的处理 ◇4.3 自定义例外类的使用 ◇4.4 I/O 流概述 ◇4.5 文件处理 ◇4.6 过滤流 ◇4.7 字符流的处理 ◇4.8 对象的串行化 ◇...

    Java实训项目——嗖嗖移动大厅(详细注解)

    Java实训项目,综合面向对象、I/O、实用类、集合框架等知识点

    编程课件+Java系列课程+PPT课件+Java教学

    Java是一种跨平台、面向对象的编程语言,广泛应用于企业级应用、移动应用、游戏开发等领域。本教程为初学者设计,旨在快速掌握Java编程的核心概念。 一、Java入门 - Java概述:介绍Java的历史、特点和应用领域。 -...

    清华大学JAVA教程

    这是清华大学的一套JAVA教程,包括详尽的例子、课后习题与解答、相关计算机英语词汇,就课程...同时Java语言是一门面向对象的语言,通过学习可以掌握用面向对象进行编程的思想和实践,使学生成为一名合格的Java程序员。

    《Java基础入门(第3版)》(Java):课后答案-docx文档

    1.内容概要: 包括《Java基础入门(第3版)》的课后习题答案 2.适用人群: Java初学者 ...(4)学习常用的Java库和框架:了解Java的常用库和框架,如集合、I/O流、多线程等,可以帮助你更好地编写代码。

    Java学习路线.pdf

    面向对象编程:Java 是一门面向对象的编程语言,因此需要学习面向对象的概念、封装、继承、多态等。同时还需学习类、对象的创建和使用、方法的定义和调用等知识。 核心类库:Java 提供了丰富的核心类库,包括集合...

Global site tag (gtag.js) - Google Analytics