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():帮你创建父目录
//三种构造方法File f1 = new File("Controller1.txt");File f2 = new File("F:\\testFile","Controller2.txt");File f3 = new File("F:\\testFile");File f4 = new File(f3,"Controller3.txt");
定位一个目录获取这个目录下所有的子文件
File f1 = new File("F:/testFile");String[] names = f1.list();for(String name:names){System.out.println(name);}
- 字符串常见的字符底层组成是什么样
- 英文和数字等在任何国家的字符集中都占1个字节
- GBK字符中一个中文字符占2个字节
- UTF-8编码中一个中文一般占3个字节
- 编码前的字符集和编码后的字符集有什么要求
- 必须一致,否则出现中文字符乱码
- 英文和数字在任何国家的编码中都不会乱码因为他们只有一个字节
字节
97代表的是一个字节
中文UTF-8中 “我” 字三个字节为-26,-120-,111这才叫三个字节
//编码String str = "abc我爱你中国";//编码 返回的就是byte[]数组byte[] bytes = str.getBytes();//解码String sr = new String(bytes);System.out.println(sr);
总结:
字节流在输出控制台的时候会乱码但是写到文件中并不会乱码
文件字节输入流,每次读取一个字节数组的api是哪个?
- read(byte[] buffer);
解决乱码问题
package com.hhm.b_stream_byte;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;/** 使用文件字节输入流一次读完文件的全部字节 可以解决乱码问题* */public class FileInputStreamDemo03 {public static void main(String[] args) throws Exception {//1、创建一个文件字节输入流管道File file = new File("data.txt");InputStream in = new FileInputStream(file);//一次读完一个文件的 一次获取一个文件的长度byte[] bytes = new byte[(int) file.length()];int len = in.read(bytes);System.out.println("这一次直接获取了多少个字节:="+len);System.out.println(new String(bytes));}}第二种APIreadAllBytes();
OutputStream:
- 如果想写中文进去的话必须要把中文编码在写入否则就是乱码使用
- byte[] b = “我爱中国”.getByte();
- os.write(b);
- byte[] b = “我爱中国”.getByte();
字节流可以任何文件的拷贝,唯独不适合做中文的输出
finally
- 无论代码出现什么异常都会执行这里
- 除了虚拟机挂掉 无论什么情况包括return 都会执行finally代码块
- 关闭之前必须做非空校验
- 哪怕上面有return语句执行,也必须执行finally 如果finally加了return 这个程序永远返回的都是finally的数据
//代码package com.hhm.b_stream_byte;import java.io.*;public class FileCopyFinally {public static void main(String[] args) {InputStream in = null;OutputStream os = null;//创建读取流try {in = new FileInputStream("F:\\MySQL安装包.zip");//创建写入流os = new FileOutputStream("F:\\testFile\\copy.zip");long l = System.currentTimeMillis();//使用一个数组来转移数组byte[] b = new byte[1024];int len ;//有数组的时候 len代表的是长度 没有的时候代表的是一个字节while ((len = in.read(b)) != -1) {os.write(b,0,len);}long l1 = System.currentTimeMillis();System.out.println("文件拷贝"+(l1 - l)/1000+"秒完成");} catch (Exception e) {e.printStackTrace();}finally {//无论代码出现什么异常都会执行这里//除了虚拟机挂掉 无论什么情况包括return 都会执行finally代码块//关闭之前必须做非空校验//哪怕上面有return语句执行,也必须执行finally 如果finally加了return 这个程序永远返回的都是finally的数据try {if(os != null)os.close();} catch (IOException e) {e.printStackTrace();}try {if(in!=null)in.close();} catch (IOException e) {e.printStackTrace();}}}}//代码简化try(里面写资源对象) JDK7的方案//创建读取流try (/*这里面只能放资源对象,用完会自动关闭:自动调用close方法关闭资源(即使出现了异常也会关闭资源)*/InputStream in = new FileInputStream("F:\\MySQL安装包.zip");OutputStream os = new FileOutputStream("F:\\testFile\\copy.zip");) {long l = System.currentTimeMillis();//使用一个数组来转移数组byte[] b = new byte[1024];int len;//有数组的时候 len代表的是长度 没有的时候代表的是一个字节while ((len = in.read(b)) != -1) {os.write(b, 0, len);}long l1 = System.currentTimeMillis();System.out.println("文件拷贝" + (l1 - l) / 1000 + "秒完成");} catch (Exception e) {e.printStackTrace();}}//代码简化JDK9方案//定义一个输入流对象//定义一个输出流对象try(输入流对象;输出流对象){可能出现异常的代码}catch(异常类名 变量名){异常的处理代码}//资源用完最终自动释放
资源对象就是实现了 Closeable接口的都是资源
FileReader
FileReader rd = new FileReader(“xxx.txt”);
每次读取一个字符
rd.read();
- 字符流的好处
- 读取中文符不会出现乱码(前提编码一致)
- 一次读取一个字符数组
- char[] c = new char[1024];
- re.read(c);
