File类

File构造方法:

  • File(pathname );
  • File(parent child);
  • File file = new File(pathname);
  • File file = new File(file);

File文件创建方法

  • public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径命名的新文件
  • public boolean mkdir():创建由此抽象路径名命名的目录
  • public boolean midirs():帮你创建父目录
  1. //三种构造方法
  2. File f1 = new File("Controller1.txt");
  3. File f2 = new File("F:\\testFile","Controller2.txt");
  4. File f3 = new File("F:\\testFile");
  5. File f4 = new File(f3,"Controller3.txt");

定位一个目录获取这个目录下所有的子文件

  1. File f1 = new File("F:/testFile");
  2. String[] names = f1.list();
  3. for(String name:names){
  4. System.out.println(name);
  5. }
  1. 字符串常见的字符底层组成是什么样
    • 英文和数字等在任何国家的字符集中都占1个字节
    • GBK字符中一个中文字符占2个字节
    • UTF-8编码中一个中文一般占3个字节
  2. 编码前的字符集和编码后的字符集有什么要求
    • 必须一致,否则出现中文字符乱码
    • 英文和数字在任何国家的编码中都不会乱码因为他们只有一个字节

字节

97代表的是一个字节

中文UTF-8中 “我” 字三个字节为-26,-120-,111这才叫三个字节

  1. //编码
  2. String str = "abc我爱你中国";
  3. //编码 返回的就是byte[]数组
  4. byte[] bytes = str.getBytes();
  5. //解码
  6. String sr = new String(bytes);
  7. System.out.println(sr);

总结:

字节流在输出控制台的时候会乱码但是写到文件中并不会乱码

文件字节输入流,每次读取一个字节数组的api是哪个?

  • read(byte[] buffer);

解决乱码问题

  1. package com.hhm.b_stream_byte;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.InputStream;
  5. /*
  6. * 使用文件字节输入流一次读完文件的全部字节 可以解决乱码问题
  7. * */
  8. public class FileInputStreamDemo03 {
  9. public static void main(String[] args) throws Exception {
  10. //1、创建一个文件字节输入流管道
  11. File file = new File("data.txt");
  12. InputStream in = new FileInputStream(file);
  13. //一次读完一个文件的 一次获取一个文件的长度
  14. byte[] bytes = new byte[(int) file.length()];
  15. int len = in.read(bytes);
  16. System.out.println("这一次直接获取了多少个字节:="+len);
  17. System.out.println(new String(bytes));
  18. }
  19. }
  20. 第二种API
  21. readAllBytes();

OutputStream:

  • 如果想写中文进去的话必须要把中文编码在写入否则就是乱码使用
    • byte[] b = “我爱中国”.getByte();
      • os.write(b);

字节流可以任何文件的拷贝,唯独不适合做中文的输出

finally

  1. 无论代码出现什么异常都会执行这里
  2. 除了虚拟机挂掉 无论什么情况包括return 都会执行finally代码块
  3. 关闭之前必须做非空校验
  4. 哪怕上面有return语句执行,也必须执行finally 如果finally加了return 这个程序永远返回的都是finally的数据
  1. //代码
  2. package com.hhm.b_stream_byte;
  3. import java.io.*;
  4. public class FileCopyFinally {
  5. public static void main(String[] args) {
  6. InputStream in = null;
  7. OutputStream os = null;
  8. //创建读取流
  9. try {
  10. in = new FileInputStream("F:\\MySQL安装包.zip");
  11. //创建写入流
  12. os = new FileOutputStream("F:\\testFile\\copy.zip");
  13. long l = System.currentTimeMillis();
  14. //使用一个数组来转移数组
  15. byte[] b = new byte[1024];
  16. int len ;
  17. //有数组的时候 len代表的是长度 没有的时候代表的是一个字节
  18. while ((len = in.read(b)) != -1) {
  19. os.write(b,0,len);
  20. }
  21. long l1 = System.currentTimeMillis();
  22. System.out.println("文件拷贝"+(l1 - l)/1000+"秒完成");
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }finally {
  26. //无论代码出现什么异常都会执行这里
  27. //除了虚拟机挂掉 无论什么情况包括return 都会执行finally代码块
  28. //关闭之前必须做非空校验
  29. //哪怕上面有return语句执行,也必须执行finally 如果finally加了return 这个程序永远返回的都是finally的数据
  30. try {
  31. if(os != null)os.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. try {
  36. if(in!=null)in.close();
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. }
  43. //代码简化try(里面写资源对象) JDK7的方案
  44. //创建读取流
  45. try (
  46. /*这里面只能放资源对象,用完会自动关闭:自动调用close方法关闭资源(即使出现了异常也会关闭资源)*/
  47. InputStream in = new FileInputStream("F:\\MySQL安装包.zip");
  48. OutputStream os = new FileOutputStream("F:\\testFile\\copy.zip");
  49. ) {
  50. long l = System.currentTimeMillis();
  51. //使用一个数组来转移数组
  52. byte[] b = new byte[1024];
  53. int len;
  54. //有数组的时候 len代表的是长度 没有的时候代表的是一个字节
  55. while ((len = in.read(b)) != -1) {
  56. os.write(b, 0, len);
  57. }
  58. long l1 = System.currentTimeMillis();
  59. System.out.println("文件拷贝" + (l1 - l) / 1000 + "秒完成");
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. //代码简化JDK9方案
  65. //定义一个输入流对象
  66. //定义一个输出流对象
  67. try(输入流对象;输出流对象){
  68. 可能出现异常的代码
  69. }catch(异常类名 变量名){
  70. 异常的处理代码
  71. }
  72. //资源用完最终自动释放

资源对象就是实现了 Closeable接口的都是资源

FileReader

FileReader rd = new FileReader(“xxx.txt”);

每次读取一个字符

rd.read();

  • 字符流的好处
    • 读取中文符不会出现乱码(前提编码一致)
  • 一次读取一个字符数组
    • char[] c = new char[1024];
    • re.read(c);