File
File概述和构造方法
File是文件和目录路径名的抽象表示。
- 文件和目录可以通过FIle封装为对象的
- 对File,其封装的并不是一个真正的文件,仅仅是一个路径名,可以存在也可以不存在,将来是要通过具体的操作把这个路径的内容转换为具体存在的。
File f = new File("/home/cenjw/java.txt");
File类创建功能
// 创建文件
File f = new File("./javaTest.txt");
f.createNewFile();
// 创建目录
File f2 = new File("/home/cenjw/javase");
f2.mkdir();
// 创建多级目录
File f3 = new File("/home/cenjw/javaee/html/imgs");
f3.mkdirs();
File类判断与获取功能
字节流
IO流概述
- IO:输入/输出
- 流:抽象概念,对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
- 常见的应用:文件复制、文件上传、文件下载
IO流分类
- 按数据的流向
- 输入流:读数据
- 输出流:写数据
- 按数据类型
- 字节流:字节输入流;字节输出流
- 字符流:字符输入流;字符输出流
tips
一般来说,IO流是按照数据类型分的
两种流都在什么情况下使用?
- 如果数据通过记事本打开,我们还能读懂内容,就使用字符流;否则使用字节流。不知道流类型,则使用字节流
字节流写数据
InputStream
:表示字节输入流的所有类的超类OutputStream
:表示字节输出流的所有类的超类- 子类特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream(String name)
:创建文件输出流以指定的名称写入文件
字节输出流写数据的步骤: - 创建字节输出流对象(1.调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此相关的任何系统资源)
字节流写数据的3中方式
字节流写数据如何换行?
- 写完数据后加换行符
- windows: \r\n
- linux: \n
- mac: \r
字节流写数据如何实现追加写入呢?
FileOutputStream file = new FileOutputStream(pathname, true);
字节流读数据
一次读一个字节
FileInputStream(String name)
使用字节输入流读数据的步骤
- ① 创建字节输入流对象
- ② 调用字节输入流对象的读数据方法
- ③ 释放资源
FileInputStream file = new FileInputStream("D:\\myMajor\\j2se\\fos.txt");
int by;
while ((by = file.read()) != -1)
{
System.out.print((char) by);
}
file.close();
一次读一个字节数组
FileInputStream stream = new FileInputStream("D:\\myMajor\\j2se\\fos.txt");
byte[] bys = new byte[1024]; // 1024及其整数倍
int len;
while ((len = stream.read(bys)) != -1) {
String str = new String(bys, 0, len);
System.out.println(str);
}
stream.close();
字节缓冲流
字节缓冲流:
- BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
- BufferedlnputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
- 构造方法:
字节缓冲输出流:BufferedOutputStream(OutputStream out)字节缓冲输入流: BufferedInputStream(InputStream in)
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
- 字节缓冲仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象操作
// 写
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("xxx.txt"));
out.write("hello world".getBytes());
// 读
BufferedInputStream in = new BufferedInputStream(new FileInputStream("xxx.xxx"));
// 1
int b;
while ((b=in.read())!=-1) {
print((char) b);
}
//2
byte[] bys = new byte[1024];
int len;
while((len=in.read(bys))!=-1) {
String str = new String(bys, 0, len);
print(str);
}
字符流
为什么会出现字符流?
答:由于字节流操作中文不方便,所以Java提供字符流
字符流=字节流+编码表
用字节流复制文本文件时也有中文,但没问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文?
汉字在存储时,无论选择何种编码存储,第一个字节都是负数
字符串中编/解码问题
编码
byte[] getBytes()
: 默认字符集byte[] getBytes(String charsetName)
:使用指定字符集
解码String(byte[] bytes)
:默认字符集解码String(byte[] bytes, String charsetName)
:指定字符集解码
字符流中的编码解码问题
字符流抽象基类
- Reader:字符输入流的抽象类
- Writer:字符输出流的抽象类
字符流中和编码解码问题相关的两个类 - InputStreamReader
InputStreamReader in = new InputStreamReader(new FIleInputStream(filename));
- OutputStreamWriter
- OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(filename));
字符缓冲流
BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"));
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
字符缓冲流特有功能
字符缓冲流特有功能
BufferedWriter:
- void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader: - public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
小结
字节流
字符流