1.字节流字符流
针对文本文件,提供了一组类,称为“字符流”(典型代表 Reader ,Writer)
针对二进制文件,提供一组类,称为“字节流”(典藏代表 InputStream,OutputStream)
字符流=》读写的基本单位是字符
字节流=》读写的基本单位是字节
流:Stream,是一个类别,对于字节流而言,如果想从文件中读取100个字节,那我们可以一次直接读取100个或一个读取50个,分2次读取或一个读取20个,分5次读取有很多方法。
每一种流对象,又分为两种(咋们讨论的输入输出,都是以cpu为基准的)
输入:Reader ,InputStream
输出:Writer,OutputStream
2.Reader和InputStream
查看InputStream源代码可以知道,这是一个抽象类,要是用的话需要一个实现类,我们最常用到的输入输出都是在文件上进行操作的,因此我们常用FileInputStream
因此我们在使用的时候,我们需要先找一个实现类
InputStream inputStream=new FileInputStream("d:/test.txt");
//大家注意,我们是new FileInputStream()
//里面指定一个文件路径,inputStream要打开这个文件的意思
//让当前的变量和这个文件关联起来
作为文件而言,我们有打开那么就一定会有关闭
inputStream.close();这个文件关闭十分重要,千万不要忘记
文件这里的资源吗,主要是以“文件描述符”,进程是使用PCB这样的结构来表示的(1.pid 2.内存指针,3.文件描述符),文件描述符就记载了进程打开了那些资源,没打开一个资源,就会在表中申请一个位置,,但是这个表是有程度限制的,一旦满了继续打开就会失败,导致咋们的代码/进程出现问题,这个问题是十分严重的。
所以大家一定要记得关闭文件。
那我们每一次都要手动关闭文件吗?其实不用,我们知道InputStream实现了一个特定的接口,那我们使用try语句来关闭
try(InputStream inputStream=new FileInputStream("d:/test.txt"))
{
//这样我们就不用手动关闭了,代码在出try语句的时候,会自动关闭文件
//执行语句
}
我们的读入有三个类型
read()无参数的read,相当于每一次读取一个字节
read(byte[] buffer)将读到的内容放到参数buffer数组中,此时的返回值是读到的字节数
read(byte[] buffer,int offset,int length)将读到的内容放到参数buffer数组中,但不是从头放,是从offest位置开始放,最多放length这么多内容,此时的返回值是实际读到的字节数
byte的范围是-128=》+127,或者是0-255,当文件读取完毕的时候,再次read就会返回-1,
大家看下面这个代码
当我们的文件写入abc,然后读取的会出现61,62,63,也就是abc的ASCII
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Deno5 {
public static void main(String[] args) throws IOException {
try(InputStream inputStream=new FileInputStream("d:/test.txt"))
{
while(true)
{
int b=inputStream.read();
if(b==-1)
{
break;
}
System.out.printf("%x\n",b);
}
inputStream.read();
}
}
}
对于字符流来说Reader(输出),也是一样的
Reader Filereader
Writer FileWriter
构造方法打开文件
read方法来读(依次读一个char或者char[ ])
writer方法来写(一次写一个char或者char[]或者String)
close关闭
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo7 {
public static void main(String[] args) {
try (Reader reader = new FileReader("d:/test.txt")){
while(true)
{
int c=reader.read();
if(c==-1)
{
break;
}
char ch=(char)c;
System.out.println(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.writer和OutputStream
其实OutputStream和InputStream的功能差不多,并且大部分是一样的,不过一个是输入一个是输出。
查看OutputStream源代码可以知道,这是一个抽象类,要是用的话需要一个实现类,我们最常用到的输入输出都是在文件上进行操作的,因此我们常用FileIOutputStream。
同样OutputStream,也需要关闭文件,同样我们使用try语句来自动关闭文件。
try (OutputStream outputStream=new FileOutputStream("d:/test.txt"))
并且outputStream.writer也有三种形式
void write(int b) 写入要给字节的数据
void write(byte[] b) 将 b 这个字符数组中的数据全部写入 os 中
int write(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个。
这个代码就是把ASCII为99,100,98的字节写到文件中
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo6 {
public static void main(String[] args) throws FileNotFoundException {
try (OutputStream outputStream=new FileOutputStream("d:/test.txt"))
{
outputStream.write(99);
outputStream.write(100);
outputStream.write(98);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.基本步骤
1.创建对象(打开文件),指定文件路径 =》绝对路径:从盘符开始
相对路径:以 .或 … 开头,必须要有一个基准目录/工作目录
2.读/写文件 read/writer,读完会以-1结束
3.关闭文件close()