IO流基本概念和操作

什么是IO流

IO指的是Input/Output,IO流:输入输出流。 统称为数据流(IO Stream)

在Java程序中,对于数据的输入 / 输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的流类,用以获取不同种类的数据;

简单来说IO流是存储和读取数据的解决方案

IO流分类

按流向分:

◦ 输入流:程序可以从中读取数据的流

◦ 输出流:程序能向其中写入数据的流

按数据传输单位分:

◦ 字节流:以字节为单位传输数据的流,可以操作所有类型的文件

◦ 字符流:以字符为单位传输数据的流,只能操作纯文本文件

什么是纯文本文件

可以用windows自带的记事本打开并且能读懂的文件

如txt md iml文件

字节流

FileOutputStream

类创建一个能从文件读取字节的InputStream类,它的两个常用的构造方法如下:

FileInputStream(Stringfilepath)

FileInputStream(FilefileObj)

这两个构造方法都能引发FileNotFoundException异常。这里,filepath是文件的绝对路径,也可是相对路径。fileObj是描述该文件的File对象。

使用字符串类型的文件名来创建一个输出流对象:

OutputStream f = new FileOutputStream("C:\\a.txt")

也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:

File f = new File("c:\\a.txt");** 

InputStream f1 = new FileInputStream(f);

 

 注意细节

1、实例化文件对象

2、实例化输入流对象(如果文件不存在出异常,和输出流不同)

3、调用read方法读取内容到内存

4、关闭资源

File file = new File("temp/a.txt");
FileInputStream fis = new FileInputStream(file);
try {
    int read1 = fis.read();
    System.out.println(read1);
    int read2 = fis.read();
    System.out.println(read2);
    int read3 = fis.read();
    System.out.println(read3);
    int read4 = fis.read();
    System.out.println(read4);

    int read5 = fis.read();
    System.out.println(read5);
    fis.close();


    } catch (IOException e) {
        throw new RuntimeException(e);
    }

read()方法每次读取一个字节,返回读取到的字节,并且光标移动下一次读取的位置;所以每次read()都是读取不同的内容;

 

read的三种方式

第一种

FileInputStream fis = new FileInputStream(file);
int read = fis.read();

最基本的一次读取一个字节

第二种

把内容读取到一个字节数组当中;但是读取的内容长度是随机的;有可能一次性读完;也有可能读不完

byte[] bytes= new byte[4];
File file = new File("temp/a.txt");
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);

String str =new String(bytes);
System.out.println(str);

所以这种方式一般结合while一起使用

查看源码这个read方法返回的是读取的长度,因为前面讲过是随机的,故而长度不是固定的;是通过read放回

第三种

read(bytes,int,int);

指定存储到bytes的固定位置---不重要

FileOutputStream 

该类用来创建一个文件并向文件中写数据。

使用字符串类型的文件名来创建一个输出流对象:

OutputStream f = new FileOutputStream("C:\\a.txt")

也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:

File f = new File("C:\\a.txt");
OutputStream fOut = new FileOutputStream(f);

注意细节

  1. 创建字节输出对象

    ①参数是字符串表示的路径或File对象都是可以的

    ②如果文件不存在则创建文件,前提是要保证父级路径存在

    ③如果文件已存在,则会清空文件

  2. 写数据

    write方法的参数是整数,实际写道本地文件中的整数在ACSII上对应的字符

  3. 释放资源

    每次使用完流都要释放资源

write 三种方式

第一种

一次输出一个字节

FileOutputStream fos = new FileOutputStream(file);
try {
    fos.write(97);//-->a

    fos.close();
} catch (IOException e) {
    throw new RuntimeException(e);
}

第二种

一次输出多个

try {
    fos.write(str.getBytes()); //自定义一个byte[]
    fos.close();
} catch (IOException e) {
    throw new RuntimeException(e);
}

第三种

方式指定内容

try {
    fos.write(bytes,1,2);//下标 和长度
    fos.close();
} catch (IOException e) {
    throw new RuntimeException(e);
}
FileOutputStream的另一种写法
//文件名 :fileStreamTest2.java
import java.io.*;
 
public class fileStreamTest2 {
    public static void main(String[] args) throws IOException {
 
        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建
 
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
 
        writer.append("中文输入");
        // 写入到缓冲区
 
        writer.append("\r\n");
        // 换行
 
        writer.append("English");
        // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
 
        writer.close();
        // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
 
        fop.close();
        // 关闭输出流,释放系统资源
 
        FileInputStream fip = new FileInputStream(f);
        // 构建FileInputStream对象
 
        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 构建InputStreamReader对象,编码与写入相同
 
        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 转成char加到StringBuffer对象中
        }
        System.out.println(sb.toString());
        reader.close();
        // 关闭读取流
 
        fip.close();
        // 关闭输入流,释放系统资源
 
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值