`
dengminghua1016
  • 浏览: 130014 次
  • 性别: 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 }
分享到:
评论

相关推荐

    JAVA_IO流学习总结

    JAVA_IO流学习总结

    《JAVA_IO流学习总结》

    总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握这一部分将极大地提升Java开发者的技能。通过学习和实践,开发者可以灵活地处理各种数据输入输出场景,为应用程序...

    JAVAIO流学习总结(转)

    这是别人总结的很有实用价值的javaIO流教程。

    javaio流学习总结.pdf

    JavaIO流学习总结 JavaIO流是Java语言中最基本的输入/输出机制,它提供了多种方式来读取和写入数据。下面是JavaIO流的学习总结。 一、 IO流的分类 IO流可以从不同的角度进行分类,包括: * 按流的方向分为:输入...

    javaio流学习总结范文.doc

    本篇总结主要围绕Java IO流的基础概念、分类以及常用方法展开。 首先,Java IO流按照数据流动的方向可分为输入流(Input Stream)和输出流(Output Stream)。输入流负责从源(如文件、网络连接)读取数据,而输出...

    java-io流学习总结.doc

    Java IO 流学习总结 Java IO 流是 Java 语言中最重要的 Input/Output 机制之一,通过流我们可以自由地控制文件、内存、IO 设备等数据的流向。流机制是 Java 及 C++中的一个重要机制。 一、什么是流? 流是字节...

    javaio流学习总结.docx

    以下是对Java IO流的详细总结: 一、流的分类 1. 按流的方向:Java IO流分为输入流(InputStream和Reader)和输出流(OutputStream和Writer)。输入流用于从数据源读取数据,而输出流则用于向目标位置写入数据。 ...

    JavaIO流学习总结报告.doc

    虽然本报告主要讨论了基础的IO流,但了解NIO也是Java IO学习的重要部分。 总之,Java IO流是处理输入输出的核心工具,理解字节流与字符流的区别、流的层次结构以及基本操作方法,对于进行文件读写、网络通信等任务...

    JavaIO流学习总结.pdf

    Java IO流是Java平台中用于处理输入和输出的重要机制,它是数据在计算机内存与外部设备之间传输的桥梁。Java IO库包含了大量的类和接口,这些类可以被组织成层次结构,便于理解和使用。 首先,我们要了解流的概念。...

    Java IO流总结

    Java IO流是Java平台中处理输入输出操作的核心组件,它允许程序与各种数据源(如文件、设备、网络连接)进行交互。IO流系统由多个类和接口组成,它们位于java.io包中,为开发者提供了读写数据的丰富功能。在Java中,...

    2022年java io流学习总结.docx

    2022年的Java IO流学习总结主要涵盖以下核心知识点: 1. **流的概念**:流是数据传输的抽象概念,表示数据的流动方向,可以是从文件到内存,也可以是从键盘到屏幕。Java中的IO流分为两种基本类型,字节流(Byte ...

    java IO流的学习总结

    io流的学习总结,流的介绍 流的分类: 1.方向分类: 输入流(读取): 输出流(写入): 2.最小单位: 字节流(二进制数据): 字符流(字符数据,纯文本):

    IO流学习总结

    本文档为本人学习 java IO流期间的学习总结笔记,希望对新学习的朋友有所帮助和参考价值。本人java 开发时间不是太长,可能存在不完善或不对之处,欢迎指正!

Global site tag (gtag.js) - Google Analytics