标准输入和输出流

做一个练习,把控制台输入的内容写到指定的TXT文件中,当接收到字符串over,就结束程序运行。

public static void test(){
   //创建一个接收键盘输入数据的输入流
   InputStreamReader is = new InputStreamReader(System.in);
   //把输入流放到缓冲流里
   BufferedReader br = new BufferedReader(is);

   BufferedWriter out = new BufferedWriter(new FileWriter("..."));
   
   String line = "";

   while((line = br.line()) != null){
      //读取的每一行都写到指定的TXT文件中
      if(line.equals("over")){
         break;
      }
      out.write(line);
   }
   out.flush();
   out.close();
   br.close();
   is.close();
}

数据流

专门用来做基本数据类型的读写的

数据输出流DataOutputStream:
用数据输出流写到文件中的数据,是乱码的,不能直接辨认出来,需要数据输入流来读取。

public static void test(){
   DataOutputStream out = new DataOutputStream(new FileOutputStream("..."));
   out.writeBoolean(true);
   out.flush();
   out.close();
}

小tip:在复制路径时,快速改变斜线,选中ctrl+f,就可以把路径的 \ 改成 / 或 \ \ 。

数据输入流DataInputStream:

public static void test(){
   DataInputStream in = new DataInputStream(new FileInputStream("..."));

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

   in.close();
}

对象流

person对象:
1、把这个对象存到电脑硬盘上,硬盘存储的基础是二进制,那就需要把对象转化为一个二进制的字节流,把这个流保存在电脑上。要使用这个对象,需要把流转化为对象再使用。
2、把这个对象通过网络传到另一个机器上,网络的通信基础是二进制,也就是需要把一个对象转化为二进制的数据流,把这个流通过网络进行传输。在接收者如果要使用接收的对象,得把对象的流转化为对象。

正是因为保存对象到硬盘(对象的持久化)和对象的网络传输,需要做这两件事,就产生了对象的输入与输出流。

序列化:用ObjectOutputStream类将一个Java对象写入IO流中。
反序列化:用ObjectInputStream类从IO流中恢复该Java对象。

序列化与反序列化都针对的是对象的各种属性,不包括类的属性。

不能序列化static和transient修饰的成员变量。

可以序列化与反序列化的对象:

public class Person implements Serializable{
   //一个表示序列化版本标识符的静态变量
   //用来表明类的不同版本间的兼容性
   private static final long serialVersionUID = 1L;

   String name;
   int age;
}

//Test类
//main
Test.testSerialize();

//对象的序列化
public static void testSerialize(){
//定义对象的输出流,把对象序列化之后的流放到指定的文件中
   ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("..."));
   
   Person p = new Person();
   p.name = "...";
   p.age = 11;
   
   out.writeObject(p);
   out.flush();

   out.close();
}

//对象的反序列化
public static void testDeserialize(){
//创建对象输入流对象,从指定的文件中把对象序列化后的流读取出来
   ObjectInputStream in = new ObjectInputStream(new FileInputStream("..."));
   Object obj = in.readObject();
   Person p = (Person)obj;
   System.out.println(p.name);
   in.close();
}

随机存取流

支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件。

支持只访问文件的部分内容。
可以向已存在的文件后追加内容。

文件的随机读写:

//随机读文件
public static void testRandomAccessFileRead(){
//参数1是读写的文件路径
//参数2是指定RandomAccessFile的访问模式
   RandomAccessFile ra = new RandomAccessFile("...","r");

   ra.seek(0);//设置读文件内容的起始点
   byte[] b = new byte[1024];
   int len = 0;
   while((len = ra.read(b)) != -1){
      System.out.println(new String(b,0,len));
   }
}

//随机写
public static void testRandomAccessFileWrite(){
   RandomAccessFile ra = new RandomAccessFile("...","rw");

   ra.seek(0);//设置写起始点,0代表从开头写
   ra.seek(ra.length());//ra.length()代表从文件的最后结尾写,文件的追加

   ra.write("...".getByte());
   
   ra.close();
}

模式:
r:只读方式打开(常用)
rw:打开以便读取的写入(常用)
rwd:打开以便读取的写入;同步文件内容的更新
rws:打开以便读取的写入;同步文件内容和原数据的更新

注意:如果是在文件开头或者中间的某个位置开始写的话,就会用写的内容覆盖掉等长度的原内容。

流的基本应用小结

流是用来处理数据的。

处理数据时,一定要先明确数据源,与数据目的地
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。

而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。