Java学习:I/O流(2)

LineNumberReader

跟踪行号的缓冲字符输入流,父类为BufferedReader。

成员方法:

getLineNumber()
          获得当前行号。

setLineNumber(int lineNumber)
          设置当前行号。

练习代码如下:

 1 //创建LineNumberReader对象
 2         //public LineNumberReader(Reader in)
 3         LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt"));
 4         
 5         //默认起始行号从0开始
 6         //设置其实行号为从10开始
 7         lnr.setLineNumber(10);
 8         
 9         //一次读取一行
10         String line;
11         while ((line = lnr.readLine())!=null) {
12             //打印每一行的行号和内容
13             System.out.println(lnr.getLineNumber()+":"+line);
14         }
15         
16         //关流
17         lnr.close();
获取行号,设置行号

结果如下:

操作基本数据类型的流

DataInputStream:读数据

DataOutputStream:写数据

具体的方法见API

练习代码如下:

 1 public static void main(String[] args) throws IOException {
 2         //写数据和读数据
 3         write();
 4         read();
 5     }
 6 
 7     private static void read() throws IOException {
 8         //DataInputStream:读数据
 9         //创建对象:public DataInputStream(InputStream in)
10         DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
11         
12         //读数据了,按什么顺序写入就必须按照什么顺序读出来
13         System.out.println(dis.readByte());
14         System.out.println(dis.readShort());
15         System.out.println(dis.readInt());
16         System.out.println(dis.readLong());
17         System.out.println(dis.readChar());
18         System.out.println(dis.readFloat());
19         System.out.println(dis.readDouble());
20         System.out.println(dis.readBoolean());
21         
22         //关流
23         dis.close();
24     }
25 
26     private static void write() throws IOException {
27         //public DataOutputStream(OutputStream out)
28         DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
29         
30         //给流关联的文件中写入基本类型的数据
31         dos.writeByte(20);
32         dos.writeShort(200);
33         dos.writeInt(2000);
34         dos.writeLong(20000L);
35         
36         dos.writeChar(97);
37         dos.writeFloat(12.34F);
38         dos.writeDouble(23.34);
39         dos.writeBoolean(true);
40         
41         //关流
42         dos.close();
43     }
写入数据和读数据

结果如下:

内存操作流

解决临时数据存储的问题。

操作字节数组

ByteArrayInputStream
ByteArrayOutputStream
byte[] toByteArray() 将之前写入内存的流转换成字节数组
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter

练习代码:

 1 //给内存中写数据public ByteArrayOutputStream()
 2         ByteArrayOutputStream baos = new ByteArrayOutputStream();
 3         //给内存中调用方法写数据
 4         baos.write("hello".getBytes());
 5         //将写入内存中的数据读取出来
 6         byte[] buf = baos.toByteArray();//调用这个方法,将之前写入内存中的数据存储到字节数组中
 7         ByteArrayInputStream bais = new ByteArrayInputStream(buf);//将刚才存储到字节数组中的内容关联上bais
 8         
 9         //只有这样之后,我们才可以直接从bais中读取我们想要的内容
10         //一次读取一个字节
11         int by;
12         while ((by=bais.read())!=-1) {
13             System.out.print((char)by);
14         }
15         //关流
16         bais.close();
17         baos.close();
操纵字节流

打印流

字节打印流  PrintStream

字符打印流  PrintWriter

特点:

A:只能操作目的地,不能操作数据源

B:可以操作任意类型的数据

C:如果启动了自动刷新,能够自动刷新

如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作

D:可以操作文件的流
注意:什么流可以直接操作文件?
看流对象的API,如果其构造方法同时有File和String类型的参数,就可以直接操作文件。

 1     //注意:如果已经开启了自动刷新功能,必须调用则 println、printf 或 format的时候,才可以实现自动刷新
 2         pw.println("hello");
 3         pw.println("java");
 4         pw.println("world");//调用println这个方法给文件中写数据,1.写数据  2.换行  3.刷新
 5         
 6         //可以操作任意类型的数据
 7         pw.println(true);
 8         pw.println(12.34);
 9         
10         //关流
11         pw.close();
自动刷新

合并流:

SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。

构造:
SequenceInputStream(InputStream s1, InputStream s2) :将s1和s2合并成一个输入流,先读取s1后读取s2

联系代码如下:

 1 //将两个数据源合而为一
 2         SequenceInputStream sis = new SequenceInputStream(new FileInputStream("PrintWriterDemo.java"), new FileInputStream("SystemIn2.java"));
 3         //封装目的地
 4         FileOutputStream fos = new FileOutputStream("copy2.java");
 5         
 6         //一下读写一个字节数组
 7         byte[] buf = new byte[1024];
 8         int len;
 9         while ((len=sis.read(buf))!=-1) {
10             //读多少写多少
11             fos.write(buf, 0, len);
12         }
13         
14         //关流
15         fos.close();
16         sis.close();
将两个文件合并一个

对象的序列化和反序列化

序列化流:把对象按照流一样的方式写到文件或者在网络中传输。

反序列化流:把文件或者网络中的流对象数据还原对象。

ObjectOutputStream:序列化流
writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。  

ObjectInputStream:反序列化流
Object readObject() 从 ObjectInputStream 读取对象。

如何实现序列化?

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

注意:如果一个类不是实现Serializable接口无法把实例化,会报异常java.io.NotSerializableException

 1 public class Studnet implements Serializable{
 2     //实现这个接口不需要实现任何方法,这个接口说白了就是仅仅给Student类,打上了一个可以被序列化的标示
 3     private String name;
 4     private int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17     public Studnet(String name, int age) {
18         super();
19         this.name = name;
20         this.age = age;
21     }
22     public Studnet() {
23         super();
24         // TODO Auto-generated constructor stub
25     }
26     @Override
27     public String toString() {
28         return "Studnet [name=" + name + ", age=" + age + "]";
29     }
对象类
 1 //创建序列化流对象
 2         //public ObjectOutputStream(OutputStream out)
 3         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
 4         
 5         //创建一个学生对象,将学生对象写入文件中
 6         Studnet s = new Studnet("刘德华", 50);
 7         oos.writeObject(s);
 8         // java.io.NotSerializableException
 9         //类通过实现 java.io.Serializable 接口以启用其序列化功能
10         
11         //关流
12         oos.close();
序列化
 1 //创建反序列化流对象
 2         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
 3         
 4         //读取文件中存储的对象,以实现反序列化
 5         //readObject()
 6         Object object = ois.readObject();
 7         System.out.println(object);
 8         
 9         //关流
10         ois.close();
反序列化

 

原文地址:https://www.cnblogs.com/shaofanglazi/p/6874966.html