Java io流

(一)子节缓冲流
(1) 一次读取一个字节数组的方式要比一次读取一个字节方式高效.
一次读取一个字节数组,相当于构造一个缓冲区,有没有比一次读取一个字节数组还要高效的流?
字节缓冲流 :
(2)字节缓冲输出流:
构造方式:
(第一种开发中) public BufferedOutputStream(OutputStream out):采用的默认的缓冲区大小(足够大了) ,来构造一个字节缓冲输出流对象
public BufferedOutputStream(OutputStream out,int size):指定size缓冲区大小构造缓冲输出流对象
IllegalArgumentException - 如果 size <= 0

写数据的方式:
一次写一个字节
write(int by)
一次写一个字节数组的一部分
write(byte[] b, int off, int len)
(2)字节缓冲输入流

  • public BufferedInputStream(InputStream in):默认缓冲区大小构造缓冲输入流对象
  • public BufferedInputStream(InputStream in,int size):指定缓冲区大小构造缓冲输入流对象
  • public int read()
  • public int read(byte[] b,int off,int len)
  • 在使输入流的时候,
    两种方式读取(一次读取一个字节/一次读取一个字节数在),只能用一种方式,否则,会出现错误!

(3)计算机如何存储中文的?
当前平台默认编码集 :GBK 一个中文两个字节
第一个字节:一定是负数
第二个字节:一般是负数,可能也会是正数,不会影响的结果.
(4)存储文件
IO流:永久存储(耗时)
数据库:永久存储

基本的字节流
文件字节输入流/文件字节输出流
高效的字节流(缓冲流)
StringBuffer:提供了一个字符串缓冲区 (可以在缓冲区中不断追加字符串)
(5)编码和解码
编码和解码:前后的编码格式要一致!
编码:

  • 简单理解:将能看懂的东西--->看不懂的东西
  • 解码:
  • 看不懂的东西---能看懂的东西
  • 举例: 谍战片
    今天老地方见...
  • 编码:
    今---->字节---->二进制数据

  • 解码:二进制数据-->十进制数据--->字节---->字符串

    编码: 将字符串变成一个字节数组

  • public byte[] getBytes() :平台默认编码集(默认的是Gbk)
  • public byte[] getBytes(Charset charset) ;"指定编码格式
  • 解码:将字节数组--->字符串

  • public String(byte[] bytes) :使用平台默认编码集(gbk)
  • public String(byte[] bytes,Charset charset):用指定的编码格式来解码
    (二)字符流
    (1)使用字节流一次读取一个字节的方式,会造成中文乱码--->Java提供了一个字符流(专门用来解决中文乱码问题)
    (2 字符输入流:Reader
    字符输出流:Writer
  • 字符输出流/字符输入流:都是抽象类
  • 使用一个子类:转换流
    字符输出流的构造方法
  • public OutputStreamWriter(OutputStream out):使用默认的编码格式构造一个字符转换输出流对象
  • public OutputStreamWriter(OutputStream out, Charset cs):使用指定编码格式构造一个字符转换输出流对象

    转换流的构成=字节流+编码格式(平台默认/指定)
    转换流的对象的创建,格式比较长,非常麻烦,Java--->转换流的便捷类
    Reader:抽象类:字符输入流

  • inputStreamReader(字符转换输入流 :inputStream+编码格式)
  • 便捷类:FileReader,这个类可以直接对文件进行操作

    Writer:抽象类:字符输出流

  • outputStreamWriter(字符转换输出流:outputStream+编码格式)
    (3)字符转换输入流:InputStreamReader
  • InputStreamReader(InputStream in) :构造一个字符转换输入流,默认编码
  • public InputStreamReader(InputStream in,Charset cs) 构造一个字符转换输入流,指定编码
    字符转换输入流=字节流+编码格式
    (4字符输入流读数据的方法:
  • int read(char[] chs):读取一个字符数组
  • int read():读取单个字符
    (5)字符输出流写数据的功能:
  • public void write(int c):写单个字符
  • public void write(char[] cbuf):写字符数组
  • public abstract void write(char[] cbuf, int off, int len):写字符数组的一部分
  • public void write(String str):写字符串
  • public void write(String str,int off, int len):写字符串的某一部分
  • *flush和close方法的区别?

  • close:关闭该流,关闭该流对象以及它关联 的资源文件,关闭之后,不能再对流对象进行操作了,否则会有异常
  • flush:刷新该流,为了防止一些文件(图片文件/音频文件),缺失,或者没有加载到流对象中,刷新了该流,还是可以流对象进行操作
    字符缓冲输入流/字符缓冲输出流
    杂七杂八的流(properties:属性集合类/合并流/序列化Serializable/内存操作流)
    (三)字符缓冲流
    在字符流中提供了一个更高效的流-->字符缓冲流
  • 字符缓冲输入流
  • 字符缓冲输出流
    (1)BufferedReader:字符缓冲输入流
    构造方法
  • public BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
  • public BufferedReader(Reader in, int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
    (2)BufferedWrier:文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
    构造方法
  • BufferedWriter(Writer out) :默认缓冲区大小构造字符缓冲输出流对象
  • BufferedWriter(Writer out,int size):指定缓冲区大小

(3)字符缓冲输出流:

  • 特有功能:public void newLine():写入一个行的分隔符号
  • *字符缓冲输入流:

  • 特有功能:public String readLine():一次读取一行
    (4)使用字符缓冲流进行复制操作
    分别使用两种方式
  • 1)一次读取一个字符数组
  • 2)一次读取一行
    (四)其他流
    (1)内存操作流:适用于临时存储文件.
    内存操作输入流:byteArrayInputStream
  • ByteArrayInputStream(byte[] buf)
    内存操作输出流: byteArrayOutputStream
    构造方法:ByteArrayOutputStream()
    内存操作流:一个程序结束后,那么这些程序的变量,就会从内存消失(马上消失的这些数据进行读取写入)
    (2)数据流:针对Java基本类型的数据进行读写操作
    数据输入流:DataInputStream
    数据输出流:DataOutputStream
    (3)打印流
    字符打印流(针对文本进行操作:PrintWriter)
    字节打印流(printStream 和标准输出流有关系 System.out;)
    PrintWriter:属于输出流
    1)只能写数据(只能针对目的地文件进行操作),不能读数据(不能针对源文件进行操作)
    2)可以针对文件直接进行操作
    如果一个类中的构造方法里面有File对象或者String类型数据,这个类可以对文本文件直接操作
  • FileInputStream
  • FileOutputStream
  • FileWriter
  • FileReader..
  • PrintWriter
  • 3)自动刷新功能::PrintWriter(OutputStream out/Writer out,boolean autoflush);第二个参数如果是true 表示启动自动刷新功能
  • 4)打印的方法:print(XXX x)/println(XXX xx)
    (4)合并流
    SequenceInputStream 表示其他输入流的逻辑串联(合并流)
    构造方法
  • public SequenceInputStream(InputStream s1, InputStream s2)
  • sequenceInputStream另一种构造方式
  • public SequenceInputStream(Enumeration e)

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/*
sequenceInputStream另一种构造方式
public SequenceInputStream(Enumeration e)

  • 将多个输入流对象进行合并
  • a.txt+b.txt+c.txt--->d.txt
  • */
    public class SequenceInputStreamDemo2 {

    public static void main(String[] args) throws IOException {
    //StringDemo.java+SystemInDemo.java+PrintWriterDemo.java--->Copy.java文件中

    //定义一个集合Vector
    Vector<InputStream> v  = new Vector<InputStream>() ;
    //使用InputStream封装文件
    InputStream s1 = new FileInputStream("StringDemo.java") ;
    InputStream s2 = new FileInputStream("SystemInDemo.java") ;
    InputStream s3 = new FileInputStream("PrintWriterDemo.java") ;
    
    //将流对象添加到集合中
    v.add(s1) ;
    v.add(s2) ;
    v.add(s3) ;
    
    //特有功能
    Enumeration<InputStream> en = v.elements() ;
    
    //创建合并输入流对象
    SequenceInputStream sis = new SequenceInputStream(en) ;
    //创建字节缓冲输出流对象
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("Copy.java")) ;
    
    //一次读取一个字节数组
    byte[] bys = new byte[1024] ;
    int len = 0 ;
    while((len=sis.read(bys))!=-1) {
        bos.write(bys, 0, len);
        bos.flush();
    }
    
    //关闭资源
    bos.close();
    sis.close();

    }
    }
    (5)标准的输入输出流

  • InputStream in = System.in
  • PrintStream out = Syste.out ;
  • *jdk5以后,Java--->Scanner(InputStream in)

  • 键盘录入
  • 1)Scanner
  • 2)BufferedReader里面包装字符转换输入流,包装System.in
    标准输出流
  • PrintStream ps = System.out ;
    使用BufferedWriter 去包装System.out
    (6)对象流
    序列化:将对象按照流的方式存储到文本文件中或者再网络中传输 对象---->流数据 序列化流 (ObjectOutputStream)
    反序列化:将文本文件中的流对象或者网络传输中的流对象还原成对象 流数据--->对象 反序列化流(ObjectInputStream)
    java.io.NotSerializableException :当前类未实现序列化功能的异常

  • Serializable:接口 没有构造方法,没有字段,也没有方法
  • 接口---->标记接口

  • 自定义类要实现序列化功能,必须实现接口Serializable接口

  • 类实现了serializable也意味着他是标记类
  • 假设之前操作针对Peroson操作序列的时候,产生一个标记 Preson.class--->固定ID 100
  • name -100
  • age -100
  • 已经序列化完毕了,然后有修改了Person类里面的一些东西,加入了toString()
  • Person.class---固定id -- 200
  • (五)属性集合类
    (1)Properties:表示了一个持久的属性集(简称:属性集合类) extends Hashtable<K,V> Map集合的

  • 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
  • public Properties():无参构造
    (2)属性集合类的特有功能:
  • public Object setProperty(String key, String value) :给属性列表中添加键和值,并且强制都使用String
  • public Set<String> stringPropertyNames():遍历的功能
  • public String getProperty(String key)用指定的键在此属性列表中搜索属性
    可保存在流中或从流中加载,只能使用属性集合类
    public void store(Writer writer,String comments):把集合中的数据保存文本文件中(属性集合)
    public void load(Reader reader):将文本文件中的数据加载到属性集合中
    (六)多线程
    (1)何实现多线程程序呢?
    要实现多线程程序,需要开启进程,
    开启进程,是需要创建系统资源,但是Java语言不能创建系统资源
    只有C/C++可以创建系统资源, 利用c语言创建好的系统资源实现
    Java提供了一个类:Thread类
  • 实现多线程程序的步骤:
  • 1)将类声明为 Thread 的子类
  • 2)该子类应重写 Thread 类的 run 方法
  • 3)在主线程进行该自定义的线程类的对象的创建
    并行和并发(高并发:MyBatis --->IBatis:半自动化)
    强者逻辑上的同时,指的是同一个时间段内
    后者物理上的同时,指的是同一个时间点
    MyThread类就是一个执行线程类
    并且重写Thread类中的run 方法
    run()方法里面应该是一些耗时的操作,IO操作/循环语句..
    (2)Thread 类提供了一些方法
  • public final void setName(String name):给线程起名称
  • public final String getName() :获取线程名称
    (3)跟线程优先级相关的方法:
  • public final int getPriority()返回线程的优先级。
  • public final void setPriority(int newPriority)更改线程的优先级
  • 线程存在一个默认优先级
  • public static final int MAX_PRIORITY 10 最大优先级
    public static final int MIN_PRIORITY 1 最小优先级
    public static final int NORM_PRIORITY 5 默认优先级
    (4)public final void setDaemon(boolean on) :true时,表示为守护线程
  • 将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。(守护线程不会立即结束掉,它会执行一段时间在结束掉)
  • 该方法必须在启动线程前调用。
    (5)方法
  • public final void join():等待该线程终止 interruputedException 中断异常
  • public static void sleep(long millis):线程睡眠 指定是时间毫秒值
  • throws InterruptedException
  • 两个区别?
    public final void stop() ;强迫线程停止执行。 不会执行了 (过时了),方法能使用的
    public void interrupt()中断线程。 表示中断线程的一种状态
    面试题
    区别?
    wait(): wait()调用的,立即释放锁 (同步锁/Lock锁)
    sleep(): 线程睡眠,调用不会释放锁
  • public final void stop() ;强迫线程停止执行。 不会执行了 (过时了),方法能使用的
  • public static void yield()暂停当前正在执行的线程对象,并执行其他线程

转载于:https://blog.51cto.com/13670525/2119956

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值