Thinking In Java 学习笔记 18. Java IO系统



输入和输出,输入输出流,Reader和Writer——字符流 InputStream和OutputStream——字节流
I/O流的典型使用方式
缓冲输入文件
从内存输入
格式化的内存输入
标准I/O System.in System.out System.err
System.out和System.err被包装成PrintStream,System.in需要包装 源码
重定向 setIn(InputStream) setOut(PrintStream) setErr(PrintStream)

视图缓冲器 view buffer put() get()
ByteBuffe填充基本类型,写入通道
字节存放顺序
big endian 高位优先 将最重要的字节存放在地址最低的存储单元
little endian 低位优先 将最重要的字节存放在地址最高的存储单元

映射文件访问性能更高,映射文件的输出使用RandomAccessFile
文件加锁 tryLock()(非阻塞) 和lock()(阻塞) 对FileChannel加锁 release()释放
用GZIP进行简单压缩,用ZIP进行多文件保存
Java档案文件JAR
对象序列化 通过实现Serializable接口,
序列化控制 实现Externalizable接口。
将类实现为Externalizable,再用transient关键字关闭序列化

18.1、理论问题
1)简述流的概念及输入输出流是相对谁说的
一、“流”的概念
       “流”是一个抽象的概念,它是对输入输出设备的一种抽象理解,在java中,对数据的输入输出操作都是以“流”的方式进行的。“流”具有方向性,输入流、输出流是相对的。当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流。数据源可以是文件、内存或者网络等。

四、“流”常用方法
         InputStream 为字节输入流,本身是个抽象类,必须依靠其子类实现各种功能,数据单位位字节(8bit)。常用方法有:
        (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。
   (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 
   (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。 
   (4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用, 
   (5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取 
   (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭. 
         OutputStream 为字节输出流,常用方法有:
    (1) public void write(byte b[ ]):将参数b中的字节写到输出流。 
  (2) public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。 
  (3) public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。 
  (4) public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。 
  (5) public void close( ) : 关闭输出流并释放与流相关的系统资源。
          Reader 为字符输入流,常用方法有:
        (1)  public int read() throws IOException: 读取一个字符,返回值为读取的字符 
   (2)  public int read(char cbuf[]) throws IOException:读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量   (3)  public abstract int read(char cbuf[],int off,int len) throws IOException:读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。
          Writer 为字符输出流,常用法有:
        (1) public void write(int c) throws IOException:将整型值c的低16位写入输出流 
   (2) public void write(char cbuf[]) throws IOException:将字符数组cbuf[]写入输出流    (3) public abstract void write(char cbuf[],int off,int len) throws IOException:将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 
   (4) public void write(String str) throws IOException:将字符串str中的字符写入输出流 
   (5) public void write(String str,int off,int len) throws IOException:将字符串str 中从索引off开始处的len个字符写入输出流 
   (6) flush( ) :刷空输出流,并输出所有被缓存的字节。 
   (7) close()  :关闭流 


输入输出流是相对于程序说的,也就是站在程序的方向看输入还是输出,例如FileInputStream,Input写入,我们站在程序的方向来看,就是源文件指向程序,FileOutputStream,OutPut写出,同理,就是程序指向源文件;再看,FileWriter,writer写,同理,就是程序指向源文件,反之FileReader读,站在程序角度,就是程序读源文件,顺序就是源文件指向程序。
2)字节流与字符流的区别
二、“流”的分类
       “流”序列中的数据可以是未经加工的原始二进制数据,也可以是经过一定编码处理后符合某种格式的特定数据,因此java中的“流”分为两种流:
1) 字节流:数据流中的最小的数据单元是字节,一次读入读出8位二进制;
2) 字符流:数据流中的最小的数据单元是字符,一次读入读出16位二进制,java中的字符是Unicode编码,一个字符占用两个字节。

  • 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  • 字节流默认不使用缓冲区;字符流使用缓冲区。
  • 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
3)列出常用的字节读写流、字符读写流
三、“流”结构分类
      “流”存在与java.io包中,主要包含四种基本的类,InputStream、OutputStream、Reader及Writer类,它们分别处理字节流和字符流:
输入/输出
字节流
字符流
输入流
Inputstream
Reader
输出流
OutputStream
Writer
      
       它们之间的继承关系图为:
       字节流:
                                            
              
                                                                             输入流    

                                           
         
                                                                           输出流
       字符流:
                                            
                                                                            输入流 
                                           
                                                                            输出流
IO流的关闭顺序
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常;
18.2、编码测试
1)按照行进行读取文件并存储到List容器中
2)测试上面列出的流进行读写
3)把文件从一个位置复制到另一个位置,并说明IO流处理时标准的异常处理方法
4)写一个字符流与字节流复制文件的方法,体验不同之处
5)写一个校验文件md5的工具类
6)从网上下载一个文件(歌曲,文档)
7)比较inputstream与bufferedinputstream的不同,哪种效率高
8)写一个文件服务器,支持文件上传下载、支持md5校验、支持传输压缩


题目出自时哥


猜你喜欢

转载自blog.csdn.net/jjj1299894209/article/details/80907928
今日推荐