文件与IO
File
//创建一个File对象,指向一个文件或者目录(文件或者目录不一定存在)
File file = new File("c:" + File.separator + "a.txt");
//创建文件
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("文件的绝对路径" + file.getAbsolutePath());
//创建目录
File file2 = new File("c:\\test");
//如果不存在就创建
if (!file2.exists()) {
file2.mkdir();
}
2、字节流
- 1、IO流概述(不要以我为主)
- IO流:输入输出流
- 流是一组有序的,有起点有终点的字节集合,是对数据传输的总称或者抽象,即数据在两个设备间的传输称为流
- 流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
- IO流的分类:
- 处理数据类型的不同分为:字符流和字节流
- 数据流向的不同分为:输入和输出流
- 2、字节输出流
- OutputStream
- 此抽象类是表示输出字节流的所有类的超类,输出流接受输出字节并将这些字节发送到InputStream类某个接收器,要向文件中输出,使用FileOutputStream
/**
* 字节输出流,从程序向文件中输出数据
*/
public static void write() {
File file = new File("c:\\a.txt");
try {
// 针对文件创建一个输出流
OutputStream out = new FileOutputStream(file);
String info = "hello";
out.write(info.getBytes()); //写入数据
out.close();//关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- 3、字节输入流
- InputStream
- 此类表示字节输入流的所有类的超类
- FileInputStream从文件系统中的某个文件中获得输入字节
/**
* 从文件中读取数据
*/
public static void read(){
File file = new File("c:\\a.txt");
try {
InputStream is = new FileInputStream(file);
//定义一个字节数组
byte []b = new byte[1024];
int len = 0;//每次真实读取的长度
StringBuffer sb = new StringBuffer();
while((len = is.read(b))!= -1){
sb.append(new String(b,0,len));
}
System.out.println(sb.toString());
is.close();//关闭
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- 3、字符流
- Writer
- 写入字符流的抽象类,字符必须实现的方法仅有write(char[],int int),flush(),和close(),但是,多数子类将重写此与OutputStream一样
- 对文件的操作使用:FileWriter类完成
- Writer
/**
* 字符输出流
*/
public static void write() {
File file = new File("d:\\b.txt");
if (!file.exists()) {
try {
file.createNewFile();
Writer out = new FileWriter(file);
out.write("hello,我是字符输出流"); //输出到缓存中
out.write("\r\n");//输出换行符
out.flush();//刷新缓存
out.close();
System.out.println("success");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Reader
* 用于读取字符流的抽象类,子类必须实现的方法由read(char[],int,int)和close();但是,多数子类将重写此使用FileReader类进行实例化操作。
/**
* 字符读取数据
*/
public static void read() {
File file = new File("d:\\b.txt");
try {
Reader in = new FileReader(file);
char[] cs = new char[2];
int len = -1;
StringBuffer sb = new StringBuffer();
while ((len = in.read(cs)) != -1) {
sb.append(new String(cs, 0, len));
}
in.close();
System.out.println(sb);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
* 字节流和字符流的区别
* 在所有的流操作中,字节永远是最基础的,任何基于字节的操作都是正确的,无论你是文本文件还是二进制的文件,如果确认流里面的只有可打印的字符,包括英文和各种国家的文字,也包括中文,那么可以考虑用字符流,由于编码的不同,多字节的字符可能占用多个字节,比如GBK的汉字就占用2个字符,而UTF-8的汉字就占用三个字符,所有字符流是根据指定的编码,将一个或者多个字节转化为java里面的unicode的字符,然后进行操作,字符操作一般使用Writer、Reader等,字节操作一般是InputStream、OutputStream以及各种包装类,比如BufferedInputStream和BufferedOutputStream的等
-
总结:
- 如果是操作的是文本类型的文件,我们建议使用字符流
- 如果是非文本类型的文件,我们建议使用字节流
-
4、缓冲流
- 首先明确一个概念
对文件或者其他目标频繁的读写操作,效率低、性能差
使用缓冲流的好处,能够高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来
BufferedInputStream:为另一个输入流添加一些功能,在创建BufferedInputStream时候,会创建一个内部缓冲区数组,用于缓冲数据。
BufferedOutputStream:通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
BufferedWriter:将文本写入字符输出流,缓冲各个字符、从而提供单个字符、数组、和字符串的高效写入
- 首先明确一个概念