IO流
我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存。面向IO流编程就是一种很好的选择。IO:Input/Output 完成输入输出,所谓输入:是指将外部存储器把数据读入内存,而输出:是指将内存中的数据写入外部存储器(如硬盘、磁盘、U盘)中。
File:代表磁盘上的文件或目录。它的特征是只能盘问磁盘上的文件和目录,但无法访问文件内容,必须使用IO流。
举例说明1(遍历根目录):
public class FileTest { public static void main(String[] args) { // 列出系统中所有的根目录 File[] roots = File.listRoots(); for (File root : roots) { System.out.println(root); } // 下面是相对路径,生成的mydir文件和src同一目录; // 注意只有从根目录开始的路径才是绝对路径 File myFile = new File("mydir"); if (!myFile.exists()) { // 创建相应目录 myFile.mkdir(); } } }
举例说明2(遍历某个磁盘上的所有文件):
/** * @author lhy * @description 递归遍历某个磁盘下的所有目录及其子目录 */ public class FileTest { public static void main(String[] args) { File f = new File("f:/"); myList(f); } public static void myList(File dir) { System.out.println(dir + "目录下包含的目录和子文件有:"); // 返回当前目录所包含的目录和子文件 File[] files = dir.listFiles(); for (File file : files) { System.out.println(" " + file); // 如果file是目录,继续列出该目录下的所有文件 if (file.isDirectory()) { myList(file); } } } }
举例说明3(过滤文件):
public class FileTest { public static void main(String[] args) { File f = new File("f:/"); File[] files = f.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { try { // getCanonicalPath()规范路径名是绝对路径名,并且是惟一的。 if (pathname.getCanonicalPath().endsWith(".txt")) { return true; } } catch (IOException e) { e.printStackTrace(); } return false; } }); for (File file : files) { System.out.println(file); } } }
IO流的分类(如果要访问文件内容,必须使用IO流):
a)按流的方向来分(从程序所在内存的角度来看):分为输入流、输出流。输入流是指将外部输入读入当前程序所在内存;而输出流是指将当前程序所在的内存的数据输出到外部。
b)按流处理的数据来分:分为字节流、字符流。字节流处理的数据单元是字节,适应性广、能共强大;而字符流处理的数据单元是字符,通常来说它主要用于处理文本文件,而且它在处理文本文件时比字节流更方便。
c)按流的角色来分:分为节点流、包装流(处理流/过滤流)。节点流直接和一个IO的物理节点(磁盘上的文件、键盘、网络等)关联;而包装流以节点为基础,经包装之后得到的流。
【流的概念模型】
输入流:只要你得到一个输入流对象,你就相当于得到一根“水管”,每个水滴就代表数据单元(字节/字符)。
输出流:只要你得到一个输出流对象,你也相当于得到一根“水管”,水管中无水滴。
下面讲下IO里面常用的几个类。
FileInputStream类的使用:
public class Test { public static void main(String[] args) { // 准备水桶,可以装“1024”个水滴(数据单元) byte[] bt = new byte[1024]; FileInputStream fis = null; try { fis = new FileInputStream("f:/Test.java"); int hasRead = -1; while ((hasRead = fis.read(bt)) > 0) { System.out.println(new String(bt, 0, hasRead)); } } catch (Exception e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
FileOutputStream类的使用:
public class Test { public static void main(String[] args) { FileOutputStream fos = null; try { fos = new FileOutputStream(new File("f:/1.txt")); fos.write("Java学习系列(十)Java面向对象之I/O流".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
文件的复制:
public class Test { public static void main(String[] args) { FileOutputStream fos = null; FileInputStream fis = null; try { fis = new FileInputStream(new File("f:/Test.java")); fos = new FileOutputStream(new File("f:/Copy.java")); int hasRead = -1; // 作為水桶 byte[] buff = new byte[1024]; while ((hasRead = fis.read(buff)) > 0) { fos.write(buff, 0, hasRead); } } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
ByteArrayOutputStream的使用:
public class Test { public static void main(String[] args) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); String str = "你好,世界!"; try { bos.write(str.getBytes()); System.out.println(new String(bos.toByteArray())); } catch (IOException e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
缓冲流:我们知道外部存储器的速度要比内存速度慢,所以外部存储器的读写与内存的读写是不同步的。注意:流用完了,别忘了调用flush(把缓冲中的内容刷入实际的节点)或者调用close()也可-系统会在关闭之前,自动刷缓冲。
节点流与缓冲流的联系:
节点流:直接与IO节点关联,--IO节点很多:键盘、网络、文件、磁带....
过滤流:建立在节点流的基础之上。
好处:消除底层节点之间的差异。使用过滤流的方法执行IO更加便捷。
PrintStream的使用:
public class Test { public static void main(String[] args) { PrintStream ps = null; try { // 过滤流 ps = new PrintStream(new FileOutputStream("f:/1.txt")); ps.println("春"); ps.println("夏"); ps.println("冬"); ps.println("冬"); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
重定向标准输入输出。
System.setOut(new PrintStream("out.txt"));//将标准输出重定向到指定的输出流 -->out.txt
将字节流装换为字符流(使用BufferedReader可以每次读一行):
public class Test { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream( "f:/Test.txt"))); String hasLine = null; while ((hasLine = br.readLine()) != null) { System.out.println(hasLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (Exception e2) { } } } }
【规律】除DataInputStream和DataOuputStream(这两个类后面会讲)这两个特殊的过滤流外,其它所有以Stream结尾的都是字节流,所有以Reader/Writer结尾的结尾的都是字符流。还有两个类:InputStreamReader、OutputStreamWriter是转换类,负责将字节流转换成字符流。
结束语
由于IO流的的内容比较多,所以打算分两次讲。
相关推荐
Java的I/O流系统是基于面向对象的设计,提供了一种统一的方式来处理不同类型的输入和输出源。它将数据的流动抽象为流,流可以是来自键盘、磁盘文件、网络连接等的数据源或目标。I/O流分为字符流和字节流两大类,分别...
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
本系统是基于JAVA开发平台,运用Socket网络编程,I/O文件流,线程,Swing图形界面等技术,实现的一套标准化考试系统。通过该系统可以完成多个科目的标准化考试工作。 该系统共分为三个模块:考生客户端,服务器端和...
13. **I/O流**:Java的I/O流系统支持数据的输入和输出,包括字符流和字节流,以及过滤流、缓冲流、对象序列化等高级功能。 14. **反射**:反射机制允许程序在运行时动态获取类的信息(如类名、方法名等)并调用方法...
学习Java面向对象编程,需要不断地实践和探索。通过编写实际的项目,将理论知识与实际应用相结合,可以更好地理解和掌握这些概念。随着技能的提升,你将能够利用Java的强大功能解决复杂的问题,开发出高效、稳定的...
《Java面向对象程序设计》是Java编程学习的重要教材,作者张亦辉以其深入浅出的讲解方式,引领读者进入面向对象的世界。这份压缩包包含了书中各个章节的例题源代码,是学习和理解Java面向对象编程概念的宝贵资源。...
综上所述,《Java面向对象程序设计(第二版)》所涉及的知识点大致涵盖了面向对象编程的核心概念、类与对象、接口与抽象类、包的使用、异常处理机制、集合框架,以及I/O操作等。这些知识点构成了Java编程语言的基础...
Java学习系列(十):Java面向对象之I/O流(上) 本章节主要讲解Java的I/O流,包括字节流、字符流、BufferedReader类、BufferedWriter类等。 Java学习系列(十一):Java面向对象之I/O流(下) 本章节主要讲解...
Java知识点总结大全(五) -- io流,关注后面会分享面向对象,io,集合,多线程,网络,sql的总结
I/O流在Java中被设计为一系列的类和接口,它们构成了一个层次结构,使得程序员可以方便地处理各种类型的输入输出操作。Java的I/O系统主要分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流...
从基本概念到深入应用,教案内容覆盖了Java I/O编程的方方面面,不仅有助于学习者掌握Java I/O流的操作,更能够帮助他们理解Java I/O流设计的深层含义。通过本教案的学习,程序员可以充分利用Java提供的I/O流功能,...
《Java语言与面向对象程序设计(第2版)》是一本深入探讨Java编程语言和面向对象设计理念的教材,特别适合初学者和有一定基础的学习者。本课程的重点在于理解和掌握Java的核心概念,以及如何利用这些概念进行高效的...
全书共12章,内容包括面向对象程序设计概述,Java语言概述,Java语言基础,类、对象和接口,包和Java基础类,Java异常处理,Java图形用户界面设计,Applet及其应用,I/O系统,多线程编程,多媒体编程和网络编程等。
Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)的理念,强调将现实世界的问题抽象为类和对象,从而更高效、更直观地进行软件开发。这个压缩包包含了一系列的Java源代码示例,由...
Java面向对象程序设计 Java面向对象程序设计是一本由莫雷利、王尔德合著的图书,出版于2008年 oleh 清华大学出版社。该书全面系统地讲述了Java语言的面向对象程序设计,涵盖了Java语言的基础知识、基本语法、编程...
Java标准版(Java SE)提供了一套丰富的类库,包括I/O流、集合框架、网络编程、多线程、异常处理等。例如,集合框架(如List, Set, Map)提供了存储和操作对象的有效方式,而线程机制使得Java能够实现并发执行,提高...
面向对象程序设计是现代软件开发的核心思想之一,Java语言作为其典型代表,因其强大的跨平台能力和丰富的类库,成为广大开发者首选的编程语言之一。本书《面向对象程序设计-Java》由张白一编著,旨在帮助初学者理解...
### JAVA面向对象编程知识点概述 #### 一、面向对象编程基础 面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计思想,它将数据和操作数据的方法定义为统一的整体——对象(Object),并通过类...