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));
}
}
第二种API
readAllBytes();
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);