父类和子类
以他的名称为后缀

文件就是保存数据的地方


流是经历的路径
“江流”其实就算是一个路径
输入与输出的过程
输入,文件到内存
输出,内存到文件

如何获取文件的信息



创建一级目录命令
Mkdir()
创建多级目录
mkdirs()
- @Test
-
- publicvoidm3(){
-
- StringdirectoryPath="D:\\demo\\a\\b\\c";
-
- Filefile=newFile(directoryPath);
-
- if(file.exists()){
-
- System.out.println(directoryPath+"存在..");
-
- }else{
-
- if(file.mkdir()){
-
- System.out.println(directoryPath+"创建成功..");
-
- }else{
-
- System.out.println(directoryPath+"创建失败..");
-
- }
-
- }
-
- }

这里跟linux直接结合了,跟linux的一模一样。
其实就是API的调用

Input 和 output
处理数据传输
文件读取
放在java.io

数据放在底层
水流
程序和内存

字符流是按照字符为单位的
(字符流的携带信息更多)
二进制文件(声音、视频) 字节操作
无损操作
字符流(文本文件)更好
不同的应用场景
节点流、处理流、包装流


类似于外卖小哥


流是要被关闭的,流是一种资源

如果不及时关闭,就会越来越积累地越多

- package com.hspedu.inputstream;
-
- import org.testng.annotations.Test;
-
- import java.io.FileInputStream;
- import java.io.IOException;
-
- /**
- * @author abner
- * @version 1.0
- *演示的使用(字节流入流 文件 》 程序)
- *
- *
- *
- */
- public class FileInputstream_ {
- public static void main(String[] args) {
-
- }
- @Test
- public void readFile01(){
- String filePath = "d:\\hello.txt";
- int readData = 0;
- //字节数组
- byte[] buf = new byte[8];//一次读取八个字符
- int readLength = 0;
-
- FileInputStream fileInputStream = null;
- //扩大作用域
- try{
- //创建FileInputstream对象,用于读取文件
- fileInputStream = new FileInputStream(filePath);
- //从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止。
- //如何返回-1,表示读取完毕
- while ((readLength = fileInputStream.read(buf)) != -1) {
- System.out.print(new String(buf, 0, readLength));//显示
- //如果读取正常,返回实际读取的字节数
- }}
- catch (IOException e) {
- e.printStackTrace();
- }
- finally{
- //关闭文件流,释放资源
-
- try {
- fileInputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }}
在IO流里,输入输出分为4步:格式化/解析,缓冲,编码转换和传递。
格式化/解析:在内部数据表示(以字节为单位)与外部数据表示(以字符为单位)之间进行双向转换。例如一个2字节的整数10002,就需要5个字符来表示。
缓冲:用于在格式/解析与传递之间缓存字符序列。对于输出,较短的字符序列格式化之后并不马上输出,而是保存在缓冲区里,待累积到一定规模之后再传递到外部设备。相反,从外部设备读入的大量数据也是先放在缓冲区,然后逐步取出完成输入。默认时,IO流的输入输出都是经过缓冲的,也可以让IO流工作在无缓冲模式下。
编码转换: 是将一种字符表达式转换成另一种字符表达式。如果格式化产生的字符表达式与外部字符表达式不同(输出时),或者外部表达式与IO流能解析的表达式不同(输入时),就必须进行编码转换。如多字节编码与宽字符编码之间的转换等。多数情况下并不需要进行编码转换。
传递:主要是与外部设备进行通信。输出时,传递负责将经过格式化、缓冲即编码转换后的字符序列发送到外部设备;输入时,则负责将外部设备抽取数据,为其后进行的编码转换、缓冲及解析提供字符序列。
编辑 播报
IO流类库在不同平台的具体实现上,可能会有所变化,但从总体设计上来看,C++流库主要由两个流类层次组成:
(1)以streambuf类为父类的类层次
主要完成信息通过缓冲区的交换。派生层次如下:
缓冲区:是一个队列数据结构,由一字符序列和两个指针组成,这两个指针分别指向字符要被插入或被取出的位置。
streambuf类为所有的streambuf类层次对象设置了一个固定的内存缓冲区,动态划分为两部分:
用做输入的取区,用取指针指示当前取字符位置。
用做输出的存区,用存指针指示当前存字符位置。
(2)以ios类为父类的类层次
ios类及其派生类是在streambuf类实现的通过缓冲区的信息交换的基础上,进一步增加了各种格式化的输入/输出控制方法。它们为用户提供使用流类的接口,它们均有一个指向streambuf的指针。
ios类有四个直接派生类:
istream
ostream
fstreambase
strstreambase
这四种流作为流库中的基本流类。ios类的派生层次如下: