IO流 笔记一

IO流

  • IO流用来处理设备之间的数据传输
  • Java对数据的操作是通过流的方式
  • Java用于操作流的对象都在IO包中
  • 流按操作数据分为两种:字节流与字符流
  • 流按流向分: 输入流与输出流

计算机中, 主机 = cpu +内存

 内存属于易失性存储介质。所以,在计算机主机中,是无法长期保存数据的 (所以通常我们将数据保存在主机之外的,主机之外,不管是硬盘,键盘,显示器,鼠标这些统统称之为输入输出设备。)

计算机中要处理的数据都是来自于外部设备,同时也可以将处理过后的数据,写入硬盘等输入输出设备。这些工作,都是在java 中的流来实现

字节流:二进制数据 byte[] 反应在代码上

字符流:字符数据 char [] 反应在代码上

​ 字符流的由来:
​ 其实就是:字节流读取文字字节数据后,不直接操作而是指定的编码表。获取对应的文字。在对这个文字进行操作。简单说:字节流+编码表。

什么情况使用哪种流?
如果数据所在的文件通过windows 自带的记事本打开并能读懂里面的内容,就用字符流。
其他用字节流。
因为不管什么样的数据,都可以用字节流来处理,之所以引入字符流,仅仅只是为了方便堆文本数据的操作

输入流和输出流相对与内存设备而言:

​ 将外设中的数据读取到内存中:输入
​ 将内存的数写入到外设中:输出

IO流常用基类

  • 字节流的抽象基类(顶层父类):1、InputStream 2、 OutputStream

  • 字符流的抽象基类(顶层父类):1、Reader 2、Writer

  • 由这四个类派生出来的子类名称都是以其父类名作为子类类名的后缀。

    而子类名的前缀描述的是功能。

    • 如:InputStream 的子类 FIleInputStream

从熟悉的文字开始字符流:

//需求:将一些文字存储到硬盘的一个文件中。

​ `记住:
如果要操作文件数据,建议优先考虑字符流中的输出流。Writer
​ 硬盘的数据基本体现是文件。希望找到一个可以操作文件的 Writer
​ 找到操作文件对象的FileWriter

package com.file;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        //渐渐一个可以往文件中写入字符数据的字符输出流对象
        /*
        * 既然是往一个文件中写入文字数据,那么在创建对象时,就是
        * 必须明确该文件(用于存储数据目的地)
        *
        * 如果文件不存在,则会自动创建
        * 如果文件存在,则会被覆盖。
        */
        FileWriter fw = new FileWriter("demo.txt");
        /*
        * 调用Writer对象中的Writer(String)方法,写入数据
        * 其实数据写入到了临时存储缓冲区中(流中)。
        */
        fw.write("abfbfd");
        /*
        * 进行刷新,将数据直接写入到目的地中
        */
        //fw.flush();
        /*
        * 关闭流,关闭资源
        * 关闭此流前,会先调用flush刷新缓冲流中的数据目的地
        */
        fw.close();
       // fw.write("haha");//java.io.IOException: Stream closed


    }
}

创建字节流到底做了哪些事情?*


   /*如果该文件存在,但它是一个目录,而不是一个常规文件;或者该文件不存在,
但无法创建它;抑或因为其他某些原因而无法打开它,则抛出 FileNotFoundException。
*/
//和File对文件路径的抽象表示,如果通过抽象路径,来创建FileOutStream对象,那么
//1.如果该路径所代表的文件确实存在:
//  a. 创建 FileOutStream 对象
//  b. 将刚刚创建的FileOutStram 与实际文件关联
//
//2. 如果该抽象路径所代表的文件不存在:
//      a. 首先物理创建该抽象路径所代表的文件
//      b. 创建 FileOutStream 对象
//      c. 将刚刚创建的FileOutStram 与实际文件关联

数据写入成功后,为什么要close() ?

//close 一定不能少,因为垃圾回收器无法直接回收操作系统资源

1)释放系统资源
2)关闭流,若要维护流,需要消耗系统资源,写完了以后,就不需要去维护他,可以把它关掉。

如何实现数据的追加写入?

//创建通道的时候去指明它的第二个参数为true
FileOutputStream fos = new FileOutputStream("a.txt",true);
fos.write(chars,0,2);

FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。

void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

即:

//创建通道的时候去指明它的第二个参数为true
FileOutputStream fos = new FileOutputStream("a.txt",true);
fos.write(chars,0,2);
fos.close();

如何实现数据的换行?

 //可用BufferedWriter newLine
 //声明一个静态常量:
 private static final String LINE_SEPARATOR = System.getProperty("line.separator");
 fileWriter.write("abcde"+LINE_SEPARATOR+"hhhha");//换行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值