1 IO流的体系分类
2.常用的流Java流列表
例题: 1. 字节输出流 FileOutputStream :
写文件的步奏; 1. 创建绑定文件, 2. 创建输出流 3. 写文件 . 4. 关闭流资源
public static void main(String[] args) { //fun1往文档里面写东西(); //创建地址 File file = new File("/Users/lanou/Desktop/zhang/hai.txt"); // 创建一个空的引用,扩大作用域 FileOutputStream fos = null; // 绑定要写的位置 try { fos = new FileOutputStream(file); fos.write("haha".getBytes());// 此处报异常,写入失败; } catch (FileNotFoundException e) { // 文件找不到,停止程序让程序员修改代码 // 抛个运行时候异常,提示信息,和停止程序; throw new RuntimeException("文件找不到"); // e.printStackTrace();//打印位置错误信息默认的 } catch (IOException e) { // 写入失败; throw new RuntimeException("写入失败"); } finally { if (fos != null) { // 关闭资源时,一定要确保可以关闭的代码可以执行; try { fos.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); } } } }
2: 字节输入流FileInputStream, 直接读取
读文件的步奏; 1. 创建绑定文件, 2. 创建输出流 3. 读文件 . 4. 关闭流资源
public static void main(String[] args) throws IOException { // fun2循环读取(); File file = new File("/Users/lanou/Desktop/zhang/hai.txt"); FileInputStream fis = new FileInputStream(file); // 一次多读几个字节; // 创建一个空的字节数组长度是2; // 利用空的字节数组作为缓冲区;将文件字节读进这个数组中; // 一次读两个提高效率;一次读1024个; // fun3数组读取(fis); int num = 0; byte[] b = new byte[1024]; while ((num = fis.read(b)) != -1) { // 直接使用String的构造方法,将字符数组转化成字符串; System.out.println(new String(b, 0, num)); } // 关闭一下 fis.close(); }
例题3: 使用字节流,进行文件的赋值( 需要进行异常处理 ), 使用到 字节输出和字节输入流;
public static void main(String[] args) { // 使用字节流 进行文件的复制(需要异常处理 并计算两种读写方式的时间) // 对文件进行续写; // 计算赋值时间 long start = System.currentTimeMillis(); FileInputStream in = null; FileOutputStream ou = null; try { in = new FileInputStream("/Users/lanou/Desktop/zzz/index.jpg"); ou = new FileOutputStream("a.txt"); byte[] bs = new byte[1024]; int len = 0; while ((len = in.read()) != -1) { ou.write(bs, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 进行流的关闭; if (in != null) { try { in.close(); } catch (IOException e) { throw new RuntimeException(); } finally { try { ou.close(); } catch (IOException e) { throw new RuntimeException(); } } } } long stop = System.currentTimeMillis(); System.out.println(stop - start); }
例题 4:将一个文件夹复制到另外一个文件夹里面
public static void fun(File src, File dest) throws IOException { // 去目标文件夹创建一个文件夹出来;新文件夹名字是原文件的名字, // 路径是目标文件的名字; File newFile = new File(dest, src.getName()); newFile.mkdir(); // 遍历所有集合 File[] files = src.listFiles(); for (File subfile : files) { if (subfile.isDirectory()) { fun(subfile, newFile); } else { // 读写 FileInputStream in = new FileInputStream(subfile); //创建一个要写入的文件(需要获取文件名字) File temp = new File(newFile, subfile.getName()); FileOutputStream ou = new FileOutputStream(temp); byte[] bs = new byte[1024]; int len = 0; while ((len = in.read()) != -1) { ou.write(bs, 0, len); } in.close(); ou.close(); } } // 进行流的关闭; }例题5: 复制一个文件夹里面所有txt结尾的文件; 这里要用到FileFilter;
首先: 给一个实现类的去FileFilter接口,并重写其中的方法;
class Txt implements FileFilter{ @Override public boolean accept(File pathname) { //放行文件夹 if (pathname.isDirectory()) { return true; } return pathname.getName().endsWith("txt"); } }
其次: 封装一个带有 原文件和新文件的目录;要点: 找准读写路径就好了;
public static void main(String[] args) throws IOException { File src = new File("/Users/lanou/Desktop/text"); File dest = new File("/Users/lanou/Desktop/zzz"); fun(src, dest); } public static void fun(File src, File dest) throws IOException { // 遍历原文件 File[] files = src.listFiles(new Txt());// 这里传进去过滤器 for (File subfile : files) { if (subfile.isFile()) { // 读写 FileInputStream fi = new FileInputStream(subfile); // 构建写的路径 wanglong.txt- String name = subfile.getName(); String[] split = name.split("\\."); // 构建写入文件 File file = new File(dest, split[0] + ".java"); FileOutputStream fo = new FileOutputStream(file); int len = 0; byte[] bs = new byte[1024]; while ((len = fi.read(bs)) != -1) { fo.write(bs, 0, len); } } else { fun(subfile, dest); } } }
例题 6: 读字符流
public static void main(String[] args) throws IOException { // 单个字符读; // 利用缓冲数组读 File file = new File("/Users/lanou/Desktop/text/zhang.txt"); FileReader f = new FileReader(file); int num = 0; /* * while ((num=f.read())!=-1) { System.out.println((char)num); } */ // 利用缓冲数组 char[] c = new char[1024]; while ((num = f.read(c)) != -1) { // 字符数组转字符串 System.out.println(new String(c, 0, num)); } }
例题7: 写字符流
public static void main(String[] args) throws IOException { // 创建一个文件字符输出流; File file = new File("/Users/lanou/Desktop/text/zhang.txt"); FileWriter f = new FileWriter(file); // 写 f.write(65); // 刷新方法;相当于内部有个缓冲区;缓冲区你写的字符进入缓冲区,刷新的时候逆袭 // 你写的文件才会被写入文件中;写一次刷新一次; f.flush(); //直接关闭流资源之前自动刷新缓冲去; //利用字符数组写入; //char [] c = {'w','e','r','t'}; //f.write(c); //利用字符串写入; f.write("zz君不见黄河之水天上来\n"); f.write("奔流到海不复回\n"); f.flush(); }
例题8: 利用字符流进行文件的复制 -----不同系统下有不同的编码格式;
注意不支持:图片,音频:
FileReader fr = null; FileWriter fw=null; //复制文件; try { fr = new FileReader("/Users/lanou/Desktop/text/zhang.txt"); fw = new FileWriter("/Users/lanou/Desktop/text/d.txt"); int len = 0; char[] c = new char[1024]; while ((len = fr.read(c)) != -1) { fw.write(c, 0, len); // 刷新一下; fw.flush(); } } catch (FileNotFoundException e) { throw new RuntimeException("文件找不到"); } catch (IOException e) { throw new RuntimeException("读写失败"); }finally { if (fr!=null) { try { fr.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); //利用了finally里面一定会被关闭; }finally { if (fw!=null) { try { fw.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); } } } } }
3 ----转换器----OutputStreamWriter---InputStreamReader--
1. 注意:了解转换器的构造方法;
*转换流构造方法: (不穿编码格式默认使用的系统编码格式) * 1. OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 2. OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 * * 1. 需要一个字节输出流 OutputStream 要使用它的子类 FileOutputStream * 2.编码格式的名字charsetName:(UTF-8 , GBK(不区分大小写));2 . InputStreamReader( 读取 )转换器与OutputStream构造方法类似;
public static void main(String[] args) throws IOException { //getUtf(); //getGbk(); read(); } public static void getUtf() throws IOException { //按操作系统默认格式(UTF-8)写一个文件; //创建一个字节输出流-------------字节输出流就是可以往文件里面写; FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/text/utf8.txt"); //创建一个转换流需要提供一个字节输出流 OutputStreamWriter osw =new OutputStreamWriter(fos); //写文件;字符流都有写字符串方法; osw.write("此情可待成追忆"); //注意:一般只关外层的流就可以;fos内层不需要关流了; osw.close(); } public static void getGbk() throws IOException { //按操作系统默认格式(GBK)写一个文件; FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/text/GBK.txt"); OutputStreamWriter os= new OutputStreamWriter(fos, "GBK"); os.write("只是当时已惘然"); os.close(); } //按操作系统默认格式(UTF-8)读一个文件; public static void read() throws IOException { FileInputStream fi = new FileInputStream("/Users/lanou/Desktop/text/GBK.txt"); InputStreamReader ino = new InputStreamReader(fi,"UTF-8"); int num = 0; char [] c = new char[1024]; while ((num = ino.read(c)) != -1) { System.out.println(new String(c, 0, num)); } ino.close(); }
4 . 转换流
* 转换流 * OutputStreamWriter--------看后缀是个字符流通向字节流的桥梁; * 第一步:程序中写入字符先使用转换流,根据转换流想查询的码表去查询, * 第二步: 如果查的是GBK,那么一个中文就查到了两个字节的字节编码; * 第三部:这个字节编码最终给到了构建转换时,传入的字节流 * 第四步: 通过字节流按字节写入到文件中; * 转换流可以按照你想要的查询对应的编码表; * * * OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。 * 它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 * 默认UTF-8写文件. 拿到window系统上去读取;windows会默认使用GBK格式来读取文件;乱码 * 转换流可以根据你想要的编码进行编写和读写;可以设置编码格式来进行读写; * * *转换流构造方法: (不穿编码格式默认使用的系统编码格式) * 1. OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 2. OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 * * 1. 需要一个字节输出流 OutputStream 要使用它的子类 FileOutputStream * 2.编码格式的名字charsetName:(UTF-8 , GBK(不区分大小写)); * * 2: InputStreamReader(读取) 字节流通向字符流; * 1.按字节读取文件,将字节编码给到转换流, * 2.如果是utf-8需要三个字节, * 3.使用字符流读取到程序中; */ public class Demo07转换流 { public static void main(String[] args) throws IOException { //getUtf(); //getGbk(); read(); } public static void getUtf() throws IOException { //按操作系统默认格式(UTF-8)写一个文件; //创建一个字节输出流-------------字节输出流就是可以往文件里面写; FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/text/utf8.txt"); //创建一个转换流需要提供一个字节输出流 OutputStreamWriter osw =new OutputStreamWriter(fos); //写文件;字符流都有写字符串方法; osw.write("此情可待成追忆"); //注意:一般只关外层的流就可以;fos内层不需要关流了; osw.close(); } public static void getGbk() throws IOException { //按操作系统默认格式(GBK)写一个文件; FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/text/GBK.txt"); OutputStreamWriter os= new OutputStreamWriter(fos, "GBK"); os.write("只是当时已惘然"); os.close(); } //按操作系统默认格式(UTF-8)读一个文件; public static void read() throws IOException { FileInputStream fi = new FileInputStream("/Users/lanou/Desktop/text/GBK.txt"); InputStreamReader ino = new InputStreamReader(fi,"UTF-8"); int num = 0; char [] c = new char[1024]; while ((num = ino.read(c)) != -1) { System.out.println(new String(c, 0, num)); } ino.close(); } }
5缓冲流
/*流:主要用来读写文本; * * 缓冲流: 内部自带缓冲区,(相当于一个字节数组), 这是字节吗; * BufferedOutputStream--------------缓冲输出字节流(写文件) * BufferedInputStream (读文件); * * * 1.字节输出流(复制一个文件(读写)) * 一个一个读; 缓冲数组来读 * * 2. 缓冲字节输入流; * 缓冲数组读; * */ public class Demo08缓冲流 { public static void main(String[] args) throws IOException { //fun1写(); FileInputStream f = new FileInputStream("/Users/lanou/Desktop/text/guifen.txt"); BufferedInputStream bf = new BufferedInputStream(f); int num = 0; byte [] b = new byte[1024]; while ((num=bf.read(b))!=-1) { System.out.println(new String(b, 0, num)); } } private static void fun1写() throws IOException { FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/text/guifen.txt"); // 构建一个缓冲流写文件 // 如何验证缓冲流的高效; BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("guifen".getBytes());//这里为什么写不进去; // 关闭资源; fos.close(); } }