File类
基本概念:为了很方便的代表文件的概念,以及存储一些对于文件的基本操作,在java.io包中设计了一个专门的类——File类。
在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具体的文件或文件夹,所以以前曾有人建议将该类的类名修改成FilePath,因为该类也可以代表一个文件夹,更准确的说是可以代表一个文件路径。
File类提供的各种方法能够创建、删除文件和目录,获取磁盘上指定文件和目录的相关信息。
File类的构造方法:
File(String fileName) | 完整路径或相对路径
|
File(String directory,String fileName) | 指定文件目录和文件名
|
File(File directory,String fileName)
| 使用File对象来表示文件目录
|
注意:调用构造函数只能创建一个File对象,而不是在文件系统中创建了一个文件
File file = new File("d:\\test.txt");
boolean exists() 文件或目录是否存在
boolean isFile() 是否是文件
boolean isDirectory() 是否是目录
String getName() 获取文件或目录的名字
long lastModified() 获取最后的修改日期
long length() 获取文件大小,字节为单位
String[] list() 如果对象是目录,则返回目录下所有文件和目录名字的列表
mkdir() 创建File中的目录
mkdirs() 创建File中的目录,如果父目录不存在,还会创建父目录
renameTo(File f) 修改文件的名称,会删除原文件
createNewFile() 如果File代表文件,则创建一个空文件
boolean delete() 删除文件或目录(如果目录下包含子目录或文件,则不能删除)
创建一个文件:
1、调用File对象的createNewFile()
2、调用FileOutputStream()
创建一个目录:
1、mkdir(); 创建父目录已经存在的目录
2、mkdirs();创建多层目录
windows下。分隔符是“\” linux下。分隔符是“/” File.separator
如果现在给定了一个文件夹,要求可以将这个文件夹中的内容全部列出,此时,可以使用以下的两种方法:
第一种方法:public String[] list()
第二种方法:public File[] listFiles()
例子:
public static void main(String[] args) {
File file = new File("D:" + File.separator + "html");
showfile(file);
}
public static void showfile(File file) {
if (file.isFile()) {
System.out.println(file.getName());
} else {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
showfile(f);
}
}
}
}
IO流
大部分程序都需要输入/输出处理,比如从键盘读取数据、向屏幕中输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等。
注意:Java用于操作流的对象都在IO包中
按照数据的输入输出方式分为:
输入流(Input Stream)和输出流(Output Stream)
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
输入就是指input,输出就是指output,输入输出就是指某个方向的数据流动
根据处理数据类型的不同分为:字节流和字符流
字节流 :InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
字符流:Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
3根据数据流的功能不同分为:节点流和处理流(过滤流)
字节流和字符流的区别:
1,字节流读取的时候,读到一个字节就返回一个字节。
字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个)时。先去查指定的编码表,将查到的字符返回。
2,字节流可以处理所有类型数据,如图片,mp3,avi。
而字符流只能处理字符数据。
结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
BufferedInputStream
BufferedOutputStream
BufferedOutputStream有一个Byte[] buf成员,按理说用下面的代码就能得到其默认大小
BufferedOutputStream bos = new BufferedOutputStream(someOutputStream);
bos.buf.length;
但是buf是protected变量,不能直接访问,也没有相应的get方法,怎么办?我们知道protected成员在继承树上是可见的,就是说其孩子可见,那么可以想到通过继承BufferedOutputStream的办法,来获取buf的大小,代码如下:
public class MyBufferedOutputStream extends BufferedOutputStream {
public MyBufferedOutputStream(OutputStream out){
super(out);
System.out.println("buf size: " + super.buf.length);
System.out.println("count: " + super.count);
}
public static void main(String[] args) {
try {
MyBufferedOutputStream mbos = new MyBufferedOutputStream(new FileOutputStream("123.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果为:8192字节!
对于bufferedInputStream也一样。