Java学习笔记15

======================================================================
   java
第十五天  IO

======================================================================
   
复习: 写一下老师上午写的代码
:
   
   IO
的分类

   (1)
按照数据传输的方向分类
       1. 输出流 虚拟机向文件中
       2.
输入流 向虚拟机中输入数据.相对虚拟机来说的

I  输入流      JVM ——>数据源      InputXXX

O  输出流     JVM <—— 数据源      OutputXXX


   (2)
按照传输的数据单位.
       1.
字节流 传播一次传播一个字节
.
       2.
字符流 传播一次传播一个字符.


   (3)
按照流的功能来分. 采用了装饰模式.
       1.
节点流 例子: 电线的金属丝/导电 节点流
.
       2.
过滤流 给节点流增加功能(和节点流组合构成一个复杂的功能) 电线上的塑料套(装饰)

-------------------------------------------------------------------------------------------------------------------
   IO
流的逐个讲解

(1) 字节输入流,(向虚拟机中读入数据)

字节流类:

抽象父类: InputStream     字节输入流 xxxInputStream

实现类:

                     BufferedInputStream 缓冲流——过滤流   

                     ByteArrayInputStream 字节数组流——节点流

                     DataInputStream    处理Java标准数据流——过滤流

                     FileInputStream 处理文件IO流——节点流

            FilterInputStream 实现过滤流——字节过滤流父类

                     PipedInputStream 管道流,在两个线程交换数据

                     PrintStream  包含print() println()

                     RandomAccessFile 只支持随机访问文件,用于定位的seek()方法。 了解即可

                     SequenceInputStream 在合并两个文件是较好用(顺序流)


       父类是InputStream()   一个类XXXInputStream是字节输入流.
       
要自己调用in.close()方法把流关掉
.
       int read()
顺序流,返回字节的ASCII 如果返回-1说明读完了

       int read(byte[] bs)
把字节数组读满,读到的字节装到字节数组里.返回值是读到的字节数.
       int read(byte[] bs,off,length) off: 2
把读到字节读到 bs[2], length 4 尝试读4 个字符.返回实际读入多少个字节
.
 (2)
字节输出流

       如果有FileNotFoundException.创建一个文件.
       
第一个构造方法: FielOutputStream(String name) throws FileNotFoundException 如果有FileNotFoundException.创建一个文件. 如果没有异常则会创建一个新的文件
.
       
另一个构造方法
: F
 (3)
过滤流 三个修饰 Buffered  Data  Object

       BufferedInputStream//向缓冲区中传入数据,read() 传输数据有缓冲区,要记的清空缓冲区.
       BufferedOutputStream//
从缓冲区读出数据.write() 方法.

 

JVM

Data Source

缓冲区

 

 


        JVM内部开辟一块缓冲区,提高了读写的效率


       DataInputStream//
为了解决不能输入8种数据类型的矛盾
       DataOutputStream//
传输8中数据类型,+字符串.writeUTF(String );
       ObjectOutputStream /ObjectInputStream :
对象输入输出流,如果要输入输出这个对象,则这个对象必须要实现
Serializable接口。
(4)
管道流
       PipedOutputStream()
       PipedInputStrem()
       
需要注意的要把两个管道对象联接.pin.connect(pout);

(5) 随机访问文件,
       seek()
把文件指针任意定义在position位置上. 原来指针在2000,seek(1000)调到1000的位置. 从起点开始的1000字节数.

(6) 字符流
       XXXReader –InputStreamReader, BufferedStreamReader(为了提高效率用缓冲流),


       XXXWriter-
OutputStreamReaer, PrintReader(这个类有很多方法,比OutputStreamReaer,好用。呵呵)
       
和字节流区别的问题,能够解决字符乱码问题
.
 
在任何一个国家都兼容ASCII编码,因此A=65,用英文来说没有乱码.呵呵
.
   
ASCII            
一个字符-----1B     任何一种编码均兼容    A<-->65

ISO8855-1 (西欧)    一个字符-----1B

GB-2312 / GBK     一个字符-----2B

Unicode            一个字符-----2B    会增加网络负担    Java中的charUnicode

UTF-8            变长字节(变长的Unicode方式)

                  英文-----1B

                  中文-----3B

 

 (7) 从字节流转成字符输入流 利用桥转换类.
     
字符流是通过桥转换来构造出来的,构造方法的参数是一个字节流。

u       构造方法的记忆方法:

(1)、代表的事物,构造方法就加

例如  FileInputStream   File代表源的事物,构造方法就加源

      FeInputStreamil(File file)

(2)、代表功能,构造方法就放InputStream OutputStream

例如  ObjectInputStream  Object代表功能,构造方法就放InputStream

      DataInputStream   Data分为intbytechar8种简单类型外加String

构造方法放InputStream

      PushbackInputStream  Pushback代表具有缓冲的功能,所以构造方法放InputStream

InputStream, OutputStream为抽象的,子类型不抽象

建议主要记Read / Write 方法即可,其它的掌握规律

比如看到Data就要想到会装不同类型数据: intbytechar …

 

 

InputStream

所有字节输入流的父类,如:FileInputStream, Ob jectInputStream,PipedInputStrean

三个基本的read()方法

   A.  int read() 从流里读出的一个字节或者返回-1;

   B.  int read(byte[]):将数据读入到字节数组中,并返回所读的字节数;

C.  int read(byte[], int p, int len)int参数p表示哪个位置,len表示希望的长度。

 

FileInputStream

DataInputStream

PipedInputStream类(一般了解)

BuferOutputStream 给流增加一个缓冲的功能,以空间换取时间。   TestBufferedStream.java

 

JVM

Data Source

缓冲区

 

 


        JVM内部开辟一块缓冲区,提高了读写的效率

 

根据数据类型选择输入/输出流:

bytebyte[]       InputStream / OutputStream

intbytechar    DataInputStream / DataOutStream

charString       Reader / Writer

Object            ObjectInputStream / ObjectOutputStream

若考虑性能会在前试着加Buffered,  上加;   则在的基础上加。

 

FileOutputStream fo=new FileOutputStream(“a.txt”);

   BufferedOutputStream out=new BufferedOutputStream(fo);

   DataOutputStream dout=new DataOutStream(out);

 

字符流:

   可以解决字符编码问题       

 每个国家制定编码方式,编码方式、解码方式不同——>乱码问题

ASCII             一个字符-----1B     任何一种编码均兼容    A<-->65

ISO8855-1 (西欧)    一个字符-----1B

GB-2312 / GBK     一个字符-----2B

Unicode            一个字符-----2B    会增加网络负担    Java中的charUnicode

UTF-8            变长字节(变长的Unicode方式)

                  英文-----1B

                  中文-----3B

 

这里的重点: 字节流——>字符流

 InputStreamReader

 OutputStreamWriter

 

   FileInputSream fi=new FileInputStream(“2.txt”);

  InputStreamReader ir=new InputStreamReader(fi,”Big 5” );   //在桥转换时指定编码方式

   BufferedReader in=new BufferedReader(ir);

 

   String s;

   While((s=in.readLine())!=null){     //readLine()阻塞方法,到换行符为止

        System.out.println(s);

   }

   in.close();

Java EE中用得较多的还是ReaderWriter

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值