特殊操作流
1、标准输入流
System类中有两个静态的成员变量:
1、 public static final InputStream in: 标准输入流,通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
2、 public static final PrintStream out: 标准输出流,通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
3、 自己实现键盘录入数据:BufferedReader br = new BufferedReader(new inputStreamReader(System.in);
4、 Java提供一个类实现键盘录入:Scanner sc = new Scanner(System.in);
//标准输入流
public class SystemInDemo1 {
public static void main(String[] args) throws IOException {
/* InputStream is = System.in;//标准输入流(字节)
InputStreamReader isr = new InputStreamReader(is);//转换流:把字节转换成字符
BufferedReader br = new BufferedReader(isr);//字符缓存输出流:一次可读取一行*/
//对上面3行简化
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个字符串:");
String line = br.readLine();
System.out.println("你输入的字符串是:"+line);
System.out.println("请输入一个数字:");
int i = Integer.parseInt(br.readLine());
System.out.println("你输入的数字是:"+i);
}
}
2、 标准输出流
1、 输出语句的本质:是一个标准的输出流
2、 PrintStream ps = System.out;
3、 PrintStream类所有的方法,Ssystem.out都可以使用
//标准输出流
public class SystemOutDemo2 {
public static void main(String[] args) {
PrintStream ps = System.out;
ps.println("beijing");
ps.print(98977);
//PrintStream所有的方法,System.out都可以使用
System.out.println("shanghai");
System.out.print(78798);
}
}
3、字节打印流
打印流分类:字节打印流PrintStram、字符打印流PrintWriter
1、打印流特点:只负责输出数据,不负责读取数据
2、有自己特有方法
3、PrintStream(String fileName): 使用指定的文件名创建新的打印流
4、使用继承父类的方法写数据,查看时会进行转码,使用自己特有方法写数据,查看是不转码,原样输出
//字节打印流
public class PrintStreamDemo3 {
public static void main(String[] args) throws IOException {
PrintStream ps = new PrintStream("f:\\test\\ax.txt");
ps.write(97); //继承父类方法写数据97就转码成a
ps.print(98);//特有方法写数据不进行转码,不换行
ps.println(99);//特有方法写数据不进行转码,换行
}
}
4、 字符打印流
1、 PrintWriter(String fileName): 使用指定文件名创建一个新的PrintWriter,而不需要自动执行刷新
2、 PrintWriter(Writer out,boolean autoFlush): 创建一个新的PrintWriter
Out:字符输出流
autoFlush:一个布尔值,如果为真,则print、printf、fomat方法将刷新输出缓存区
//字符打印流
public class PrintWriterDemo4 {
public static void main(String[] args) throws IOException {
/* PrintWriter pw = new PrintWriter("f:\\test\\ax.txt");
pw.write("beijing");
pw.flush();
pw.println("shanghai");//自动换行
pw.flush();//字符流,必须刷新才行*/
//参数为true,就会做自动刷新,如果为false,就不会做自动刷新
PrintWriter pw2 = new PrintWriter(new FileWriter("f:\\test\\ax.txt"),true);
pw2.println("javase");//自动换行
pw2.println("python");
pw2.close();
}
}
5、复制文件(打印流改进版)
/*案例:复制文件(打印流改进版)
*需求:把模块目录下的文件内容复制到其它文件中
*思路:
* 1、根据数据源创建字符输入流对象
* 2、根据目的地创建字符输出流对象
* 3、读写数据,复制文件
* 4、释放资源
* */
public class CopyTxtDemo5 {
public static void main(String[] args) throws IOException {
//常归方式
BufferedReader br = new BufferedReader(new FileReader("f:\\test\\ps.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("f:\\test1\\ps.txt"));
String line;
while((line=br.readLine())!=null){
bw.write(line);//写数据
bw.newLine();//换行
bw.flush();//刷新
}
br.close();
bw.close();
//打印流改进版
BufferedReader br2 = new BufferedReader(new FileReader("f:\\test\\jsp.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("f:\\test1\\jsp.txt"),true);
String len;
while((len=br2.readLine())!=null){
pw.write(len);
}
br2.close();
pw.close();
}
}
6、对象序列化流(写数据)
对象序列化流:ObjectOutputStream
1、 将java对象的原始数据类型和图形写入OutputStream,可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件夹实现对象的持久存储、如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象。
2、 构造方法:ObjectOutPutStream(OutputStream out): 创建一个写入指定的OutputStream的ObjectOutputStream
3、 序列化对象的方法:void writeObject(Object obj): 将指定的对象写入ObjectOutputStream
注:一个对象要想被序列化,该对象所属的磊必须实现Serializable接口
Serializable是一个标记接口,实现该接口,不需要重写任何方法
//学生类
public class Student implements Serializable {
内容省略……
}
//对象序列化流
//NotSerializableException: 抛出一个实例需要一个serializabie接口,序列化运行时或实例时可能会抛异常
public class objectOutputStreamDemo6{
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:\\test\\oos.txt"));
Student s = new Student("beijing",30);
oos.writeObject(s);
oos.close();
}
}
7、对象反序列化流(读数据)
对象反序列化流:ObjectInputStream
1、 ObjectInputStream反序列化先前使用ObjecOutputStream编写的原始数据对象
2、 构造方法:ObjectInputStream(InputStream in) 创建从指定InputStream读取的ObjectInputStream
3、 反序列化对象的方法:Object readObject() 从ObjectInputStream读取一个对象
//对象反序列化流
public class objectInputStreamDemo7 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:\\test\\oos.txt"));
Object obj = ois.readObject();
Student s = (Student)obj;
System.out.println(s.getAge()+s.getName());
ois.close();
}
}
8、序列化与反序列化的两个问题
/*问题1:如果在对象序列化后,Student类中又修改了内容,反序列化读取时会报错
问题2:如果对象类中的某个成员变量不想被序列化
抛出问题:问题类的串行版本与从流中读取的类描述的类型不匹配
Exception in thread "main" java.io.InvalidClassException:
IO4.Student; local class incompatible:
stream classdesc serialVersionUID = 59731362152499122, local class serialVersionUID = -4011228077864936451
解决问题1:在对象类中加一个值private static final long serialVersionUID=42L;
解决问题2:如果对象类中的某个成员变量不想被序列化,就给这个变量修饰,如:private transient int age;
* */
public class objectStreamDemo8 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//write();
read();
}
//对象序列化
private static void write()throws IOException{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:\\test\\oos.txt"));
Student s = new Student("beijing",31);
oos.writeObject(s);
oos.close();
}
//对象反序列化
private static void read() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:\\test\\oos.txt"));
Object obj = ois.readObject();
Student s = (Student)obj;
System.out.println(s.getAge()+s.getName());
ois.close();
}
}
Properties
是一个Map体系的集合类,可以保存到流中,或者从流中加载