`
liubey
  • 浏览: 107151 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

最好的java io包解密

阅读更多
发信人: hzxdark (漆黑之翼), 信区: Java
标  题: java.io包详细解说,希望对师弟师妹们有所帮助^_^
发信站: 荔园晨风BBS站 (Thu Dec 21 23:13:30 2006), 站内

我不知道各位是师弟师妹们学java时是怎样的,就我的刚学java时的感觉,java.io包是最让我感到一头雾水的。所以现在这篇文,尽可能简单地描述java.io包的结构,希望对java.io同样一头雾水的师弟师妹们有些帮助^_^

我开始学java时,java.io的介绍是在《java编程思想》里看的。说实话,当时完全看不明白——“java.io的是用‘decorator模式’来构建的”——刚学java时,天知道啥玩意叫decorator……

不过要明白java.io,确实需要理解decorator设计模式,下面详细介绍下。
所谓decorator,装饰,其实可以说是一种设计的技巧,说白了没什么难的,别看很多网上资料说的天花乱坠的(非常讨厌有些文章总是把简单的问题描述得跟两头猪的kiss问题一样复杂……)。

decorator的结构如下:

    MyInterface
       |
_______|_______
|             |
Myclass     Decorator
          ____|_____
          |        |
  DecoratorA      DecoratorB


decorator的目的是在不改变任何原有的类的基础下,添加新的功能(你可以理解为书上说的灵活性)。其中Myclass是你要扩展的类,DecoratorA跟DecoratorB封装了你要扩展的功能,并保存有一个MyInterface的引用。

考虑以下代码:
public static void main(Strings[] arg){
  myInterface a = new myClass();
  a.print();
}
myInterface 是myClass的接口,只声明了一个方法print(),myClass实现了该方法:

public void print(){
   System.out.println("hello");
}

那么假如我们要在不改变原来的myClass的基础上,变成输出“hello world!”,要怎么做呢?
当然我们可以考虑直接写个myClass的子类,helloClass之类,但是要是要求根据环境不同,输出"hello world!",my hello world","my Hello"之类的组合呢?
用继承的方式将不得不写一堆类似的子类来。

decorator,装饰模式的解决方法是,只实现基本的功能,把附加的功能抽出来放一边。
例如以下代码:
class DecoratorA implements Decorator{
   MyInterface myObject;
   DecoratorA(myInterface myObject){
     this.myObject = myObject;
   }
   public void print(){
         myObject.print();
         System.out.print("world!");
   }
}

class DecoratorB implements Decorator{
    MyInterface myObject;
    DecoratorA(myInterface myObject){
     this.myObject = myObject;
    }
    public void print(){
         System.out.print("my");
         myObject.print();
    }
}

DecoratorA和DecoratorB的功能分别是打印出world跟my。这时main函数要打印出my hello world可简单变为:

public static void main(Strings[] arg){
  MyInterface a =new DecoratorA(new DecoratorB(new MyClass());
  a.print();
}

简单吧?简单的说,就是:
print(){
  print("xxx");//可替换成你要添加的任何处理;
  myObject.print();//调用基础类的函数;
  xxxx;        //后续处理
}
Decorator的介绍就到此为止,接下来讲java.io.

看到

MyInterface a =new DecoratorA(new DecoratorB(new MyClass());

是不是觉得眼熟咧?这跟

BufferedInputStream bis = new BufferedInputStream(new DataInpuStream(new FileInputStream("xxx.txt")));

是不是很像?

(画外音加一个臭鸡蛋扔上来:因为java.io就是用decorator模式组织的,当然像啦……)

java.io分Stream跟reader、writer两大类,这里只详细介绍Stream,并最后两者间的关系。Stream又分inputStream、OutputStream,两者基本是对称的,这里也只介绍InputStream.

                java.io.InputStream
                        |
_______________________|________________________
|                                             |
ByteArrayInputStream                      FilterInputStream
StringBufferInputStream   _____________________|____________________________
FileInputStream           |                |                    |          |
PipedInputStream  DataInputStream BufferedInputStream  LineNumInpuStream XXX

(注:xxx是PushbackInputStream,上面的图放不下)

这个图跟最初介绍的hello world的图很像吧?呵呵。
基础的流只有左边4个,这些流代表了数据的来源,所有的流都必须从这四个中之一开始。(注,还有一个RandomAccessFile、File,这两个不在本文介绍范围)。
然后当我们需要什么添加功能,就从右边中选择一个装饰。例如,我们需要缓存功能,那么需要bufferedInputStream装饰:

BufferdInputStream is = new BufferedInputStream(new FileInputStream("xxx.txt"));

假如再要DataInputStream的功能,只要在加一层:
DataInputStream dis = new DataInputStream(new BufferdInputStream(new FileInputStream));
(厄,我不甚明白这个类添加的功能是做什么用的,资料说是增加读取java原生数据的功能,不甚明白,有清楚的来补充一下,pipeInputStream跟sequenceInputStream也没用过,欢迎补充说明)
这里你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法调用,并添加相应的处理。

最后说说InputStream跟reader的区别:

老实说,我只知道一个支持字节流,一个支持unicode流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~
分享到:
评论
14 楼 zhcheng 2010-09-16  
讲解 精辟
13 楼 oaklet 2010-09-16  
解得顶好,以前很少关心这块,没细想过,每次都是拷现成代码,
java编程思想都被拷了遍了,
会python了之后能避开java尽量就避开了。
12 楼 juliashine 2010-09-16  
牛逼冲天,看完之后没发现比起其他文档来有什么特别的东西
11 楼 分离的北极熊 2010-09-15  
又悲剧的一帖~~~~
10 楼 笑我痴狂 2010-09-15  
decorator 可以看做文件夹里嵌套文件夹和文件   很直观

raader 比inputstream 的性能稍好些

楼主好像没说到byteArrayInputStream 和 byteArrayOutputStream
9 楼 yulidrff 2010-09-15  
这是标准的平民教程
8 楼 chris_zley 2010-09-15  
以前不是有人发过吗。。而且“最好”也过分了
7 楼 1927105 2010-09-15  
有个BUG
class DecoratorB 中构造函数应该是 DecoratorB,不是DecoratorA,,,吧
6 楼 wujiazhao88 2010-09-15  
写得不错, 通俗易懂
5 楼 小哥1900 2010-09-15  
荔园晨风?貌似是深大的BBS吧?
4 楼 Javakeith 2010-09-15  
不错!程序文章就应该些的通俗易懂,真正理解了才能做到代码简洁,说的出,让人能听的懂!
3 楼 ini_always 2010-09-15  
Stream是字节流,Reader是字符流,一个是按字节读取的,一个是按字符读取的。
2 楼 IcedCoffee 2010-09-15  
对decorator的例子很易懂
1 楼 coloforlia 2010-09-15  
專業jf...

相关推荐

    java加密解密zip压缩包

    Java提供了一个名为`java.util.zip`的包,其中包含用于处理ZIP文件的类,如`ZipOutputStream`和`ZipInputStream`。然而,这些类本身并不支持加密。为了实现ZIP文件的加密,我们需要依赖第三方库,例如Apache Commons...

    Java IO处理类的汇总

    Java IO处理类是Java平台中用于输入输出操作的核心部分,它允许程序与各种类型的输入源(如文件、网络连接)以及输出目标(如显示器、打印机)进行交互。本篇文章将全面解析Java IO处理类,包括基本概念、常用类库、...

    基于JAVA文件加解密的实验报告

    【基于JAVA文件加解密的实验报告】 本报告聚焦于使用Java进行文件加解密的实践,主要涉及了面向对象程序设计(JAVA)课程设计,选题为文件加解密。设计目标包括利用特定加密算法对文本文件进行加密和解密,支持RSA...

    java实现文件加密解密

    "java实现文件加密解密" Java 实现文件的加密与解密是指利用 Java 语言将资源文件(包括图片、动画等类型)进行简单的加密和解密。这种策略的原因和好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,...

    JAVA实现DES加解密系统

    在Java中,我们通常使用`javax.crypto`包下的类来实现DES加密和解密。 核心步骤如下: 1. **密钥生成**:DES需要一个64位的密钥,但如前所述,实际有效部分是56位。Java中的`DESKeySpec`类用于创建DES密钥,我们...

    Java文件加密解密

    4. **文件流操作**:在处理文件时,Java的`java.io`包提供了`FileInputStream`和`FileOutputStream`,用于读写文件。在加密和解密过程中,你需要将文件流包装成`CipherInputStream`或`CipherOutputStream`,以便在...

    课程设计java文本加密解密

    2. **文件I/O操作**:在Java中,我们使用`java.io`包中的类来读取和写入文件。你需要了解`File`类用于文件操作,`BufferedReader`和`BufferedWriter`用于读写文本文件。 3. **图形用户界面(GUI)**:这个项目要求...

    Java IO 2nd

    《Java™ I/O, 第二版》是一本深入讲解Java输入/输出(I/O)机制的权威书籍,由Elliotte Rusty Harold撰写,于2006年5月由O'Reilly出版社出版。该书提供了对Java I/O类及其相关类的全面覆盖,以及对Java数字格式化...

    java文件加密解密课程设计.doc

    2. **Java包的导入**:为了实现文件操作和图形用户界面(GUI)的功能,课程设计导入了java.awt、java.awt.event、java.io和javax.swing等包。这些包提供了基本的UI组件、输入输出流以及事件处理机制。 3. **文件...

    java 证书 加密 解密

    Java证书加密解密是Java开发中涉及网络安全的重要环节,它主要涉及到数字证书、SSL/TLS协议、公钥加密和私钥解密等概念。在这个场景中,`Payment Mgr.p12`是一个PKCS12格式的文件,通常用于存储个人身份信息,包括...

    java使用AES加密/解密文件

    import java.io.*; import java.security.Key; public void encryptFile(File inputFile, File outputFile, Key key) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 指定...

    C#加密用JAVA解密

    在给定的场景中,"C#加密用JAVA解密"涉及到的是使用3DES(Triple Data Encryption Standard)加密算法在C#环境中对数据进行加密,然后在Java环境中进行解密。3DES是一种广泛应用的块密码,它基于DES(Data ...

    java开发的微信图片解密工具,亲测有效。

    在Java中,可以使用如Apache Commons IO、Java Cryptography Extension (JCE) 和 Java NIO等库来处理文件读写、加密解密和二进制数据操作。 这个名为“微信图片解密工具.jar”的文件,实际上是一个Java可执行的jar...

    Des加密解密源码——JAVA版

    在Java中,我们可以使用java.security包下的 Cipher 类来实现DES的加密和解密操作。本资源提供了JAVA版的DES加密解密源码,对于学习和理解DES算法以及在实际项目中的应用非常有帮助。 首先,`Des.java` 文件很可能...

    PGP加解密工具类

    在本文中,我们将深入探讨PGP加解密工具类,包括PGP文件和文本的加密解密、以及加密加签的流程。 首先,PGP的核心概念是公钥加密。每个用户都有一个公钥和一个私钥,公钥用于加密数据,而私钥用于解密。任何人都...

    java 文件的加密解密操作

    在实际操作中,我们需要使用`java.io`包中的`FileInputStream`和`FileOutputStream`来读取和写入文件。先读取文件内容到字节数组,然后进行加密操作,最后将加密后的字节数组写入新文件。 4. **密钥管理**: 对于...

    java做的文件加密及解密软件

    源代码可能使用了Java的IO和加密库,如`java.io`和`javax.crypto`,来处理文件读写和加密解密操作。GUI部分可能使用了Swing或JavaFX的组件来构建用户交互界面,并结合事件监听来处理用户的加密和解密请求。 总的来...

    JAVA实现加解密文件

    3. **文件操作**:在Java中,我们通常使用`java.io`和`java.nio`包来处理文件。文件的读写、流操作以及文件的创建、删除等都包含在这个部分。在实现加解密文件时,我们需要先读取文件内容到内存,然后进行加解密操作...

Global site tag (gtag.js) - Google Analytics