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);注意: 一个对象被序列化以后,只有属性被序列化,原因在于,每个对象的方法相同,而属性却不一定相同,也就是说对象保存的只是属性信息.