IO
一、文件(File)
有一种概念叫万物皆文件,电脑中的文件夹是文件,我们平时访问的文本、图片等叫文件。我们写程序有时候需要对文件进行操作。比如我们要编程把一张图片复制出来。那么我们第一步要把这个文件从磁盘中拿到程序中来(这个过程我们把文件变成流,我们叫他输入流),接下来就要把程序中的输入流给放到指定的位置去,这又被叫做输出流了。
1、文件相关操作
(1)构造器
最常用的是File(String)
File(String,String):
第一个String可以放父路径,第二个String放子路径,在开发中常用到,可以用来访问同一个路径下的不同文件。
(2)路径
文件存放的地方被我们称为路径,路径分为绝对路径和相对路径。
这里就需要我们输入一个路径名。
(3)常用方法
二、流
文件在不同的对象(磁盘,内存)间流动,是通过流的形式。流是一组有序的数据序列,流把我们的文件从一个地方带到另一个地方。
1、流的分类1
我们通过流的方向,把流分为两类。
文件通过流从磁盘来到内存(我们的程序),这个流被称为输入流。而从内存来到磁盘,这个流被称为输出流。
输入流:InputStream, Reader
输出流:OutputStream,Writer
2、流的分类2
可以看到在输入流那里,我写了InputStream, Reader。他们都是输入流,不同的是前者是字节流,后者是字符流。
这里要先讲一个概念,位,字节和字符
(1)位,字节,和字符
什么是位,一位二进制数就是位(bit)。10110,第一个一是一个位,这串二进制总共5个位。一个字节有8个位。
但是我们不能确定的说一个字符有2个位或者3个位。
那么一个字符到底由多少个位组成的呢?
这取决于他采用什么编码方式。在使用utf8编码的时候,一个汉字字符占2-3个字节。使用gbk编码占两个字节。gbk编码是中国自制的编码。
上面提到的InputStream还有Reader等是抽象类,是不能创建实例的。
关于字节流和字符流的区别,字节流就是传输的时候一个个字节传输,而字符流是一个个字符进行传输。因此,易得,字符流传输速率肯定远远高于字节流。那为什么还需要字节流?
因为可能存在转码问题。像一些二进制文件(图片,音乐,视频)。如果使用字符流进行传输,可能传输后会发现文件损坏了。
3、节点流和处理流
这里科普一个概念,什么是节点流和处理流
节点流:可以从一个特定的数据源读写数据,如FileReader,FileWriter。功能可能不够强大
处理流:对节点流进行包装,实现更加强大的功能,更加灵活,BufferedReader、BufferedWriter。效率更高
三、常用的流
1、FileInputStream和FileOutputStream
这是专门用来操作文件的流。我们可以用这些来操作文件
(1)FileOutputStream
这是一个文件输出流,我们可以用他做一些操作,比如说往一个文件里写东西。
package liu.file;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteHello {
public static void main(String[] args) throws IOException {
String dest = "F://photos//hello.txt";
FileOutputStream fos = new FileOutputStream(dest);
String s = "hello,my first file";
fos.write(s.getBytes());
fos.close();
}
}
这是往F盘一个叫hello的txt文件里写入一句”hello,my first file“
如果我在F盘没有这个文件,运行后可以发现多出来一个目标文件,上面就写着”hello,my first file“。
如果我在F盘有这个文件,并且上面写了这句话,我把s改成
String s = "你好,我的第一个文件";
可以发现原来的那个hello被覆盖了。
我们可以发现目前这个流的作用是覆盖,那假设我们不想覆盖,而是想实现追加呢?
a、FileOutputStream的构造器
b、FileOutputStream的常用方法
这个方法可以以指定名字打开一个文件,并指定流的输出是以追加的模式
(2)FileInputStream
从一个文件中读取数据并输出到控制台
package liu.file;
import java.io.FileInputStream;
import java.io.IOException;
public class File2 {
public static void main(String[] args) throws IOException {
String path ="F://photos//hello.txt";
FileInputStream fis = new FileInputStream(path);
int len = 0;
byte[] readDate = new byte[8];
while (