9 输入输出及文件操作
本章内容 1 输入输出概述 流的层次/ 流的分类 2 字节流类 基本的输入输出示例 2 字节流类 基本的输入输出示例 FileInputStream和FileOutputstream BufferedInputStream和BufferedOutputStream DataInputStream和DataOutputStream 3字符流类 Reader和Writer FileReader和FileWriter BufferedReader和BufferedWriter 4 文件操作
9.1 输入输出概述 流模型建立在从某个数据源到数据池的数据传输基础上(from source to sink),也就是说把不同的输入/输出源(键盘,文件,网络连接)等抽象表示为“流”。 流编程相关API封装在java.io包中。
9.1 输入输出概述 流的层次
9.1 输入输出概述(续) 流的分类 按数据的流向分为输入流和输出流。流是单向的,流提供数据是输入流,向流中写数据是输出流。 按流的数据单位大小分字符流和字节流。 按功能不同可以分为节点流和处理流。 字节流 字符流 输 入 InputStream Reader 输 出 OutputStream Writer
9.2 字节流类(InputStream) 字节输入流InputStream是抽象类,定义了字节输入流的框架。 它的最重要的三个方法(输入流提供数据输入): int read() int read(byte[] buffer) int read(byte[] buffer, int offset, int length) 大部分子类的命名是XxxInputStream,例如FileInputStream,DataInputStream
9.2 字节流类(OutputStream) 字节输出流OutputStream是抽象类,定义了字节输出流的功能. 它的最重要的三个方法(提供数据输出): void write(int c) void write(byte[] buffer) void write(byte[] buffer, int offset, int length) 大部分子类的命名是XxxOutputStream,例如FileOutputStream,DataOutputStream
示例: TestInAndOut.java TestInputStreamAndOutputStream.java 文件复制(CopyFile1.java)。 文件复制(CopyFile2.java)
9.3 字符流类(Reader & Writer) Reader和Writer类是一切字符流的超类。它们封装的功能大致和InputStream,OutputStream一样,子类命名常为XxxReader,XxxWriter。以下为两个类的主要API方法: int read(); int read(char[] cbuf); int read(char[] cbuf, int offset, int length); void write(int c); void write(char[] cbuf); void write(char[] cbuf, int offset, int length); void write(String s); void write(String s, int offset, int length);
示例: 重写Copy1.java(CopyFileByChar ) 重写Copy2.java 读具有一定逻辑结构数据文件 。 读具有一定逻辑结构数据文件 。 数组复制(ArrayCopy.java)。
补充:节点流和处理流 节点流(node stream): 可以从/向一个特定的地方(节点)读写数据,例如磁盘或者一块内存。 处理流(processing stream): 是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能 二者的区分大致可以从构造器参数中或类名称中看出来。
I/O Stream Chaining
Java提供System类的3个静态属性对应系统的输入和输出. 这3个属性分别对应Inputstream,PrintStream的对象. 标准输入和标准输出 Java提供System类的3个静态属性对应系统的输入和输出. 这3个属性分别对应Inputstream,PrintStream的对象. System.out 提供向“标准输出”写出数据的功能 System.out为 PrintStream类型. System.in 提供从“标准输入”读入数据的功能 System.in 为InputStream类型. System.err提供向“标准错误输出”写出数据的功能 System.err为 PrintStream类型.
System.out/System.err的println/print方法 print和println方法针对多数数据类型进行了重写 (boolean, char, int, long, float, double以及char[], Object和 String). print(Object)和println(Object)方法中调用了参数的toString()方法,再将生成的字符串输出
为了使用方便,经常将System.in用各种处理流进行封装处理,如: BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); br.readLine(); 利用BufferedReader()类的方法读取终端上输入的字符数据,将其转换成int类型数据并进行计算 示例:TestBufferedReader.java
9.4 File类 File类对象提供如下功能: 表示一个文件或目录的路径名称。 可以获得文件的属性信息。 判断是否为目录或文件,是否存在等。 文件系统的遍历。 File类对象不提供文件内容的操作。 应该使用相对路径访问文件。 见例子(TestFile.java)
9.4 File类(File类的方法) java.io包中定义与数据输入、输出功能有关的类,包括提供文件操作功能的File类 f = new File("Test.java"); f = new File("E:\\ex\\","Test.java"); 在Java中,将目录也当作文件处理。File类中提供了实现目录管理功能的方法。 File path = new File("E:\\ex\\"); File f = new File(path, "Test.java");
9.4 File类(File类的方法) 获取常规文件信息操作 long lastModified() long length() 关于文件/目录名操作 String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo(File newName) File 测试操作 boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute(); 获取常规文件信息操作 long lastModified() long length() boolean delete() 目录操作 boolean mkdir() String[] list() 示例:列出所有文件 ListFile2.java
再说文件输入输出流 文件输入 可使用FileReader类以字符为单位从文件中读入数据 可使用BufferedReader类的readLine方法以行为单位读入一行字符 文件输出 可使用FileWriter类以字符为单位向文件中写出数据 使用PrintWriter类的print和println方法以行为单位写出数据 例 File MyFile=new File("MyTextFile"); DataInputStream din=new DataInputStream(new FileInputStream(MyFile)); Data OutputStream dour=new DataOutputStream(new FileOutputStream (MyFile));
RandomAccessFile类 RandomAccessFile类提供以随机方式读写文件数据,也定义在java.io包中。 该类定义: public class RandomAccessFile implements DataInput, DataOutput 主要提供各种基本数据类型及字符串数据的随机读写操作。 实现了DataInput,DataOutput接口,可以使用多种方法读取不同格式的数据. 该类还提供了文件指针的定位操作(seek)。 见例子(RAFExample.java)。
总结