File类
File类是 IO 包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操纵文件
File f = new File("d:/test/1.txt");
常用方法见 API
delete 方法删除由File对象的路径所表示 对磁盘文件或目录。如果删除的对象是目录,该目录中的内容必须为空。
节点流
我们将IO流类分为两个大类,节点流类和过滤流类(也叫处理流类)。
1. 程序用于直接操作目标设备所对应的类叫节点流类
2. 程序也可以通过一个间接流类去调用结点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是过滤流类(也叫处理流类)
InputStream 与 OutputStream (抽象类[字节流])
程序可以从中连续 读取字节 的对象叫输入流,用InputStream类完成
int read() // 返回 -1 表示遇到流的末尾,结束 int read(byte[] b) //读入b.length个直接放入到b中并返回实际读入的字节数 int read(byte[] b,int off,int len) void close() //关闭,通知系统释放与这个流相关的资源 |
程序能向其中连续 写入字节 的对象叫输出流,用OutputStream类完成
void write(int b) //将一个直接写到输入流 void write(byte[] b) //将整个直接数组写到输出流中 void write(byte[] b,int off,int len) // void flush() //彻底完成输出并清空缓冲区 void close() //关闭输出流 |
这里的输入输出是针对程序而言的,而非文件。
输入: 程序读取 输出:程序写出
将A文件的内容写入文件B中:
我们应该创建一个输入类来完成对A文件的操作,再创建一个输出类来完成对B文件的操作。
FileInputStream 与 FileOutputStream
这两个源节点用来操作磁盘文件,在创建一个FileInputStream对象时通过构造函数指定文件的路径和名字,当然这个文件应当是存在的和可读的。在创建一个FileOutputStream对象时指定文件如果存在将要被覆盖。
只能用来读取字节或字节数组!!!因此字符串需要使用getBytes()方法转为字节数组。
注:unicode是双字节的,而ASCII是单字节的。
java中的字符默认使用unicode编码!
编程实现利用FileOutputStream类向文件写入一串字符,并用FileInputStream读出:
public class FileStreamDemo { public static void main(String[] args) { File f = new File("Hello.txt"); //输出到文件中 try { FileOutputStream out = new FileOutputStream(f); byte buf[] = "hello,well".getBytes();//转成字节输出 out.write(buf); out.close(); } catch (Exception e) { e.printStackTrace(); } //从文件中读出显示到屏幕上 try { FileInputStream in = new FileInputStream(f); byte[] buff = new byte[1024]; int len = in.read(buff); System.out.println(new String(buff,0,len)); } catch (Exception e) { e.printStackTrace(); } } } |
为什么要 close ?
Java垃圾回收器只能管理程序中的类的实例对象,没法去管理系统产生的资源,所以程序要调用 close 方法,去通知系统去释放其自身产生的资源。
这两个类都只提供了对字节或字节数组进行读出的方法。对于字符串的读写,我们还需要进行额外的转换。
Reader和Writer
1. 抽象类,用于直接读取字符串文本
2. Java为字符文本(直接读取字符串)的输入输出专门提供的一套单独的类,其在处理字符串时简化了我们的编程。
对上面的程序进行如下的修改:—— 使用FileWriter 和 FileReader类来实现直接对字符串的读取:
public class FileStreamDemo2 { public static void main(String[] args) { File f = new File("Hello.txt"); try { FileWriter out = new FileWriter(f); out.write("hello world,hahaha"); out.close(); } catch (Exception e) { e.printStackTrace(); } try { FileReader in = new FileReader(f); char[] buf = new char[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); } catch (Exception e) { e.printStackTrace(); } } } |
FileReader的真正优势要结合包装流类才能体现出来!!
PipedInputStream 与 PipedOutputStream
一个PipeInputStream对象必须和一个PipedOutputStream对象进行连接而产生一个通信管道。
这两个类主要来完成线程之间的通信。 --- p 266
一个线程的PipedInputStream对象能够从另一个线程的PipedOutputStream对象中读取数据。
void connect(PipedOutputStream src)使此管道输入流连接到管道输出流 src。
JDK还提供了PipedWriter和PipedReader这两个类来用于字符串文本的管道通信。
使用管道流,可以实现各个程序模块之间的松耦合通信。
ByteArrayInputStream 与 ByteArrayOutputStream
1. 使用字节数组作为数据源
2. 作用:使用IO流的方式来完成对字节数组内容的读写
IO程序代码的复用
由于没有编码为 -1 的字符,所以OS使用 -1 作为硬盘上的每个文件的结尾标记
文本文件与二进制文件:
1. 如果一个文件专用于存储文本字符的数据,没有包含字符之外的其他数据,我们称之为文本文件
2. 除此之外的文件就是二进制文件
为了支持标准输入输出设备,Java定义了两个特殊的流对象:System.in 和 System.out
System.in 对应键盘,是InPutStream类型的,从键盘读取数据
System.out 对应屏幕,是PrintStream类型的
Scanner类
该类不属于IO类,而属于util类
它是一个可以用正则表达式来解析基本类型和字符串的简单文本扫描器
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的next 方法将得到的标记转换为不同类型的值。
例如从键盘读取一行输入:
<span style="font-size:14px;"> Scanner cin = new Scanner(System.in);
String name = cin.nextLine();</span>
过滤流与包装流:
--- 即中间类,为哦我们往IO设备中写入各种类型的数据提供了帮助
DataOutputStream
writeBoolean()
writeShort()
writeChar()
writeInt()
......
程序 ---> 包装流类 ----> 节点流类 ---> 目标
输入包装类 -- see p273 的例子
输出包装类 --
包装流的使用:
DataOutputStream(OutputStream out) //将OutputStream包装为DataOutputStream
BufferedInputStream 与 BufferOutputStream
---缓冲流:对IO进行缓冲
利用缓冲流来进行改善性能
构造方法:
BufferedInputStream(InputStream in)
创建一个带有32直接缓冲区的缓冲流
BufferedInputStream(InputStream in, int size)
创建具有指定缓冲区大小的缓冲区
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
DataInputStream 与 DataOutputStream
———— 提供了可读写各种基本数据类型数据的各种方法
DataOutputStream提供了3种写入字符串的方法:
1. writeBytes(String s)
2. writeChars(String s)
3. writeUTF(Strng s)
PrintStream类
提供了一系列的print和println方法,可以实现将基本数据类型的格式化成字符串输出。
构造函数:
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoflush)
PrintStream(OutputStream out, boolean autoflush, String encoding)
autoflush控制java在遇到换行符(\n)时是否自动清空缓冲区
Java的PrintStream对象具有多个重载的Print和Println方法
在Windows的文本换行是 “\r\n” 而Linux下的文本换行是“\n”
PrintWriter的println方法能根据不同的操作系统生成相应的换行符
PrintWriter类 -- 与PrintStream相对应
该类若设置autoFlush, 其会在使用了println方法后使用自动清空缓冲区
ObjectInputStream 与 ObjectOutputStream
用于存储和读取对象的输入输出流类。