标准输入和输出流
做一个练习,把控制台输入的内容写到指定的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:打开以便读取的写入;同步文件内容和原数据的更新
注意:如果是在文件开头或者中间的某个位置开始写的话,就会用写的内容覆盖掉等长度的原内容。
流的基本应用小结
流是用来处理数据的。
处理数据时,一定要先明确数据源,与数据目的地。
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。
而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。