一、IO(Input Output)流
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的对象都在IO包中
- 流按操作数据分为两种:字节流和字符流
- 流按流向分为:输入流和输出流
二、IO流常用基类
- 字节流的抽象基类:InputStream OutputStream
- 字符流的抽象基类:Reader Writer
- 注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
- 如:InputStream 的子类FileInputStream Reader的子类FileReader
- 流的重要操作是读和写
- 读和写都会发生IOException
三、Writer字符输出流
- 写入字符流的抽象类。
- 子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
- 但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
- 直接已知子类:
- BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
public abstract class Writer implements Appendable, Closeable, Flushable
{
/**
*刷新该流的缓冲。
*如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。
*然后,如果该目标是另一个字符或字节流,则将其刷新。
*因此,一次 flush() 调用将刷新 Writer 和 OutputStream 链中的所有缓冲区。
*/
public abstract void flush()
throws IOException;
/**
*关闭此流,但要先刷新它。
*在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。
*关闭以前关闭的流无效。
*/
public abstract void close()
throws IOException;
//写入字符数组的某一部分。
public abstract void write(char[] cbuf,
int off,
int len)
throws IOException;
//写入字符数组。
public void write(char[] cbuf)
throws IOException{}
//写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略
public void write(int c)
throws IOException{}
//写入字符串。
public void write(String str)
throws IOException{}
//写入字符串的某一部分。
public void write(String str,
int off,
int len)
throws IOException{}
}
四、OutputStreamWriter
- OutputStreamWriter 是字符流通向字节流的桥梁:
- 可使用指定的 charset 将要写入流中的字符编码成字节。
- 它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
- 每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。
- 在写入底层输出流之前,得到的这些字节将在缓冲区中累积。
- 可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。
- 注意,传递给 write() 方法的字符没有缓冲。
- 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
public class OutputStreamWriter extends Writer
{
//创建使用默认字符编码的 OutputStreamWriter
public OutputStreamWriter(OutputStream out){}
//创建使用指定字符集的 OutputStreamWriter。
public OutputStreamWriter(OutputStream out,
String charsetName)
throws UnsupportedEncodingException{}
//返回此流使用的字符编码的名称。
public String getEncoding(){}
//其余方法继承自Writer和Object
}
五、FileWriter
- 用来写入字符文件的便捷类。
- 此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
- 要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
- 文件是否可用或是否可以被创建取决于底层平台。
- 特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。
- 在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
- FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream。
public class FileWriter extends OutputStreamWriter
{
/**
*根据给定的 File 对象构造一个 FileWriter 对象。
*IOException - 如果该文件存在,但它是一个目录,而不是一个常规文件;
*或者该文件不存在,但无法创建它;抑或因为其他某些原因而无法打开它
*/
public FileWriter(File file)
throws IOException{}
//根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
public FileWriter(File file,
boolean append)
throws IOException{}
//根据给定的文件名构造一个 FileWriter 对象。
public FileWriter(String fileName)
throws IOException{}
//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象
public FileWriter(String fileName,
boolean append)
throws IOException{}
//其余方法全部继承自OutputStreamWriter
}