IO概述:

I: input( 读取 ) 把硬盘中的数据,读取到内存中使用

O: output(写入)  把内存中的数据,写入到硬盘中保存

流:数据(字符,字节)1个字符=2个字节 ,1个字节=8个二进制位

IO流:输入输出流

【java笔记】IO流(1):IO流概述,字节输出/输入流读写文件_开发语言


一切都是字节:

一切的文件数据在储存是,都是以二进制的形式存储,都是一个一个的字节,那么传输时一样如此

字节输出流

java.io.OutputStream类:此抽象类是表示输出字节流所有类的超类。输出流接受输出字节并将这些字节发送到某个接受器。

成员方法:

public void close():关闭输出流并释放此流相关联的任何系统资源

public void write(byte[] b):将b.length字节从指定的字节数写入此输出流

public void write(byte[] b,int off,int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流

文件字节输出流:FileOutputStream,把内存中的数据写入到硬盘文件中

构造方法:

FileOutputStream(String name)创建一个项具有指定名称的文件中写入数据的输出文件流

FIleOutputStream(File file)创建一个向指定File对象表示的文件中写入数据的文件输出流

String name:文件路径   file:文件

作用:

1、创建一个FileOutputStream对象

2、会根据构造方法中传递的文件/文件路径,创建一个空的文件

3、会把FileOutputStream对象指向创建好的文件

写入数据的原理:

java程序---->JVM----->OS----->OS调用写数据的方法---->把数据写入到文件中

字节输出流一次写一个字节:

1、创建一个FileOutputStream对象,构造方法中传递写入数据的目的地

2、调用FileOutputStream方法中的write.把数据写入到文件中

3、释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提高程序的效率)

FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
    fos.write(64);
    fos.close();
  • 1.
  • 2.
  • 3.

写数据,把十进制整数转换为二进制整数

任意的文本编辑器,在打开文件的时候,都是查询编码表,把字节转换为字符表示

字节输出流一次写多个字节:

public void write(byte[] b):将b.length字节从指定的字节数写入此输出流

如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表

如果写的第一个字节是负数,那么第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认码表(GBK)

FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
byte[] bytes={66,65,67,68};//BACD
fos.write(bytes);
fos.close();
  • 1.
  • 2.
  • 3.
  • 4.

public void write(byte[] b,int off,int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流

off:开始索引 len:长度

FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
byte[] bytes={66,65,67,68};
fos.write(bytes,1,2);//AC
fos.close();
  • 1.
  • 2.
  • 3.
  • 4.

可以用String类中的方法把字符串,转化为字节数组

byte[] getBytes():把字符串转换为字节数组

FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
byte[] bytes="asd".getBytes(StandardCharsets.UTF_8);
fos.write(bytes);//asd
fos.close();
  • 1.
  • 2.
  • 3.
  • 4.

追加写/续写:

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

FileOutputStream(File file,boolean append):创建一个向指定File对象表示的文件中写入数据的文件输出流

name File:目标路径

append

true: 创建对象不会覆盖源文件,继续在文件的末尾追加写数据

false:创建一个新文件,覆盖源文件

写换行:

windows:\r\n   linux:  /n       mac:/r

FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\a.txt",true);
for(int i=0;i<5;i++){
    fos.write("你好".getBytes(StandardCharsets.UTF_8));
    fos.write("\r\n".getBytes(StandardCharsets.UTF_8));
}
fos.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

字节输入流

java.io.InputStream,所有字节输入流的超类

方法:

int read():从输入流中读取数据的下一个字节

int read(byte[] b):从输入流中读取一定数量的字节,并将其储存在缓冲区数组b中

void close():关闭输入流并释放与该流关联的所有系统资源

FileInputStream:文件字符输入流

作用:把硬盘文件中的数据,读取到内存中使用

构造方法:

FileInputStream(String name)

FileInputStream(File file)

name,file:读取文件的数据源 

读取数据的原理:硬盘--->内存

java--->JVM---->os---->读取文件

字节输入流使用:

1、创建FileInputStream对象,构造方法中绑定要读取的数据源

2、使用FileInputStream对象中的read,读取文件

3、释放资源

FileInputStream fis=new FileInputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
       int len;
        while((len=fis.read())!=-1){
           System.out.println(len);
       }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

掌握循环的写法

字节输入流一次读取多个方法:

int read(byte[] b):从输入流中读取一定数量的字节,并将其储存在缓冲区b中

byte[]b     缓冲作用,储存每次读取到的多个字节。数组长度一般定义为1024(1kb)或者1024的整数倍

返回值int  每次读取的有效字节个数

String类的构造方法

String(byte[] bytes):把字节数组转换为字符串

String(byte[]bytes,int offset,int length):把字节数组的一部分转换为字符串

offset:数组的开始索引,length:长度

FileInputStream fis=new FileInputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
 byte[]bytes=new byte[1024];
int len;
while(len=fis.read(bytes)!=-1){
 System.out.println(new String(bytes,0,len));}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

练习:文件复制

把桌面上a.txt中的内容复制到桌面b.txt中

FileInputStream fis=new FileInputStream("C:\\Users\\暮色年华\\Desktop\\a.txt");
FileOutputStream fos=new FileOutputStream("C:\\Users\\暮色年华\\Desktop\\b.txt");
int len;
while((len=fis.read())!=-1){
       fos.write(len);
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.