大家好,我是痛而不言笑而不语的浅伤。本次带大家详细学习一下IO流中的字节流以及文件字节流的使用,对文章中描述错误的希望大家积极指出。
博客首页:来爹
欢迎关注点赞收藏留言
❤:热爱Java学习,期待一起交流!
作者水平很有限,如果发现错误,求告知,多谢!
有问题可以私信交流!!!
目录
什么是IO流?
概念
分类
什么是字节流?
字节流的分类
什么是字节输出流?
字节输出流的分类
文件字节输出流
作用
构造方法
参数
作用
字节输出流的使用步骤
成员方法及使用
一次写入一个字节
参数
一次写入多个字节
参数
追加写和换行写
参数:
什么是字节输入流?
字节输入流的分类
文件字节输入流
作用
构造方法
参数
作用
字节输入流的使用步骤
成员方法及使用
一次读取一个字节
释放资源的方法
一次读取多个字节
总结
I的意思即input就是输入(读取)的意思。O的意思即output就输出(写入)的意思。流就是数据(字节、字符)的意思。通俗的说就是对数据的输入和输出的操作过程。
IO流又分为字节流和字符流。
本章我们学习一下字节流,那什么是字节流呢?我们继续往下看吧!
字节流通俗的说就是通过以二进制数字的形式,对任意文件数据进行一个字节一个字节的传输过程我们就称为字节流。
字节流又分为:字节输出流和字节输入流。
在Java中InputStream就是字节输入流的最顶层父类,OutoutStream是字节输出流的最顶层父类。下面我们依次来学习一下字节输出流和字节输入流。
就是将数据从内存写入到硬盘中的文件,OutoutStream就是字节输出流的类,而它是一个抽象类,是所有字节输出流的最顶层父类,它定义了字节输出流的基本共性功能方法,而抽象类是无法直接使用的,我们就通过它的一些子类来学习这个类,子类就是以下这些。
字节输出流分为以下几个类:
ByteArrayOutputStream:字节数组中写数据的字节输出流
FileOutputStream:文件中写数据的字节输出流
FilterOutputStream:带过滤器的字节输出流
ObjectOutputStream:写对象的字节输出流
PipedOutputStream;管道流
本章我们重点来学习了解一下FileOutputStream,就是文件中写数据的字节输出流。
文件字节输出流FileOutputStream继承了它的父类OutputStream。
文件输出流就是将内存中的数据写入到硬盘的文件中。
学习一个类就要从它的构造方法学起来,我们就继续往下看吧!
FileOutputStream构造方法有5个,我们就用其中2个来进行学习。
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
就是写入数据的目的地
File file:此参数所传递的是一个文件
File name:此参数所传递的是一个文件的路径
既然知道了构造方法的参数、作用和字节输出流的使用步骤那么下面我们就学习成员方法来用一下吧。
void |
close() 关闭此文件输出流并释放与此流有关的所有系统资源。 |
该成员方法的作用就是上面我们使用步骤里的第三步,释放资源。
void |
write(int b) 将指定字节写入此文件输出流。 |
int b:表示该方法传递的就是一个字节
该成员方法作用就是在文件中写入数据,不过一次只能写入一个字节。此方法的使用步骤如下:
例如:
在C盘下有一个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,我们就在这个文件中写入数据吧,代码如下:
public static void main (String[]args) throws IOException//此处需要抛一个 IOException异常{
//创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
FileOutputStream fos=new FileOutputStream("c:\Java\\a.txt");
//调用FileOutputStream对象中的方法write,把数据写入到文件中
fos.write(97);//对应阿斯科码表中的a
//释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提高程序的效率)。
fos.close();
}
void |
write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 |
void |
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 |
byte[] b:表示传递的是存储多个字节的数组
int off:表示要写入一部分数据在数组中的开头索引
int len:表示写入这部分数据的字节长度
这两个成员方法的作用也是在文件中写入数据的,不过可以一次写入多个字节,那么我们就继续看一下这两个方法在怎么使用吧。
例如:
还是在C盘下有一个名称为Java的文件夹,而这次我们在该文件夹下创建一个b.txt的文件,然后再把数据写入这个文件中。
代码如下:
public static void main (String[]args) throws IOException//此处需要抛一个 IOException异常{
//创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
FileOutputStream fos=new FileOutputStream(new File("c:\\Java\\a.txt"));//此处我们使用匿名对象创建一个文件
//创建一个存储多个字节的数组
byte[] bytes={65,66,67,68,69};//对应阿斯科码表中的ABCDE
//调用FileOutputStream对象中的方法write,把数据写入到文件中
//调用第一个方法
fos.write(bytes);//写入文件结果:ABCDE
//调用第二个方法
fos.write(bytes,1,3);//写入文件结果BCD
//释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提高程序的效率)。
fos.close();
}
追加写(续写)
使用两个参数的构造方法
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。 |
File file,String name:都表示写入数据的目的地
boolean append:表示追加写开关
true:创建对象不会覆盖源文件,继续在文件末尾追加写数据
false:创建一个新文件,覆盖源文件
例如:
C盘下有一个文件:a.txt,里面原本有“你好!”,再追加写入一个“Java。”,结果显示“你好!Java。”,代码如下:
//创建FileOutputStream对象,传递目的地,设置追加写开关
FileOutputStream fos=new FileOutputStream("C:\\a.txt",true);
//写数据
fos.write("Java。".getBytes());
//释放资源
fos.close();
换行写
就是加上换行符
window:\r\n
Linux:/n
mac:/r
例如在上面文件后面我们继续写入3次:你好!世界。
//创建FileOutputStream对象,传递目的地,设置追加写开关
FileOutputStream fos=new FileOutputStream("C:\\a.txt",true);
//写数据,写入3次就是循环3次
for (int i = 0; i <3; i++) {
fos.write("你好!世界。".getBytes());
fos.write("\r\n".getBytes());//循环加上换行符
}
//释放资源
fos.close();
文件显示结果:
你好!Java。
你好!世界。
你好!世界。
你好!世界。
输入流与输出流恰好相反,就是将数据从硬盘中的文件读取到内存中,而字节输入流的类是InputStream,是所有字节输入流的最顶层父类,也是一个抽象类,它也定义了字节输入流的基本共性功能方法,而抽象类是无法直接使用的,我们也就通过它的一些子类来学习这个类,子类就是以下这些。
字节输入流分为以下几个类:
AudioInputStream:读取音频的输入流
ByteArrayInputStream:读取字节数组的输入流
FileInputStream:读取文件的输入流
FilterInputStream:带过滤器的输入流
ObjectInputStream:读取对象的输入流
PipedInputStream:管道流
SequenceInputStream:读取队列的输入流
StringBufferInputStream:读取字符串的输入流
输入流我们也重点来学习了解一下FileInputStream,就是读取文件的字节输入流。
文件字节输入流FileInputStream继承了它的父类InputStream。
文件输入流就是将硬盘中文件的数据写入到内存中。
学习一个类就要从它的构造方法学起来,我们就继续往下看吧!
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 |
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 |
就是读取文件的数据源
File file:此参数所传递的是一个文件
File name:此参数所传递的是一个文件的路径
知道了构造方法的参数、作用和字节输入流的使用步骤那么下面我们就学习成员方法来用一下吧。
int |
read() 从此输入流中读取一个数据字节。 |
void |
close() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
例如:
在C盘下有一个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,里面有“abc”三个字符,我们就把这个文件读取一下吧,代码如下:
public static void main(String[] args) throws IOException {
//1. 创建一个FileInputStream对象,构造方法中传递读取数据的数据源。
FileInputStream fis=new FileInputStream("c:\\Java\\a.txt");
// 2. 调用FileInputStream对象中的方法read,读取文件
//定义一个变量记录读取到的字节
int len=0;
while((len=fis.read())!=-1){
System.out.println((char)len);//打印结果:abc
}
// 3. 释放资源
fis.close();
}
int |
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
例如:
还是在C盘下这个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,里面有“abcd”三个字符,我们就把这个文件读取一下吧,代码如下:
private static void show02() throws IOException {
// 1. 创建一个FileInputStream对象,构造方法中传递读取数据的数据源。
FileInputStream fis=new FileInputStream("c:\\Java\\a.txt");
// 2. 调用FileInputStream对象中的方法read,读取文件
//定义一个字节数组存储到缓冲区
byte[] bs=new byte[2];
fis.read(bs);
System.out.println(new String(bs));//打印结果:ab
fis.read(bs);
System.out.println(new String(bs));//打印结果:cd
// 3. 释放资源
fis.close();
在输出控制台打印结果:abcd
今日的分享到此结束,由于笔者还在学习的路上辗转徘徊,水平有限,文章中可能有一些不对之处,还请各位大佬指正。最后祝愿每一个热爱编程的小伙伴,学习的路上不迷路,实现自己的追求。如果大家觉得还不错,希望多多支持一下,点赞,关注加收藏。