在 java.io 包中,包含了输入输出操作所需的类。
I/O 流可以安装不同的标准分类:
按照流的方向分类: 输入流:将信息从代码外部输入代码输出流:将代码得到的数据输出到文件、网络、内存等地方按照流的分工分类: 节点流:访问磁盘、网络等获取数据的流,可以直接实例化处理流:对信息进行加工转换的流,需要基于节点流实例化按处理数据的类型分类: 面向字符的流:处理字符数据,自动实现 Java 内部格式(16 bit char 类型)与外部格式(UTF-8 等)的转换。基类是 Reader 和 Writer面向字节的流:处理一般数据,基类是 InputStream 和 OutputStream所有的字符输入流都继承自 Reader 类。
常用的字符输入流有:BufferedReader、InputStreamReader、FilterReader、StringReader、PipedReader、CharArrayReader。
所有的字符输出流都继承自 Writer 类。
常用的字符输出流有:BufferedWriter、OutputStreamWriter、FilterWriter、StringWriter、PipedWriter、CharArrayWriter。
所有的字节输入流都继承自 Writer 类。
常用的字节输入流有:FileInputStream、FilterInputStream(子类 BufferedInputStream)、ByteArrayInputStream。
所有的字节输出流都继承自 Writer 类。
常用的字节输出流有:FileOutputStream、FilterOutputStream(子类 BufferedOutputStream)、ByteArrayOutputStream。
这两个类用于按字节读写文件。
可以用用字符串类型的文件名或文件对象创建 FileInputStream 类的对象。
使用字符串类型的文件名创建输入流对象读取文件: InputStream f = new FileInputStream("C:/java/hello"); 使用文件对象来创建输入流对象读取文件。首先得使用 File() 方法来创建一个文件对象: File f = new File("C:/java/hello"); InputStream out = new FileInputStream(f);FileInputStream 对象的常用方法:
方法名描述public void close() throws IOException{}关闭此文件输入流并释放与此流有关的所有系统资源protected void finalize()throws IOException {}清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法public int read()throws IOException{}从 InputStream 对象读取一个字节的数据。返回为整数值。如果已经到结尾则返回-1。public int read(byte[] r) throws IOException{}从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。public int available() throws IOException{}返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。如果文件不存在,FileOutputStream 会先创建文件。
使用字符串类型的文件名来创建一个输出流对象: OutputStream f = new FileOutputStream("C:/java/hello") 使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象: File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);FileOutputStream 对象的常用方法:
方法名描述public void close() throws IOException{}关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。protected void finalize()throws IOException {}这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。public void write(int w)throws IOException{}把指定的字节写到输出流中。注意一次只能写一字节public void write(byte[] w)把指定数组中w.length长度的字节写到OutputStream中。上面程序的输出为:
104 ello worhehello worhello wor文件 test.txt 内容为:
hello worhello wor这两个类用于转换字节流和字符流。
OutputStreamWriter 是将字符流转为字节流的桥梁,可以用指定的编码将字符编码为字节。可以在构造方法中指定字符集,或者默认用操作系统字符集。
使用字符串类型的文件名来创建一个输出流对象:
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out, CharsetEncoder enc)OutputStreamWriter 对象的常用方法:
方法名描述void close()关闭流,关闭之前会自动清空void flush()清空流String getEncoding()返回当前流的字符编码void write(char[] cbuf, int off, int len)写入字符数组的一部分void write(int c)写入一个字符void write(String str, int off, int len)写入字符串的一部分将字节流转为字符流。读取字节并按照指定的字符集解码为字符。
InputStreamReader(InputStream in, Charset cs)FileOutputStream 对象的常用方法:
方法名描述void close()关闭流并释放相关的系统资源String getEncoding()返回当前流使用的字符集编码int read()读一个字符int read(char[] cbuf, int offset, int length)将字符读到数组的指定部分boolean ready()表示当前流是否就绪,可以随时读数据用于按字符读写文件。跟 FileInputStream 和 FileOutputStream 类似。
这两个类可以为 I/O 操作提供缓冲区,实现单个字符、数组和字符串的读写。
继承自 Reader。
比 FileReader 类多了个 readLine() 方法,可以一次读取完整的一行(跨平台)。
BufferedWriter 有个跨平台的 newLine() 方法,可以在各个平台实现统一的换行效果。
输出:
hehe hehe这两个类具有写各种基本数据类型的方法,且各种类型可以跨平台。另外,可以用 size() 方法统计写入的字节数。
常用方法:
方法描述void flush()Flushes this data output stream.int size()返回当前计数器的值,目前已经写入这个流的字节数void write(byte[] b, int off, int len)从指定的字节数组 off 偏移处,写 len 个字节到输出流void write(int b)写入指定的字节(参数 b 的低8位)到输出流void writeBoolean(boolean v)将布尔数据作为1字节的值写到输出流void writeByte(int v)将字节数据作为1字节的值写到输出流void writeBytes(String s)将字符串作为字节序列写到输出流void writeChar(int v)将字符数据作为2字节的值写到输出流,高位在前void writeChars(String s)将字符串作为字符序列写到输出流void writeDouble(double v)通过 Double 类中的 doubleToLongBits 方法将double类型参数转为long 类型后,将其完整的8字节写入输出流,高字节在前void writeFloat(float v)void writeInt(int v)void writeLong(long v)void writeShort(int v)void writeUTF(String str)可以按照指定的类型读取数据。
System 类的静态成员变量,包括:
System.in:InputStream 类型的标准输入流,默认是键盘System.out:PrintStream 类型的标准输出流,默认是显示器System.err:PrintStream 类型的标准错误输出流,默认也是输出到显示器可以将标准流重定向到文件,这样在使用标准输出流时,实际使用的就是文件了。
InputStream in = new BufferedInputStream(new FileInputStream("test.txt")); OutputStream out = new BufferedOutputStream(new FileOutputStream("out.txt")); System.setIn(in); System.setOut(out); System.setErr(out);File 类提供了文件的相关操作,包括:
创建、删除、重命名文件判断文件是否存在判断文件的读写权限设置和查询文件的最新修改时间 import java.io.*; public class FileTest { public static void main(String[] args) { File f = new File("test.txt"); if (f.exists()) { // 判断文件或目录是否存在 f.delete(); // 删除文件或目录 } else { try { f.createNewFile(); // 创建文件 } catch (Exception e) { System.out.println(e); } } } }如果需要在程序结束时保存对象的信息,可以将对象序列化后保存到磁盘上。前提是对象已经实现了 Serializable 接口:
ObjectOutputStream 可以用 writeObject 方法把对象写入磁盘ObjectInputStream 可以用 readObject 方法把对象读入程序对于序列化时不想保存的属性,可以加 transient 修饰。另外 static 类型的变量,不属于任何一个对象,所以也不会序列化。
Java 把输入输出都当做字节流处理,所以对随机的文件读写支持的不太好。
可跳转到文件的任意位置读写RandomAccessFile 类实现了 DataInput 和 DataOutput 接口,可以使用普通读写方法转载于:https://www.cnblogs.com/kika/p/10851523.html
