File-IO流复习

File

File类型的构造方法

 

File(File parent, String child) 

从父抽象路径名和子路径名字符串创建新的 File实例。

File(String pathname) 

通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

File(String parent, String child) 

从父路径名字符串和子路径名字符串创建新的 File实例。

 

File类型的创建方式

 

boolean

createNewFile()

当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。

boolean

mkdir()

创建由此抽象路径名命名的目录。

boolean

mkdirs()

创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。

 

练习:在D盘中a/b/c创建一个文件,名称叫HelloWorld.java

import java.io.File;

import java.io.IOException;

 

/*8.练习:在D盘中a/b/c创建一个文件,名称叫HelloWorld.java*/

//注:没D盘,用F盘代替了

public class Test01IO {

 

public static void main(String[] args) throws Exception {

File dir = new File("F:/a/b/c");

dir.mkdirs();

File file = new File(dir,"HelloWorld.java");

file.createNewFile();

}

 

}

File类型的删除方法

 

boolean

delete()

删除由此抽象路径名表示的文件或目录。

注意事项:

在删除文件夹的时候,只能删除的空的文件夹。

delete方法不走回收站。

 

File类型的重命名功能

 

boolean

renameTo(File dest)

重命名由此抽象路径名表示的文件。

注意事项:

如果在同一个文件夹下,修改路径,就是重命名操作。

如果不在同一个文件夹下,修改路径,就是剪切操作。

(一开始File dest不能真实存在)

 

File类型中的判断功能

boolean

exists()

测试此抽象路径名表示的文件或目录是否存在。

boolean

isDirectory()

测试此抽象路径名表示的文件是否为目录。

boolean

isFile()

测试此抽象路径名表示的文件是否为普通文件。

 

File类型的获取方法

String

getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。

String

getPath()

将此抽象路径名转换为路径名字符串。

String

getName()

返回由此抽象路径名表示的文件或目录的名称。

long

length()

返回由此抽象路径名表示的文件的长度。

String[]

list()

返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。

File[]

listFiles()

返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。

 

练习一:

键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹提示重新录入,打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径。

isDirectory()  listFiles()  length()  getName().endWiths(mp4)  getAbsoultPath()

import java.io.File;

import java.util.Scanner;

 

/*13.键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹提示重新录入,

打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径。

isDirectory() listFiles() length() getName().endWiths(“mp4”) getAbsoultPath()*/

public class Test01File {

 

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

boolean flag;

do {

flag = false;

System.out.println("请录入一个字符串(文件夹路径):");

String path = sc.nextLine();

File file = new File(path);

if(file.isDirectory()) {//true当且仅当该抽象路径名表示的文件存在且为目录时; false否则

printAbsolutePath(file);

}else {

System.out.println("亲,您刚刚的录入有误,请重新录入哦!");

flag = true;

}

 

}while(flag);

 

 

}

//打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径

private static void printAbsolutePath(File file) {

File[] files = file.listFiles();

/*if(files.length == 0) {

System.out.println("这是一个空文件夹");

return;

}*/

for(File f : files) {//true当且仅当该抽象路径名表示的文件存在且为文件时; false否则

if(f.isFile()) {

//1kb = 1024字节      1mb = 1024kb

if(f.getName().endsWith(".mp4")&&f.length()>10*1024*1024) {

System.out.println(f.getAbsolutePath());

}

}else {

printAbsolutePath(f);

}

}

 

}

 

}

练习二:

键盘录入一个文件夹路径,打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)

import java.io.File;

import java.util.Scanner;

 

/*键盘录入一个文件夹路径,打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)*/

public class Test02File {

 

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

boolean flag;

do {

flag = false;

System.out.println("请录入一个字符串(文件夹路径):");

String path = sc.nextLine();

File file = new File(path);

if(file.isDirectory()) {//true当且仅当该抽象路径名表示的文件存在且为目录时; false否则

printAbsolutePath(file);

}else {

System.out.println("亲,您刚刚的录入有误,请重新录入哦!");

flag = true;

}

 

}while(flag);

 

 

}

 

private static void printAbsolutePath(File file) {

File[] files = file.listFiles();

/*if(files.length == 0) {

System.out.println("这是一个空文件夹");

return;

}*/

for(File f : files) {//true当且仅当该抽象路径名表示的文件存在且为文件时; false否则

if(f.isFile()) {

System.out.println(f.getAbsolutePath());

}else {

printAbsolutePath(f);

}

}

}

 

}

IO流(字符流、字节流)

输入输出流是站在内存的角度上看的!站在内存的角度看待方向,从其它设备进入到内存的,都是输入,从内存到其它设备,都是输出

体系结构

字节流:

字节输入流:InputStream

字节输出流:  OutputStream

字符流:

字符输入流:Reader

字符输出流:Writer

InputStream

字节输入流的顶层父类

常用的方法  输入流:读取

abstract int

read()

从输入流读取数据的下一个字节。 结束标志为-1

int

read(byte[] b)

从输入流读取一些字节数,并将它们存储到缓冲区 b 。 结束标志为-1

int

read(byte[] b, int off, int len)

从输入流读取最多 len字节的数据到一个字节数组。

 

Int len = read(byte[] buf);返回值为覆盖字节数组的长度。

File-IO流复习_第1张图片

 

使用InputStream的子类对象FileInputStream

FileInputStream的构造方法

FileInputStream(File file) 

通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

FileInputStream(String name) 

通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

OutputStream

字节输出流的顶层抽象父类。

常用方法

void

write(byte[] b)

将 b.length字节从指定的字节数组写入此输出流。

void

write(byte[] b, int off, int len)

从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。

abstract void

write(int b)

将指定的字节写入此输出流。

void

close()

关闭此文件输出流并释放与此流相关联的任何系统资源。

 

FileOutputStream

FileOutputStream(File file)

创建文件输出流以写入由指定的 File对象表示的文件。

FileOutputStream(File file, boolean append)

创建文件输出流以写入由指定的 File对象表示的文件。

FileOutputStream(String name)

创建文件输出流以指定的名称写入文件。

FileOutputStream(String name, boolean append)

创建文件输出流以指定的名称写入文件。

InputStream类型的read()方法和read(byte[] buf)方法的比较

读取字节个数的区别

 read()方法一次只读取一个字节

 read(buf)方法一次可以读取多个字节,取决于数组的大小

返回值不同

 read()读取到的是文件字节信息是作为返回值进行返回的。

 read(buf):读取到的字节存储到数组中,返回的是覆盖数组的长度。

 

高效缓冲流

BufferedInputStream和BufferedOutputStream

构造方法

BufferedInputStream(InputStream in) 

创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。

BufferedOutputStream(OutputStream out) 

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

 

BufferedInputStream高效的原理:在该类型中准备一个数组,存储字节信息,当外界调用read()方法想获取一个字节的时候,该对象从文件中一次性读取一8192个字节到数组中,只返回一个字节,再次调用读取方法read(),只需要从自带的数组中去获取数据即可,不再需要重新访问文件。

 

BufferedOutpStream高效的原理:在该类中准备一个数组,存储字节信息,当外界调用write()方法想写出一个字节的时候,该对象直接将这个字节存储到自已的数组中,而不刷新到新文件中,一直到该数组所有8192个位置全都占满,该对象才把这个数组中所有的数据一次性写到目标文件中。

通用流的书写格式

 创建一个流和文件进行关联,提高效率加byte[],

 加上高效缓冲流,自带缓存。

输出流中的close和flush的区别

close方法在调用的时候默认先会调用flush

close方法把流对象关闭掉了

flush只是把缓冲区的数据刷新到文件中

字符流

  字符输入流:Reader

字符输出流:Writer

字节流虽然也可以操作字符,但是在操作中英文混合的时候,判断起来较麻烦,需要判断中英文的标识,如果是英文的标识,直接读取一个字节,如果是中文的标识,需要再次读取一个字节拼接成两个字节,一块读取,这种操作判断起来非常 麻烦,恰巧字符流帮咱们封装这种判断标识的操作,所以直接可以使用字符流来操作中英文混合的字符。

 

Reader:

int

read() 

读一个字符  结束标志-1

int

read(char[] cbuf) 

将字符读入数组。 结束标志-1

Writer:

void

write(char[] cbuf) 

写入一个字符数组。

abstract void

write(char[] cbuf, int off, int len) 

写入字符数组的一部分。

void

write(int c) 

写一个字符

void

write(String str) 

写一个字符串

void

write(String str, int off, int len) 

写一个字符串的一部分。

abstract void

close() 

关闭流,先刷新。

abstract void

flush() 

刷新流。

 

 

练习:

字符流的复制粘贴操作

//字符流的复制粘贴操作

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

//复制粘贴docx文档还是会出现乱码,但是txt文档就没问题

 

public class Test02IO {

 

public static void main(String[] args) throws Exception {

//BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\课程资料\\正在学习\\大数据1028班\\Homework2019\\Homework20191104.docx"));

//BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/Homework20191104.docx"));

 

BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\课程资料\\正在学习\\大数据1028班\\Homework2019\\a.txt"));

BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/a.txt"));

String str = "";

while((str=br.readLine())!=null) {

bw.write(str);

bw.newLine();

bw.flush();

}

br.close();

bw.close();

}

 

}

 

你可能感兴趣的:(第一阶段,File,IO流)