1. 字节输入输出类
InputStream字节输入流:
1 2 3 public abstract class InputStream extends Object implements Closeable
这个抽象类是表示输入字节流的所有类的超类。需要定义InputStream子类的应用InputStream必须始终提供一种返回输入的下一个字节的方法。
1 2 3 4 5 6 abstract int read () 从输入流读取数据的下一个字节。int read (byte [] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。int read (byte [] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。
OutputStream字节输出流:
1 2 3 public abstract class OutputStream extends Object implements Closeable , Flushable
这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。需要定义OutputStream子类的应用OutputStream必须至少提供一个写入一个字节输出的方法。
1 2 3 4 5 6 void write (byte [] b) 将 b.length字节从指定的字节数组写入此输出流。void write (byte [] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。abstract void write (int b) 将指定的字节写入此输出流。
FileOutputStream类(字节节点输出流):
1 2 public class FileOutputStream extends OutputStream
核心方法:
1 2 3 4 5 6 void write (int b) 将指定的字节写入此文件输出流。void write (byte [] b) 将 b.length个字节从指定的字节数组写入此文件输出流。void write (byte [] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
构造方法:
1 2 3 4 5 6 7 8 9 10 FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。 FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件,append==true 追加,不覆盖。 FileOutputStream(FileDescriptor fdObj) 创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。 FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。 FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class TestFileOutputStream { public static void main (String[] args) throws IOException { FileOutputStream fos = new FileOutputStream (".\\files\\target.txt" , true ); try { String s = "你" ; fos.write(s.getBytes()); fos.write(65 ); fos.write(66 ); fos.write(67 ); fos.write('D' ); byte [] bs = new byte [] {65 , 66 , 67 , 68 , 69 , 'Z' }; fos.write(bs); System.out.println("OK" ); } catch (IOException e) { e.getStackTrace(); } finally { fos.close(); } } }
FileInputStream类(字节节点输入流):
1 2 public class FileInputStream extends InputStream
核心方法:
1 2 3 4 5 6 int read () 从该输入流读取一个字节的数据。int read (byte [] b) 从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件尾部,返回-1 int read (byte [] b, int off, int len) 从该输入流读取最多 len字节的数据为字节数组。
构造方法:
1 2 3 4 5 6 FileInputStream(File file) 通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 FileInputStream(FileDescriptor fdObj) 创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。 FileInputStream(String name) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public class TestFileInputStream { public static void main (String[] args) throws IOException { FileInputStream fis = new FileInputStream (".\\files\\target.txt" ); try { byte [] bs = new byte [4 ]; while (true ) { int count = fis.read(bs); if (count < 0 ) { break ; } for (int i = 0 ; i < count; i++) { System.out.print((char )bs[i]); } System.out.println(); } } catch (Exception e) { e.printStackTrace(); } finally { fis.close(); } } }
特点:
提高IO效率,减少访问磁盘次数;
数据存储在缓冲区中,flush是讲缓存区的内容写入文件中,也可以直接close;
1 2 3 4 5 public class BufferedOutputStream extends FilterOutputStream public class BufferedInputStream extends FilterInputStream
示例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public class TestBufferredOutput { public static void main (String[] args) throws IOException { FileOutputStream fos = new FileOutputStream ("files\\buffer.txt" ); BufferedOutputStream bos = new BufferedOutputStream (fos); try { bos.write('A' ); bos.write('B' ); bos.write('C' ); bos.flush(); bos.write('E' ); } catch (Exception e) { e.printStackTrace(); } finally { bos.close(); System.out.println("写入OK" ); } FileInputStream fis = new FileInputStream ("files\\buffer.txt" ); byte [] b = new byte [100 ]; fis.read(b); for (int i = 0 ; i < b.length; i++) { System.out.println((char )b[i]); } fis.close(); } }
1 2 3 4 5 6 7 public class ObjectOutputStream extends OutputStream implements ObjectOutput , ObjectStreamConstantspublic class ObjectInputStream extends InputStream implements ObjectInput , ObjectStreamConstants
特点:
增强了缓冲区功能
增强了读写8种基本数据类型和字符串功能
增强了读写对象的功能:
Object readObject() // 从流中读取一个对象
void writeObject(Object obj) // 向流中写入一个对象
对象序列化: 使用流传输对象的过程称为序列化、反序列化。
必须实现Serializable接口 ;
对象自身和类中属性都必须序列化 (即实现Serializable这个空接口即可,基本数据类型数组可不序列化,引用数据类型必须序列化);
transient 关键字修饰为临时属性,不参与序列化;
对象的默认序列化机制写入对象的类、类签名和所有非瞬态和非静态字段的值,因此属性不能使用static修饰 ,否则取的都是最后一次的值(static属于类本身,会影响序列化)。
序列化对象流读取到文件尾,会抛出 EOFException 异常 - 捕获后停止读取文件 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 public class TestObjectStream { public static void main (String[] args) throws IOException, ClassNotFoundException { OutputStream os = new FileOutputStream ("files\\target.txt" ); ObjectOutputStream oos = new ObjectOutputStream (os); Student stu = new Student ("小明" , 12 , "男" , 100D ); Student stu1 = new Student ("小黑" , 13 , "男" , 60D ); oos.writeObject(stu); oos.writeObject(stu1); oos.flush(); oos.close(); InputStream is = new FileInputStream ("files\\target.txt" ); ObjectInputStream ois = new ObjectInputStream (is); while (true ) { try { Object obj = ois.readObject(); System.out.println(obj); } catch (EOFException e) { break ; } } ois.close(); } }class Student implements Serializable { private static final long serialVersionUID = 1L ; String name; Integer age; String sex; transient Double score; public Student () { super (); } public Student (String name, Integer age, String sex, Double score) { super (); this .name = name; this .age = age; this .sex = sex; this .score = score; } @Override public String toString () { return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", score=" + score + "]" ; } }
3. 读写文件 1 2 3 4 5 6 7 BufferedInputStream bis = new BufferedInputStream (srcfile.getInputStream());BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream (dstPath));byte [] bs = new byte [8 *1024 ];int size;while ((size = bis.read(bs)) != -1 ) { bos.write(bs, 0 , size); }
4. 拷贝图片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class TestFileIOcopy { public static void main (String[] args) throws IOException { FileInputStream fis = new FileInputStream ("C:\\Users\\Administrator\\Desktop\\test.jpg" ); FileOutputStream fos = new FileOutputStream ("files\\new.jpg" ); int data = 0 ; try { while ((data = fis.read()) >= 0 ) { System.out.println(data); fos.write(data); } } finally { fis.close(); fos.close(); } } }