字节流与字符流

java.io包中,流分为两种 **字节流与字符流 **

1.1 字节流:

InputStream(输入流) , OutputStream(输出流);输入流与输出流是相对参考系的而言的

字节操作流:原生操作,不需要处理;

应用场景:进行网络传输、磁盘数据保存 时的数据类型:字节(文件储存、网络传输);

1.2 字符流:

Reader ,Writer

字符操作流:通过转换得来的,需要中间处理;

应用场景:用于蚊子处理,尤其是处理中文时支持较好,除此以外所有流处理均使用字节流

1.3 流的基本操作流程

1.根据文件路径创建File类对象(取得终端对象);

2.根据字节流或字符流的子类实例化父类对象;

3.进行数据的读取或写入操作(进行数据的输入和输出);

4.关闭流;(对于IO操作属于资源处理,所有的资源处理操作(IO、数据库、网络操作)最后都必须进行关闭)

1.4 AutoCloseable 自动关闭支持

从JDK1.7 开始追加一个AutoCloseable 接口,这个接口的主要目的是进行流的自动关闭,但是这种处理方法必须处在try代码块中时才会自动调用。

2.字节输出流(OutputStream)(抽象类)

2.1 定义结构

使用此类在程序中往文件中写入数据

public abstract class OutputStream implements Closeable,Flushable

2.2 方法

2.2.1 接口方法

OutputStream类实现了Closeable ,Flushable两个接口,实现的抽象方法有:

1.Closeable(关闭):public void close() throws IOException;

2.Flushable (刷新缓冲区):public void Flushable() throws IOException;

2.2.2 其他方法:

1.将给定的字节数组内容全部输出

public void write(byte b[]) throws IOException

2.将部分字节数组内容输出

public void write(byte b[],int off,int len) throws IOException

3.输出单个字节

public abstract void write( int b) throws IOException

2.3 FileOutputStream 类

因为OutputStream是一个抽象类,实例化对象必须由子类实现,引入FileOutputStream

2.3.1 定义
public class FileOutputStream extends OutputStream
  • 文件输出流是用于将数据写入到输出流File或一个FileDescriptor 。 文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileOutputStream (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
  • FileOutputStream用于写入诸如图像数据的原始字节流。 对于写入字符流,请考虑使用FileWriter
2.3.2 构造方法

1.接收File类(覆盖)

public FileOutputStream(File file) throw FileNotFoundException
//创建文件输出流以写入由指定的 File对象表示的文件
package JAVASE.IOtext;
import java.io.*;

/**
 * @Name: 实现文件内容的输出
 * @Author:ZYJ
 * @Date:2019-05-09-16:48
 * @Description: 使用OutputStream 类
 */
public class Test6 {
    public static void main(String[] args) throws IOException {
        //1.取得终端对象
        File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
        if(!file.getParentFile().exists()){//判断父路径是否存在
            file.getParentFile().mkdirs();//若不存在 创建目录
        }
        //2.取得相应终端输出流
        OutputStream output = new FileOutputStream(file);//子类向上转型
        String msg ="hello world!";
        //3.数据的读取或写入
        output.write(msg.getBytes());//getBytes() 转为字节数组 write() 接收数组类型
        //4.关闭流
        output.close();
    }
}

使用此方法,写入的内容会覆盖,若要追加使用以下重载方法

2.接收File类(追加)

public FileOutputStream(File file,boolean append)//创建文件输出流以写入由指定的 File对象表示的文件

追加参数为boolean类型 ,默认为false,若要追加,将其置为true

package JAVASE.IOtext;

import java.io.*;

/**
 * @Name: 追加文件内容
 * @Author:ZYJ
 * @Date:2019-05-09-17:33
 * @Description: ;使用FileOutputstream(Flie file,boolean append)
 */
public class Test7 {
    public static void main(String[] args) throws Exception {
        //1.取得终端对象
        File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        //2.取得相应终端输出流
        OutputStream outputStream = new FileOutputStream(file,true);
        String msg=" hello java!";
       //3.数据的读取和写入
        outputStream.write(msg.getBytes());
        //4.关闭流
        outputStream.close();
    }
}

3. 字节输入流 InputStream

3.1 定义结构

使用此类在程序中读取文件内的数据

public abstract class InputStream implements Closeable

3.2 方法

1.读取单个字节,每次读取一个字节的内容,直到没有数据返回-1;

public abstract int read() throws IOException

2.读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组大小大于读取的数据大小,则返回的就是读取个数;如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度;如果没有数据了还在读,则返回-1

public int read(byte b[]) throws IOException

3读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满则返回长度(len),如果没有读取满则返回读取的数据个数,如果读取到最后没有数据了返回-1

public int read(byte b[],int off,int len) throws IOException

代码示例

package JAVASE.IOtext;

import java.io.*;

/**
 * @Name:字节输入流操作
 * @Author:ZYJ
 * @Date:2019-05-15-16:03
 * @Description:
 */
public class Test8 {
    public static void main(String[] args) {
        //1.定义文件路径
        File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
        //保证文件存在
        if(file.exists()){
            try {
                //输入流接收文件
                InputStream input = new FileInputStream(file);
                //定义字节数组
                byte[] data = new byte[1024];
                //输入流文件调用read() 方法读取文件中内容,传入至data参数中  长度用len接收
                //返回-1 说明读取完成
                int len = input.read(data);
                //将字节数组的内容转为字符串 此处使用构造方法参数分别为  源数据 ,起始位置,结束位置
                String result = new String(data,0,len);
                System.out.println(result);
                //关闭流
                input.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4.字符输出流writer

4.1 定义

从程序中给文件写入内容

public abstract class Writer implements Appendable,Closeable,Flushable

4.2 缓冲区

字符流中有缓冲区,程序先将缓冲区内容输出至终端,后输出;若不关闭流,则处理失败(数据默认保存在缓冲区,不会输出至终端) 若想在不关闭流的基础上输出缓冲度内容,可使用Flushable() 强制刷新缓冲区,此时终端输出成功,但是流未关闭

4.3 方法

public void write(String str) throws IOException//直接将字符串写入程序
package JAVASE.IOtext;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/**
 * @Name:字符输出流使用
 * @Author:ZYJ
 * @Date:2019-05-15-17:01
 * @Description:
 */
public class Test9 {
    public static void main(String[] args) throws IOException {
        //1.取得终端对象
        File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");

        if(!(file.getParentFile().exists())){
            file.getParentFile().mkdirs();
        }
        String str = "哈哈哈哈哈!!! ";
        //2.取得输出流
        Writer out = new FileWriter(file,true);
        //3.输出
        out.write(str);
        //4.关闭流
        out.close();

    }
}

5. 字符输入流 Reader

Reader类中没有方法可以直接读取字符串类型,这个时候只能通过字符数组进行读取操作

package JAVASE.IOtext;
import java.io.*;
/**
 * @Name:字符输入流
 * @Author:ZYJ
 * @Date:2019-05-15-17:26
 * @Description:
 */
public class Test10 {
    public static void main(String[] args) throws IOException {
        //1.获取终端流
        File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
        if(file.exists()){
            //2.获取输入流
            Reader in = new FileReader(file);
            char[] data = new char[1024];
            //3.读取数据
            int len = in.read(data);
            String result = new String(data,0,len);
            System.out.println(result);
            //4.关闭流
            in.close();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值