`
dengminghua1016
  • 浏览: 125228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Java IO流学习总结

 
阅读更多
关于Java IO流学习总结

  在写JAVAME程序的时候,我们经常需要保存一些数据到手机里面,也经常希望能把对象也保存到手机里面,但是JAVAME里面没有反射机制,也没有java.io.Serializable接口,所以没有序列化的机制,要保存对象的话,就得自己动手了。
  在写JAVAME程序的时候,我们经常需要保存一些数据到手机里面,也经常希望能把对象也保存到手机里面,但是JAVAME里面没有反射机制,也没有java.io.Serializable接口,所以没有序列化的机制,要保存对象的话,就得自己动手了。

  在JAVAME中,程序的数据保存的地方,无外乎两种,一种是把数据保存在RMS里面,这是所有的JAVAME的手机都支持的,还有一种就是把数据保存在手机的文件系统里面,这个不是所有手机都能支持的,只有支持JSR075的手机,才支持把数据保存在文件系统里面,并且如果你的程序没有经过签名的话,你每次保存或者读取,手机都会弹出恼人的提示,是否允许程序访问文件系统。所在我一般都是把数据存在RMS里面,因为读写RMS是安全的,并且也是不需要手机提示的。因为我们的RMS数据是存在一个特殊的地方。但是JAVAME的RMS功能非常底层,为了保存一些数据,我们必须和byte[]打交道,所以我就产生了,在此之前封装一层自己的程序的想法,这样封装好以后,使用起来就非常方便了。只要实现了相关接口,就可以享受到比较易用的方法了。

  此框架总共包括了四个类,分别如下:Serializable类,它是一个接口,类似于JAVASE里面的Serializable接口,唯一不同的就是,JAVASE里面的接口是一个空接口,只做标记用的,而这里的这个接口是有方法需要实现的。

  Lazy类,它也是一个接口,它定义了一些方法,如果你的对象比较大,需要惰性加载的时候,可以实现此接口,并且此接口是Serializable接口的子类,也就是说实现了Lazy接口,你就相当于实现了Serializable接口。

  RMSUtil类,此类是一个工具类,用于统一进行RMS的相关操作,也是此框架的核心类。

  RecordFetcher类,也是一个接口,它继承了RecordComparator, RecordFilter接口,在取数据的时候,需要用到它。

  好了,下面我们就开始看代码吧。

  1 /*

  2 * To change this template, choose Tools | Templates

  3 * and open the template in the editor.

  4 */

  5 package com.hadeslee.mobile.rms;

  6

  7 import java.io.IOException;

  8

  9 /**

  10 * 一个可自己串行化的类所要实现的接口

  11 * @author hadeslee

  12 */

  13 public interface Serializable {

  14

  15 /**

  16 * 把自己编码成字节数组的格式

  17 * @return 字节数组

  18 */

  19 public byte[] serialize() throws IOException;

  20

  21 /**

  22 * 把一个对象用此字节数组进行重装

  23 * @param data 字节数组

  24 */

  25 public void unSerialize(byte[] data) throws IOException;

  26

  27 /**

  28 * 设置此对象序列化后对应的存储对象的ID

  29 * @param id ID

  30 */

  31 public void setId(int id);

  32

  33 /**

  34 * 得到此对象序列化后的ID

  35 * 此方法唯有在反序列化后的对象上调用才有效

  36 * 如果一个对象是没有序列化的,那么它的ID是-1;

  37 * @return ID

  38 */

  39 public int getId();

  40 }

  41

  1 /*

  2 * To change this template, choose Tools | Templates

  3 * and open the template in the editor.

  4 */

  5 package com.hadeslee.mobile.rms;

  6

  7 import java.io.IOException;

  8

  9 /**

  10 * 可以延迟加载的对象必须要实现的接口

  11 * @author binfeng.li

  12 */

  13 public interface Lazy extends Serializable {

  14

  15 /**

  16 * 实现此接口的类要实现的方法

  17 * 可以用于延迟加载某些属性。比如

  18 * get("ImgData"),get("fullImage")..等等

  19 * 由于J2ME不支持注释也不支持反射,所以只能以

  20 * 此种方法来进行模拟了

  21 * 此方法是RMSUtil要存对象的时候调用的,这样就可以把

  22 * 一个对象的不同部份存到不同的RMS里面去了

  23 * @param key 要得到的某性的键

  24 * @return 其对应的值

  25 * @throws IOException

  26 */

  27 public byte[] getAttach(Object key)throws IOException;

  28

  29 /**

  30 * 当把某个附属的对象保存进去以后,所要调用的

  31 * 方法,此方法告诉主体,它的那个附件被保存后

  32 * 在RMS里面对应的ID是多少

  33 * @param key

  34 * @param id

  35 */

  36 public void savedAttach(Object key, int id);

  37

  38 /**

  39 * 得到此对象所支持的所有的key的数组

  40 * @return KEY的数组,不能为NULL

  41 */

  42 public Object[] getAttachKeys();

  43

  44 /**

  45 * 此对象的附属对象所存的RMS的名字

  46 * @return RMS的名字

  47 */

  48 public String getNameOfAttachRMS();

  49 }

  50

  1 /*

  2 * To change this template, choose Tools | Templates

  3 * and open the template in the editor.

  4 */

  5 package com.hadeslee.mobile.rms;

  6

  7 import javax.microedition.rms.RecordComparator;

  8 import javax.microedition.rms.RecordFilter;

  9

  10 /**

  11 * 此类是一个继承了两个接口的接口,并且添加了自己

  12 * 的方法,自己的方法是用于通知数量以及开始取的位置

  13 * 只是为了方便于传递参数以及以后扩展

  14 * @author binfeng.li

  15 */

  16 public interface RecordFetcher extends RecordComparator, RecordFilter {

  17

  18 /**

  19 * 从哪个下标开始取

  20 * @return 下标

  21 */

  22 public int getFromIndex();

  23

  24 /**

  25 * 最多取多少条记录

  26 * @return 记录

  27 */

  28 public int getMaxRecordSize();

  29 }

  30

  一、IO流的三种分类方式

  1.按流的方向分为:输入流和输出流

  2.按流的数据单位不同分为:字节流和字符流

  3.按流的功能不同分为:节点流和处理流

  二、IO流的四大抽象类:

  字符流:Reader Writer

  字节流:InputStream(读数据)

  OutputStream(写数据)

  三、InputStream的基本方法

  int read() throws IOException 读取一个字节以整数形式返回,如果返回-1已到输入流的末尾

  void close() throws IOException 关闭流释放内存资源

  long skip(long n) throws IOException 跳过n个字节不读

  四、OutputStream的基本方法

  void write(int b) throws IOException 向输出流写入一个字节数据

  void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地

  五、Writer的基本方法

  void write(int c) throws IOException 向输出流写入一个字符数据

  void write(String str) throws IOException将一个字符串中的字符写入到输出流

  void write(String str,int offset,int length)

  将一个字符串从offset开始的length个字符写入到输出流

  void flush() throws IOException

  将输出流中缓冲的数据全部写出到目的地

  六、Reader的基本方法

  int read() throws IOException 读取一个字符以整数形式返回,如果返回-1已到输入流的末尾

  七、节点流类型

   


  八、访问文件之FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节

  九、访问文件之FileReader和FileWriter继承基类用于向文件中输入输出字符

  ----输出流在构造函数第二个参数可以设置true意义为跟在已有文件后进行输入

  ----此类流会抛出FileNotFoundException需要对其进行显示捕捉

十、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。

此处理流的构造方法都得传相对应的基类类型

BufferedReader:提供了readLine方法用于高校读取一行字符串

BufferedWriter:提供了newLine用于写入一个行分隔符也就是换行

BufferedInputStream 没多大用处

BufferedOutputStream 没多大用处

十一、转换流:主要作用将字节流转换成字符流。用处较大!

转换流在构造时可以指定其编码集合

InputStreamReader需要和InputStream套接

OutputStreamWriter需要和OutputStream套接

例:OutputStreamWriter osw = new OutputStreamWriter (new FileOutputStream(文件路径);

方法例:osw.getEncoding(); 获得流的编码方式

十二、数据流与字节数组流:

数据流主要为实现可以存取Java原始数据类型如long,boolean

数据流是字节流

DataInputStream需要和InputStream套接

DataOutputStream需要和OutputStream套接

DataInputStream方法:readBoolean() readInt() read……()……

readUTF():网络传输常用方法 读一个Unicode字符串

DataOutputStream方法与DataInputStream基本对应为写的方法

//此构造函数等于已可以往一个字节数组里输入内容

ByteArrayOutputStream baos = new ByteArrayOutputStream ();

//此方法为获取一个字节数组方法返回字节数组

baos.toByteArray();

//此方法获取字节数组占了多少字节

new ByteArrayInputStream(一个字节数组)。available()

1ByteArrayOutputStream baos =
2 new ByteArrayOutputStream();
3 DataOutputStream dos =
4 new DataOutputStream(baos);
5 try {
6 dos.writeDouble(Math.random());
7 dos.writeBoolean(true);
8 ByteArrayInputStream bais =
9 new ByteArrayInputStream(baos.toByteArray());
10 System.out.println(bais.available());
11 DataInputStream dis = new DataInputStream(bais);
12 System.out.println(dis.readDouble());
13 System.out.println(dis.readBoolean());
14 dos.close(); dis.close();
15 } catch (IOException e) {
16 e.printStackTrace();
17 }

十二、Print流

Print流只有输出流无输入流,PrintWriter和PrintStream分别针对字符字节

两个类提供了重载的Print和Println方法用于多种数据类型的输出

PrintWriter和PrintStream的输出操作不会抛出异常

PrintWriter和PrintStream有自动flush功能

----System.setOut(接收OutputStream类):用于设置系统默认输出流

十二、Object流

等同于c#序列化,用直接将Object写入或读出

transient关键字为不序列化此成员变量

需要序列化的类必须实现Serializable接口

主要方法:writeObject(Object); readObject();

读出为Object类型需要强转数据类型

1 import java.io.*;
2
3 public class TestObjectIO {
4 public static void main(String args[]) throws Exception {
5 T t = new T();
6 t.k = 8;
7 FileOutputStream fos = new FileOutputStream("d:/share/java/io/testobjectio.dat");
8 ObjectOutputStream oos = new ObjectOutputStream(fos);
9 oos.writeObject(t);
10 oos.flush();
11 oos.close();
12
13 FileInputStream fis = new FileInputStream("d:/share/java/io/testobjectio.dat");
14 ObjectInputStream ois = new ObjectInputStream(fis);
15 T tReaded = (T)ois.readObject();
16 System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
17
18 }
19 }
20
21 class T
22 implements Serializable
23 {
24 int i = 10;
25 int j = 9;
26 double d = 2.3;
27 transient int k = 15;
28 }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics