字节流、字符流
主要内容
IO 流
字节流
字符流
异常处理
Properties
教学目标
能够说出IO流的分类和功能
能够使用字节输出流写出数据到文件能够使用字节输入流读取数据到程序
能够理解读取数据read(byte[])方法的原理能够使用字节流完成文件的复制
能够使用FileWirter写数据到文件
能够说出FileWriter中关闭和刷新方法的区别能够使用FileWriter写数据的5个方法
能够使用FileWriter写数据实现换行和追加写
能够使用FileReader读数据
能够使用FileReader读数据一次一个字符数组
能够使用Properties的load方法加载文件中配置信息
输入输出流
第一章 IO概述
1.1 什么是IO
我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 input 和output,即流向内存是输入流,流出内存的输出流
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
1.2 IO的分类:
根据数据的流向分为:输入流和输出流。
输入流 :把数据从 其他设备 上读取到 内存 中的流。
输出流 :把数据从 内存 中写出到 其他设备 上的流。
根据数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流
1.3 顶级父类们
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流InputStream | 字节输出流OutputStream |
字符流 | 字符输入流Reader | 字符输出流Writer |
第二章 字节流
2.1 一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一 样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底 层传输的始终为二进制数据。
2.2 字节输出流【OutputStream】
java.io.OutputStream
此类是一个抽象类,表示输出字节流的所有类的超类
2.3 FileOutputStream类
java.io.FileOutputStream extends OutputStream
OutputStream有很多子类,我们从最简单的一个子类开始。
FileOutputStream类是文件输出流,用于将数据写出到文件。
java.io.FileOutputStream extends OutputStream
作用:把内存的数据写入到硬盘文件中
构造方法:
public FileOutputStream(File file)throws FileNotFoundException创建文件输出流以写入由指定的File对象表示的文件
public FileOutputStream(String name)throws FileNotFoundException创建文件输出流以指定的名称写入文件。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文 件,会清空这个文件的数据。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
java.io.OutputStream
此类是一个抽象类,表示输出字节流的所有类的超类
定义一些子类共性的成员方法:
public void close()throws IOException关闭此输出流并释放与此流相关联的任何系统资源
public void flush()throws IOException刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b)throws IOException将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len)throws IOException从指定的字节数组写入len字节,从偏移off开始输出到此输出流。
public abstract void write(int b)throws IOException将指定的字节写入此输出流。
写入数据的原理:
java程序——>JVM(Java虚拟机)——>OS(操作系统)——>OS调用写入数据的方法——>把数据写入到文件中
字节输出流的使用步骤:
1.调用构造方法,创建字节输出流对象
2.调用write方法,把数据写入到文件中
3.释放资源(流在使用的时候会占用内存,使用完毕要清空内存,可以提高程序的效率)
4.处理异常
注意:
flush()在字节输出流中可以不使用,可以不刷新
*/
public class OutputStreamTest01 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write(97);
fos.close();
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
public void write(byte[] b)throws IOException将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b,int off,int len)throws IOException从指定的字节数组写入len字节,从偏移off开始输出到此输出流。
*/
public class OutputStreamTest02 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("b.txt");
/**
* public void write(byte[] b)throws IOException
* 将b.length字节从指定的字节数组写入此输出流。
* 如果写的正数(0~127),就会查询ASCII码表,显示对应的字母
* 如果写的负数,那么第一个和第二个字节会组成一个中文,就会查询系统默认编码表(GBK)
*/
byte[] bytes = {
65,66,67,68,69};
//byte[] bytes = {-65,-66,-67,-68,-69};
//fos.write(bytes);
/**
* public void write(byte[] b,int off,int len)throws IOException
* 从指定的字节数组写入len字节,从偏移off开始输出到此输出流。
*/
fos.write(bytes,1,2);
fos.close();
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
public FileOutputStream(String name,boolean append)throws FileNotFoundException创建文件输出流以指定的名称写入文件。
public FileOutputStream(File file,boolean append)throws FileNotFoundException
append参数值:
true:创建对象不会覆盖源文件,继续在文件末尾追加写入数据
false:创建一个新文件,覆盖源文件
换行:写换行符号
windows:\r\n
Linux: /n
mac: /r
*/
public class OutputStreamTest03 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("c.txt",false);
for (int i = 1; i <=10 ; i++) {
fos.write("你好".getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
}
}
2.4字节输入流【InputStream】
java.io.InputStream
此类是一个抽象类,表示输入字节流的所有类的超类
定义一些子类共性的成员方法:
public abstract int read()throws IOException从输入流读取数据的下一个字节。
public int read(byte[] b)throws IOException从输入流读取一些字节数,并将它们存储到缓冲区b 。
public int read(byte[] b,int off,int len)throws IOException从输入流读取len字节的数据到一个字节数组。
public int available()throws IOException返回从该输入流中可以读取(或跳过)的字节数的估计值
public long skip(long n)throws IOException跳过并丢弃来自此输入流的n字节数据。
2.5 FileInputStream类
public class FileInputStream extends InputStream
作用:把写入到硬盘文件中的数据读出来到内存中
读取字节数据
1.读取字节:reaad()方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1,代码演示:
//字节输入流一次读取一个字节的方法:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class InputStreamTest01 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("b.txt");
/*int len = fis.read();
System.out.println(len);//65
len = fis.read();
System.out.println(len);//66
len = fis.read();
System.out.println(len);//67
len = fis.read();
System.out.println(len);//68
len = fis.read();
System.out.println(len);//69