File类
- File类的一个对象代表一个文件或一个文件目录
2. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
3. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”位置”
简单文件操作
- 文件的特性是:不存在文件则创建,存在则覆盖。
如果需要续写操作,可以在第二个参数里面传入true
IO流
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中
流的分类
- 操作数据单位:字节流(8bits)、字符流(16bits)
- 字节流指传送的数据,其分解为字节进行转发传送,当字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字(所以如果要操作文字数据,优先考虑字符流)
字符流 = 字节流+编码表
2.数据的流向:输入流、输出流输入输出流指硬盘与内存之间的写入与读取操作
3.流的角色:节点流、处理流
- 节点流:可以直接从数据源或目的地读写数据的流
- 处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装的流。目的主要是简化操作和提高性能。
IO流常用基类
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
- Inputstream的子类 Filelnputstrean.
- Reader的子类 FileReader
字节流、字符流的输入输出
实现步骤:
①创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
②创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③具体的读入过程:创建相应的byte[ ] (字节流)或 char[ ](字符流)
具体的写出过程:write(char[ ] / byte[ ] buffer, 0, len)
④关闭流资源
代码实现:
@Test
public void test01() throws IOException {
// 1.File 类的实例化
File file = new File("E:\\CodeBase\\代码demo篇\\javaSE\\src\\宋红康_Java复习\\IOStrean\\hello.txt");
// 2.FileReader流的实例化
FileReader fileReader = new FileReader(file);
// 3.读入的操作
char[] cbuff = new char[1024];
int len = 0;
// read方法每读取几个字符,就会将个数返回,当达到文件末尾时,就会返回-1
while((len = fileReader.read(cbuff)) != -1){
for (int i = 0; i < len; i++) {
System.out.print(cbuff[i]);
}
}
// 4.资源的关闭
fileReader.close();
}
利用IO流复制:
- 使用数组进行读取操作,可以提高读取速率,比起一个字符一个字符的读快上不少
缓冲流的读写
作用:提高流的读取、写入的速度
提高读写速度的原因:内部提供了一个缓冲区。默认情况下是8kb(减少了写入操作的次数)
读取非文本文件时:
@Test
public void test02(String srcPath,String destPath) throws IOException{
//实现文件复制的方法
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.造文件
File srcFile = new File(srcPath);
File destFile = new File(destPath);
//2.造流
//2.1 造节点流
FileInputStream fis = new FileInputStream((srcFile));
FileOutputStream fos = new FileOutputStream(destFile);
//2.2 造缓冲流(包装)
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//3.复制的细节:读取、写入(跟字符流类似)
byte[] buffer = new byte[1024];
int len;
while((len = bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.资源关闭
//要求:先关闭外层的流,再关闭内层的流
if(bos != null){
bos.close();
}
if(bis != null){
bis.close();
}
}
}
- 关闭外层流的同时,内层流也会自动的进行关闭。 因此关于内层流的关闭,我们可以省略
读取文本文件时(可以采用一次读一行的操作):