Java中的I/O主要为两类:
- 数据只被Java程序使用(序列化)
- 数据会被其他程序使用(纯文本)
1.序列化和解序列化
必须实现serializable接口,且当对象被序列化时,被该对象引用的实例变量也会被序列化,且所有被引用的对象也会被序列化。
序列化是全有或者全无的,
输出:(序列化)
import java.io.*;
public class Student implements serializable{
public String num;
public int age;//这两个属性会被保存
public Student(String num,int age){
this.num=num;
this.age=age;
}
/*class Teacher{
* ...
* } 此类没有继承serializable
*/
public static void main(String [] args){
Student xiaoming=new Student("30",20);
Teacher teacher=new Teacher();
//会抛出异常,需要使用try,catch包裹
try{
FileOutputStream fs=new FileOutputStream("data.ser");//不存在就会创建
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(xiaoming);
//os.writeObject(teacher);如果这里在输出一个Teacher实例,就会报错,因为没有继承serializable
os.close();//写完数据需要关闭
}catch(Exception e){
e.printStackTrace();
}
}
}```
FileOutputStream fs=new FileOutputStream("data.ser");// .后面是文件类型
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(具体对象);
os.close();
这几行代码就是实现序列化输出数据的核心。
**如果某个实例变量不能或不应该被序列化,就把它标记成transient(瞬时的),这样就可以在序列化过程中跳过该实例**
如下:
class Teacher implements serialize{
String name;
transient int age;//这个变量就是不会被序列化的
}```
输入:(解序列化)
import java.io.*;
public class Test{
public static void main(String [] args){
try{
FileInputStream fis=new FileInputStream("data.ser");//不存在就会创建
ObjectInputStream is=new ObjectInputStream(fis);
Student xiaoming=(Student)is.readObject();//需要强制类型转换
System.out.println(xiaoming.age);//结果为20
}catch(Exception e){
e.printStackTrace();
}
}
}```
FileInputStream fis=new FileInputStream("data.ser");
ObjectInputStream is=new ObjectOutputStream(fis);
Student xiaoming=(Student)is.readObject();
这几行代码就是解序列化输入数据的核心
####2.将数据写入纯文本
######输出
需要创建一个File对象:File file=new File("data.txt");
import java.io.*;
public class WriteAFile{
public static void main(String [] args){
try{
File file=new File("data.txt");//创建一个File对象
FileWriter filewriter=new FileWriter(file);//filewriter.write()也可以写入数据,但BufferedWriter效率更高
BufferedWriter writer=new BufferedWriter(fileWriter);//缓冲区可以暂存一些数据,然后到写满时同时写入
String data=...//一些具体操作,不只这一行这么简单
writer.write(data)
writer.close();//同样的,结束需要关闭
}catch(Exception e){
e.printStackTrace();
}
}
}```
输入
import java.io.*;
public class ReadAFile{
public static void main(String [] args){
try{
File file=new File("data.txt");//创建一个File对象
FileReader fileReader=new FileReader(file);
BufferedReader reader=new BufferedReader(fileReader);//BufferedReader效率更高
String line=null;//创建line字符接收数据
StringBuilder responce=new StringBuider();//创建StringBuider对象来接收内容
while((line=reader.readLine())!=null){//reader.readLine()读取数据
responce=null;
}
reader.close();//同样的,结束需要关闭
System.out.println(responce.toString());
}catch(Exception e){
e.printStackTrace();
}
}
}```
上述大致呈现了一些I/O的简单操作,欢迎指出缺陷。