Java初级笔记_IO流_2

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、IO

    概述

          操作数据的工具
IO流,即数据流,数据像水流一样通过IO工具进行传输。
程序  <IO>   硬盘

IO流用来处理设备之间的数据传输。
Java对数据的操作是通过流的方式。
Java用于操作流的对象都在IO包中。

      分类:

       流按操作数据分为两种:字节流与字符流。
注意:其实计算机里的所有数据都是以字节的形式体现的,计算机可以直接识别字节。但是作为人类的程序员更擅长 操作字符,所以后期产生了字符流 。
流按流向分为:输入流(input)(读取),输出流(output)(写出)。

      相对路径与绝对路径

绝对路径:从盘符开始指定的物理路径。是真正文件在硬盘上的位置。
相对路径:相对于某个指定位置的路径。
如c:/a/b/c.txt文件。
相对于c:的路径为a/b/c.txt
c.txt相对于c:/a/b的路径为直接的c .txt
代码中Windows中路径分隔可使用/或者\\。

二、字节流

     

     概述:操作对象为字节的IO流

       字节输入流:InputStream
 直接操作文件的子类:FileInputStream
   public abstract int read() throws IOException
   public int read(byte[] b) throws IOException
   public int read(byte[] b, int off, int len) throws IOException
   public void close() throws IOException

       字节输出流:与字节流相向

       高效字节流:将原有IO流进行包装,使其效率更高

         高效字节输出流:BufferedOutputStream
 高效字节输入流:BufferedInputStream

       文件的复制:结合使用输入输出流,完成数据的读取再写出。

三、字符流

 

      字节输出流:Writer

         直接操作文件的子类为FileWriter

          public void write(int c) throws IOException
  public void write(char[] cbuf) throws IOException
  public abstract void write(char[] cbuf, int off, int len) throws IOException
  public void write(String str) throws IOException
  public void write(String str, int off, int len) throws IOException

(1)FileWriter写入数据
操作步骤:
A:创建字符输出流对象
B:调用对象的write()方法
C:释放资源


代码体现:
FileWriter fw = new FileWriter("fw.txt");


fw.write("hello,IO");
//fw.flush();


fw.close();


几个小问题?
A:创建字符输出流对象做了那几件事情?
B:为什么要flush()?
C:为什么要close()?
D:flush()和close()的区别?
E:怎么实现换行?
F:怎么实现追加写入?
G:文件不存在,会创建一个。文件如果存在,到底是重新创建,还是把内容给清空?
(2)FileReader读取数据
操作步骤:
A:创建字符输入流对象
B:调用对象的read()方法
C:释放资源


代码体现:
FileReader fr = new FileReader("fw.txt");


//方式1
//一次读取一个字符
int ch = 0;
while((ch=fr.read())!=-1) {
System.out.print((char)ch);
}




//方式2
//一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1) {
System.out.print(String.valueOf(chs,0,len));
}


fr.close();
(3)复制文本文件
数据源:
看用那种类型的流,读取数据。
目的地:
看用那种类型的流,写出数据。


案例:
把当前项目路径下的Demo.txt复制到d盘目录下的Copy.txt中。


代码体现:
方式1:
FileReader fr = new FileReader("Demo.txt");
FileWriter fw = new FileWriter("d:\\Copy.txt");


int ch = 0;
while((ch=fr.read())!=-1) {
fw.write(ch);
}


fw.close();
fr.close();




方式2:
FileReader fr = new FileReader("Demo.txt");
FileWriter fw = new FileWriter("d:\\Copy.txt");


char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}


fw.close();
fr.close();

      字节输入流:Reader

         直接操作文件的子类为FileReader

          public int read() throws IOException
  public int read(char[] cbuf) throws IOException
  public abstract int read(char[] cbuf, int off, int len) throws IOException

       高效字符流:将原有IO流进行包装,使其效率更高。

          高效字节输出流:BufferedWriter
  特殊方法:
  public void newLine() throws IOException

  高效字节输入流:BufferedReader
  特殊方法:
  public String readLine() throws IOException


四、其他流

     (1)转换流

    OutputStreamWriter:字符流通向字节流的桥梁。

OutputStreamWriter是Writer的子类,是FileWriter的父类,是字符流的一种。

    InputStreamReader:字节流通向字符流的桥梁。

              InputStreamReader是Reader的子类,是FileReader的父类,是字符流的一种。

           转换流构造方法中,均有字节流与编码表两个参数。
    字符 = 字节 + 编码表

    System.in:用于控制台录入,属于字节输入流

            System.out:用于控制台输出,属于字节输出流

        (2)数据输入输出流

             数据输入输出流针对于基本数据类型。
     DataInputStream:数据输入流
     DataOutputStream:数据输出流
   注意:在数据输入输出流的操作过程中,必须按照写入顺序读取,否则由于读取规则的不同,会造成乱码。

         (3)内存操作流

               ByteArrayInputStream:从数组中读取字节
ByteArrayOutputStream:将字节写入到数组中
CharArrayReader:从数组中读去字符
CharArrayWriter:将字符写到数组中
StringWriter:将字符写到字符串中
StringReader:从字符串中读取数据
    注意:有些IO操作流流关闭无效,不会产生IO异常。如ByteArray操作流与String操作流

         (4)打印流

      1、概述:

                   专门用于数据打印的IO流。
     
2、特点:
   A:打印流可以输出任意类型数据。
   B:如果启用了自动刷新,在调用println()方法的时候,可以自动刷新并换行。
   C:可以直接操作文件。
哪些流对象可以直接操作文件呢?
看其构造方法,同时有File和String构造参数的。

     3、PrintStream :字节打印流
     4、PrintWriter :字符打印流

            可以作为普通的输出流。
     public void print(char c)
     public PrintWriter printf(String format, Object... args) 
     public void println()
     printf与println方法支持自动刷新

               5、案例

通过打印流改进文本文件的复制。
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}
pw.close();
br.close();
printf(String fomat,Object... o);

           (5)随机访问流

              1、概述:

                     对文件进行随机访问:RandomAccessFile。

                2、特点:
同时支持读与写。
需要指定模式。使用“rw”模式。

3、特殊方法:
public long getFilePointer() throws IOException
注意writerUTF的指针字节个数。
public void seek(long pos) throws IOException

           (6)对象序列化流

                 1、概述:

将对象作为数据进行操作。就是把对象按照流一样的操作。方便网络传输。
 2、序列化流:ObjectOutputStream
public final void writeObject(Object obj) throws IOException
 3、反序列化流:ObjectInputStream
public final Object readObject() throws IOException, ClassNotFoundException
 注意:被序列化的对象必须可序列化,即实现序列化接口作为可序列化的标记。

 4、Serializable:序列化接口
无方法,仅作为可序列化标记使用
写出与读入时,序列化ID必须相同

         5、什么是序列化?如何实现序列化?什么是反序列化?
         6、实现序列化接口的类是可以被序列化流操作的。
                 在这里面可以给定一个序列化id值。这样做简单的操作对写过的数据没有影响。

            (7)与IO流相关的类:Properties

                  1、概述:

该类是Hashtable的子类。内置了IO流的操作。用于存储属性键值对,通常作为配置文件来使用。
  2、特点
键值对均为字符串
可以直接操作IO流

          3、特有功能:
      A:添加
   Object setProperty(String key, String value) 
      B:获取
   String getProperty(String key)  
   String getProperty(String key, String defaultValue)  
   Set<String> stringPropertyNames() 相当于以前的keySet()
           4、和IO流结合的功能:
        A:list 把集合中的数据写到文本文件。只能使用打印流。
        B:load 把文本文件中的数据加载到集合。
        C:store 把集合中的数据写到文本文件。

五、码表

     编码表:将字符与数字对应的码表。
常见码表
 ASCII:美国标准信息交换码。
 ISO8859-1:拉丁码表。欧洲码表。
 GB2312:中国的中文编码表。
 GBK:中国的中文编码表升级,融合了更多的中文文字符号。
 BIG-5码 :通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
 Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode
 UTF-8:最多用三个字节来表示一个字符。

    Java基础班编码表设置:
项目编码
 文件编码
 数据操作编码

    编码表使用。
原则:编码与解码码表统一即可。
字符串的使用
   字符转成字节数组时,指定码表。
   字节数组转成字符串时,指定码表。

IO转换流使用
   创建转换流对象时,使用编码。
   与字符串共同使用时,保证编码统一。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值