Java IO操作主要指的是使用Java进行输入输出操作,Java的所有操作类都早Java.io包中,在使用时需要导入此包.
上两篇博客分别讲解了几个数据流
篇幅一 :
http://blog.csdn.net/haiyang_duan/article/details/76769025
篇幅二:
http://blog.csdn.net/haiyang_duan/article/details/76772196
下面接着简单介绍有关IO的内容.
一. System对IO的支持
使用OutputStream想屏幕输出
System.out
OutputStream out = System.out;
try{
out.write("hello".getBytes());
}catch (IOException e){
e.printStackTrace;
}
try{
out.close();
}catch (IOException e){
e.printStackTrace;
}
System.err
String str = "hello";
try{
System.out.println(Integer.parseInt(str));
}catch (IOException e){
System.err.println(e);
}
注意 :
System.out和System.err都是PrintStream的实例化对象,而且通过示例代码可以发现,两者都可以输出错误信息.但是一般来讲System.out是将信息显示给用户看,是正常的信息,而System.err的信息刚好相反,是不希望用户看到的.所以,如果要输出错误信息,最好不要使用System.out,而直接使用System.err.
System.in
//控制台输入
InputStream in = System.in;
System.out.print("请输入内容:");
byte[] b = new byte[1024];
int read = in.read(b);
System.out.println(new String(b,0,read));
上述代码虽然可以实现从键盘中输入数据的功能,但是有以下缺陷:
# 指定了输入数据的长度,使其受到限制;
# 如果byte数组的长度为奇数,有可能出现中文乱码(一个中文为两个字节);
所以应使用标准的输入方式,将输入数据暂放到一个内存中,然后再一次性读取数据,数据只读一次就不会有乱码,而且也不会受长度的限制,如下
//控制台输入得的标准格式
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
str = br.readLine();
System.out.println(str);
二. 输入输出重定向
输出重定向
将输出内容指定到某文件
System.setOut(new PrintStream(new FileOutputStresam("C:" + File.separator + "test")));
System.out.println("hello!");
三. BufferedReader类
BufferedReader中定义的构造方法只能接收输入流的实例,所以必须使用字符输入流和字节输入流的转换类InputStreamReader将字节输入流System.in变为字符流.
所以就有了键盘输入的标准模式:
//控制台输入得的标准格式
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
str = br.readLine();
System.out.println(str);
四. 数据操作流
在IO中,提供了两个与平台无关的数据操作流:
分别为数据输出流DataOutputStream和数据输入流DataInputStream
通常数据输出流会按照一定的格式将数据输出,在通过数据输入流按照一定的格式将数据读入.
五. 对象序列化
对象序列化就是把一个对象转变为二进制的一种方法
一个类的对象要想被序列化,则对象所在的类必须实现java.io.Serializable接口
定义可序列化的类
class Person implements Serializable{
private static final long serialVersionUID = 1L;
private transient String name;
private int age;
public Person(String name , int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:" + name + "--" + "年龄:" + age;
}
}
序列化
//序列化
File f = new File("C:" + File.separator + "test");
OutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("段海洋", 26);
oos.writeObject(p);
oos.close();
fos.close();
反序列化
File f = new File("C:" + File.separator + "test");
//反序列化
InputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
ois.close();
fis.close();
System.out.println(obj);
注意:
一个对象被序列化以后,只有属性被序列化,原因在于,每个对象的方法相同,而属性却不一定相同,也就是说对象保存的只是属性信息.