一、java.io 包,输入输出包。当我们需要做文件的处理,比如上传下载等,都需要使用到 java.io 包。
1、File 类:
(1)File 类的相关概念
①、File类是Java.io 包中很重要的一个类;
②、File类的对象可以表示文件,还可以表示目录,在程序中一个 File 类对象可以代表一个文件或目录;
③、File对象可以对文件或目录的属性进行操作,如文件名、最后修改日期,文件大小等;
④、File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作。
(2)File类的4种构造方法
①、File(String pathname) 指定文件(或目录)名和路径创建文件对象;
②、File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例;
③、File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例;
④、File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
例如:
//在当前目录下创建一个与aaa.txt文件名相关联的文件对象
File f1=new File("aaa.txt");
//指明详细的路径及文件名,请注意双斜线或者用单反斜杠
File f2=new File("D:\\java\\Hello.java");
//指明详细的路径及目录名,请注意双斜线
File f3=new File("D:\\java");
(3)File类的常用的方法
boolean exists() 判断文件是否存在,存在返回true,否则返回false;
boolean isFile() 判断是否为文件,是文件返回true,否则返回false;
boolean isDirectory() 判断是否为目录,是目录返回true,否则false;
String getName() 获得文件名;
String getAbsolutePath() 获得文件的绝对路径;
long length() 获得文件的长度(字节数);
boolean createNewFile() throws IOException 创建新文件,创建成功返回true,否则返回false,有可能抛 出IOException异常,必须捕捉;
boolean delete() 删除文件,删除成功返回true,否则返回false。
例如:
public static void main(String[] args) {
//创建File对象
File file = new File("notes.txt");
File dir = new File("E:\\project");
System.out.println("file是否是文件:" + file.isFile());
System.out.println("dir是否是目录:" + dir.isDirectory());
System.out.println("file是否可读:" + file.canRead());
System.out.println("file是否存在:" + file.exists());
}
File类的遍历
public String[] list() 将目录下的子目录以及文件的名字,返回到String数组中
public File[] listFile() 将目录下的子目录以及文件的实例返回到File数组中
例如:
public static void main(String[] args) {
File file=new File("D:\\test");
String[] fileNameList=file.list(); //使用list方法
for(String s:fileNameList){
System.out.println(s);
}
File[] fileList=file.listFiles(); //使用listFiles方法
for(File f:fileList){
System.out.println(f.getAbsolutePath());
}
}
(4)文件/文件名过滤器
①、文件名的过滤器接口:interface FilenameFilter 常常用来过滤不符合规格的文件名
②、需要重写 accept 方法自定义过滤器规则
方法:
boolean accept(File dir,String name)
dir:表示文件的当前目录
name:表示当前目录的子目录或者文件的名字
③、File类中提供了使用文件名过滤器遍历目录的方法
方法:
String[] list(FilenameFilter filter)
把满足指定过滤条件的文件和目录,返回到String数组中
File[] listFiles(FilenameFilter filter)
把满足制定过滤条件的文件和目录,返回到File的数组中
例如:
import java.io.*;
public class FileNameFilterDemo {
public static void main(String [] args){
File file=new File("D:\\123");
String [] strfile=file.list(new NameFilter(".txt"));
for(String s : strfile){
System.out.println("后缀名是.txt文件是="+s);
}
}
}
class NameFilter implements FilenameFilter{
private String endStr;
public NameFilter(String endStr){
super();
this.endStr=endStr;
}
public boolean accept(File dir, String name) {
return name.endsWith(endStr);
}
}
④、文件过滤器接口:interface FileFilter 通常用于检测文件是否存在
⑤、需重写 accept 方法自定义过滤规则
方法:
boolean accept(File pathName)
pathName:表示当前目录的子目录或者文件的名字
⑥、File类中提供了使用文件过滤器遍历目录的方法
File[] listFiles(FilenameFilter filter) 把满足制定过滤条件的文件盒目录,返回到file数组中
例如:
public static void main(String[] args) {
File file=new File("D:\\123");
File [] files=file.listFiles(new Filter());
for(File fil : files){
System.out.println(fil+" 是目录");
}
//过滤器的定义
class Filter implements FileFilter{
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
2、输入和输出的概念:
(1)输入输出(I/O)
①、是程序与外部设备或其他计算机进行交互的操作
②、几乎所有的程序都具有输入与输出的操作
③、如从键盘上读取数据,从本地或者网络上的文件读取数据或写入数据等
④、通过输入和输出操作可以从外界接收信息,或者把信息传递给外界
⑤、Java把这些输入和输出操作用流来实现,通过统一的接口来表示,从而使程序设计更为简单
(2)输入还是输出是相对于内存来说的
(3)把数据读到内存中,称为输入,即 Input,进行数据的 read 操作
(4)从内存往外部设备写数据,称为输出,即 Output,进行数据的 write 操作
3、输入输出流:
(1)流按数据的传输方向分为
①、输入流:往内存中读叫做输入流
②、输出流:从内存中往外面写叫做输出流
(2)所有输入流都是 InputStream 类或者 Reader 类的子类
①、类名以 InputStream 结尾的类都是 InputStream 的子类
②、类名以 Reader 结尾的类都是 Reader 类的子类
(3)所有输出流都是 OutputStream 类或者 Writer 类的子类
①、类名以 OutputStream 结尾的类都是 OutputStream 的子类
②、类名以 Writer 结尾的类都是 Writer 类的子类
4、根据输入输出是的编码不同,可以分为字节流和字符流:
从数据流编码格式上划分
-字节流
-字符流
InputStream 和 OutputStream 的子类都是字节流
-可以读写二进制文件,主要处理音频,图片,歌曲,字节流处理单元为1字节
Reader 和 Writer 的子类都是字符流
-主要处理字符或者字符串,字符流处理单元为2个字节
-字节流将读取到的字节数据,去制定的编码表中获取对应文字
字节流中常用类
-字节输入流 FileInputStream
-字节输出流 FileOutputStream
字符流中常用类
-字符输入流 FileReader
-字符输出流 FileWriter
5、节点流和处理流:
根据封装的类型不同流分为
-节点流:如果流封装的是某种特定的数据源,如文件,字符串,字符串数组等,称为节点流
-处理流:如果流封装的是其他流对象,称为处理流。处理流提供了缓冲功能,提高读写效率
节点流常用类
字节输入流:FileInputStream
字节输出流:FileOutputStream
字符输入流:FileReader
字符输出流:FileWriter
处理流中常用的类
缓冲字节输出流:BufferedOutputStream
缓冲字节输入流:BufferedIutputStream
缓冲字符输入流:BufferedReader
缓冲字符输出流:BufferedWriter
处理流的特点
字符缓冲输入流提供了读取一行的方法 readLine()
字符缓冲输出流提供了写入一个空行的方法 newLine()
字符缓冲输出流,把写入的数据先写入到内存,再使用 flush() 方法将内存数据刷到硬盘
注意:在使用字符缓冲输出流是,一定先 flush(),然后 close(),避免数据的丢失
6、字节流和字符流的转换:
(1)转换流的由来
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
(2)转换流的应用
字节流中的数据都是字符时,转成字符流操作更高效率
(3)字节流转换成字符流的桥梁
-InputStreamReader
例如:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
(4)字符流转换成字节流的桥梁
-OutputStreamWriter
例如:
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputSttream out String charsetName)
注意:它读入字节,并根据制定编码方式,将之转换为字符流使用的编码方式可能由名称指定,或平台可接受的 缺省编码方式
(5)转换流程图
InputStream in = System.in;
||
InputStream isr = new InputStream(in);
||
BufferedReader br = new BufferedReader(isr);
||
String line = br.readLine();
(6)字符流转成字节流图解
FileOutputStream fs= new FileOutputStream("D:\\demo.txt");
||
OutputStreamWriter ow= new OutputStream(fs);
||
BufferWriter bw= new BufferedWriter(ow);
||
bw.write(line);