1.LineNumberReader

public int getLineNumber():获取行号

  public void setLineNumber(int lineNumber):设置起始行号

  String readLine():读取一行


2.操作基本数据类型的流

 DataInputStream:读数据

 DataOutputStream:写数据

 作用:可以操作基本类型的流对象,其读写顺序必须一致,否则数据有问题。



public static void main(String[] args) throws IOException {

//DataInputStream:读数据,创建对象

DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));

//读取数据顺序必须一致

System.out.println(dis.readByte());

System.out.println(dis.readShort());

System.out.println(dis.readInt());

System.out.println(dis.readLong());

System.out.println(dis.readChar());

System.out.println(dis.readFloat());

System.out.println(dis.readDouble());

System.out.println(dis.readBoolean());

//关流

dis.close();

//public DataOutputStream(OutputStream out)

DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));

//给流关联的文件中写入基本类型的数据

dos.writeByte(20);

dos.writeShort(200);

dos.writeInt(2000);

dos.writeLong(20000L);

dos.writeChar(97);

dos.writeFloat(12.34F);

dos.writeDouble(23.34);

dos.writeBoolean(true);

//关流

dos.close();

}


3.内存操作流:

作用:解决临时数据存储的问题。将数据写到流中保存在内存,并且读取

  ByteArrayInputStream    写入

  ByteArrayOutputStream   输出

  byte[] toByteArray() 将之前写入内存的流转换成字节数组

操作字符数组:

  CharArrayReader  输出

  CharArrayWrite   写入

操作字符串

 StringReader     输出

  StringWriter     写入

操作字节数组

 ByteArrayInputStream   写入

  ByteArrayOutputStream   输出


4.打印流:

 字节打印流       PrintStream

字符打印流       PrintWriter

特点:

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

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

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

    D.可以操作文件的流

操作任意类型的数据的方法:

   print()

 println():如果启动了自动刷新,能够实现刷新,而且还实现了自动换行。

   PrintWriter(OutputStream out, boolean autoFlush) 字节流

  PrintWriter(Writer out, boolean autoFlush) 字符流

 注:如果启用了自动刷新,则只有在调用 printlnprintf format之中的一个方法时才可能完成此操作


public static void main(String[] args) throws IOException {

                 // 利用字符打印流复制java文件(BufferedReader+PrintWriter)

                //封装数据源和目的地

//数据源

BufferedReader br = new BufferedReader(new FileReader("a.java"));

//目的地

PrintWriter pw = new PrintWriter(new FileWriter("copy.java"),true);

//读一行写一行

String line;

while ((line=br.readLine())!=null) {

pw.println(line);

}

//关流

pw.close();

br.close();

}



5.标准输入输出流

 System类下的两个构造方法:

标准输入流:    

public static final InputStream in

标准输出流:

  public static final PrintStream out

public static void main(String[] args) throws IOException {

//用IO流实现键盘录入,一次读取一行数据

                //将键盘录入数据system.in关联到bufferedreader上

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//一次读取一行数据

System.out.println("请输入你的姓名");

String name = br.readLine();

System.out.println("请输入你的年龄");

String age = br.readLine();

System.out.println(name+":"+age);

}

6.合并流:

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

  构造:

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

public static void main(String[] args) throws IOException {

//创建合并流对象

//将s1和s2合并成一个输入流,先读取s1后读取s2

SequenceInputStream sis = new SequenceInputStream(new FileInputStream("PrintWriterDemo.java"), new FileInputStream("SystemIn2.java"));

//封装目的地

FileOutputStream fos = new FileOutputStream("copy2.java");

//读写一个字节数组

byte[] buf = new byte[1024];

int len;

while ((len=sis.read(buf))!=-1) {

fos.write(buf, 0, len);

}

//关流

fos.close();

sis.close();

}

8. 对象的序列化和反序列化

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

   ObjectOutputStream:序列化流

   writeObject(Object obj) 将指定的对象写入 ObjectOutputStream.

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

  ObjectInputStream:反序列化流

   Object readObject() 从 ObjectInputStream 读取对象.

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

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

让对象所属类的实现序列化接口可以实现类的实例化。

public static void main(String[] args) throws Exception {

               //创建序列化流对象

//public ObjectOutputStream(OutputStream out)

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));

//创建一个学生对象,将学生对象写入文件中

Studnet s = new Studnet("刘", 50);

oos.writeObject(s);

// java.io.NotSerializableException

//类通过实现 java.io.Serializable 接口以启用其序列化功能

//关流

oos.close();

               //创建反序列化流对象

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));

//读取文件中存储的对象,以实现反序列化

//readObject()

Object object = ois.readObject();

System.out.println(object);

//关流

ois.close();


}



9. Properties

介绍:Properties 类表示了一个持久的属性集。属性列表中每个键及其对应值都是一个字符串。它实现map接口,其本质是一个map集合    

特点:Properties 可保存在流中或从流中加载。

特有功能:

    A.添加元素

       publicObject setProperty(String key,String value)

    B.获取元素

       publicString getProperty(String key)

       publicSet stringPropertyNames()

可以和IO流进行结合使用:

    把文件中的数据加载到集合中。注意:文件中的数据必须是键值对象形式的。

       publicvoid load(InputStream inStream)

       publicvoid load(Reader reader)

       把集合中的数据存储到文本文件中,并且是按照键值对形式存储的。

        public void store(OutputStream out,Stringcomments)

       publicvoid store(Writer writer,String comments)

public static void main(String[] args) throws IOException {

/*

             我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。

            请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”         

           zhangsan=3

           lisi=4

           wangwu=5

           1.创建集合对象

           2.将文件中的键值对加载到集合中

           3.获取多有的键的集合,遍历,判断

           4.如果存在lisi,的话,给集合中重新存储键值对lisi=100

           5.将集合中的数据存储到文件中

*/

//1.创建集合对象

Properties prop = new Properties();

// 2.将文件中的键值对加载到集合中

prop.load(new FileReader("prop.txt"));

//3.获取多有的键的集合,遍历,判断

Set keys = prop.stringPropertyNames();

// 4.如果存在lisi,的话,给集合中重新存储键值对lisi=100

for (String key : keys) {

if ("lisi".equals(key)) {

prop.setProperty(key, "100");

}

}

//5.将集合中的数据存储到文件中

prop.store(new FileWriter("prop3.txt"), null);

}