流的概念和作用:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
I: input
输入 外界(磁盘、网络、键盘…)---->程序
O: output
输出 程序---->外界(磁盘、网络、显示器…)
按流向分
按处理的单位分
字节流和字符流的区别
字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。) 字节流用来处理二进制文件(图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,使用了某种编码,人可以阅读)。 简而言之,字节是个计算机看的,字符才是给人看的。
字节转字符Input/OutputStreamReader/Writer
编码就是把字符转换为字节,而解码是把字节重新组合成字符。
如果编码和解码过程使用不同的编码方式那么就出现了乱码
GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;
UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;
UTF-16be 编码中,中文字符和英文字符都占 2 个字节
字节输入流 磁盘上的文件
public class FileInputStream extends InputStream
构造器
new FileInputStream(File file); new FileInputStream(String pathname);
读取方法
//读取一个字节(int表现形式) 读取到末尾再读返回-1 public int read() throws IOException { return read0(); }
//将读取的内容放在数组中,返回读取字节的个数,如果没有了返回-1。 //在第二次以后读取并不会将byte数组中的数据清空 public int read(byte b[]) throws IOException { return readBytes(b, 0, b.length); }
//设置读取的字节数是len个,设置在数组的那个位置开始存off索引位置 public int read(byte b[], int off, int len) throws IOException { return readBytes(b, off, len); }
IO流的操作步骤
a. 创建流对象 in=new FileInputStream(file);
b. 读写操作 in.read();
c. 关闭资源 in.close();
要保证文件前的路径是存在的,文件可以是不存在的,如果不存在创建流对象时会新建文件
构造器
new FileOutputStream(File file); //默认是将原内容覆盖掉 new FileOutputStream(File file,boolean append); //传true设置为追加内容 new FileOutputStream(String pathname); //默认是将原内容覆盖掉 new FileOutputStream(String pathname,boolean append); //传true设置为追加内容
方法
write(int byte); //写入一个字节 out.write(byte[] b); //将byte数组中的数据全部写入 out.write(byte[] b, int off, int len); //设置从数组的off索引位置开始写,写len个字节 out.flush(); //刷新 out.close(); //关闭资源
public class FileReader extends InputStreamReader { public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fileName)); } public FileReader(File file) throws FileNotFoundException { super(new FileInputStream(file)); } public FileReader(FileDescriptor fd) { super(new FileInputStream(fd)); } }
public class FileWriter extends OutputStreamWriter { public FileWriter(String fileName) throws IOException { super(new FileOutputStream(fileName)); } public FileWriter(String fileName, boolean append) throws IOException { super(new FileOutputStream(fileName, append)); } public FileWriter(File file) throws IOException { super(new FileOutputStream(file)); } public FileWriter(FileDescriptor fd) { super(new FileOutputStream(fd)); } }
概述:文件和目录路径名的抽象表示形式(对象),与平台(操作系统)无关
功能:File
能新建、删除、重命名文件和目录,但 File
不能访问文件内容本身
作用:File
对象可以作为参数传递给流的构造器
构造器
File(String pathname); //a. 绝对路径(从盘符开始) //F:\java.txt //b. 相对路径(从当前项目下开始寻找) //src\\java.txt
File(File parentFile,String child); 由父级的File对象和子级的路径构建一个file对象 File(String parentPath,String child); 由父级的路径和子级的路径构建一个file对象
方法
//文件检测 exists() //是否存在 canWrite() //是否可写 canRead() //是否可读 isFile() //判断是否是文件(如果文件不存在返回false) isDirectory() //判断是否是文件夹(如果文件夹不存在返回false) //目录操作 mkdir() //新建一级文件夹 mkdirs() //新建多级文件夹 delete() //只能删除空白文件夹 list() //获得文件夹内所有内容的名字 String[] listFiles() //获得文件夹内所有内容的File对象 File[] //文件操作相关 createNewFile() //新建文件(受检异常IOException) 有可能文件所在的路径是不存在的 delete() //删除文件 //访问文件名: getName() //获得文件或文件夹名字 getPath() //获得路径 getAbsoluteFile() // 获得由绝对路径获得的File类对象 getAbsolutePath() //获得file对象的绝对路径 getParent() //获得当前对象上一级File对象的路径(String) getParentFile() //获得当前对象上一级File对象(File) toPath() //获得路径 renameTo(File newName) //重命名 //获取常规文件信息 lastModified() //最后一次修改的时间 (毫秒数) length() //获得字节数
Java输入输出流