一、File
jva.io.File
(文件和目录的抽象表现形式)对象主要用来获取文件本身的信息,例如文件所在目录、文件的长度和文件的读/写权限等,不涉及对文件的读/写操作。- 这个类实际上隐藏了大量的与系统相关的复杂因素和细节。例如,在 Windows 系统中目录名和文件名被字符
\
分开,在 UNIX 系统中用分隔符 /
,而在 Macintosh
计算机中用 :
分隔。无论是哪个系统,在 Java 程序中,可以使用 File.separator
作为分隔符。这个字符串包含单个字符,它在当前的 Java 虚拟机所处的操作系统下总是正确的分隔符。
1.创建 File 类的对象
2.获取文件或目录属性
- public boolean exists(): 此File标识的文件或目录是否实际存在
- public boolean isDirectory():此File标识的是否为文件夹
- public boolean isFile():此file表示的是否为文件
- public String getAbsolutePath():返回File的绝对路径名 字符串
- public String getPath():将此File转换为路径名 字符串,获取构造路径(就是获取你构造方法时候放入的路径)
- public String getName():返回此File表示的文件或目录的名称
- public long length():返回此File表示的文件的字节大小,不能获取目录的字节大
3.文件或目录操作
- public boolean creatNewFile():当且仅当不存在该名称的文件时,创建一个新的空文件
- public boolean mkdir():创建由File表示的目录
- public boolean mkdirs():创建由File表示的目录,包括任何必须但不存在的父目录
- public boolean delete():删除抽象路径名定义的文件或目录。 如果要删除的是目录,目录必须为空。
- public String[] list():返回一个String数组,表示该File目录中的所有子文件或目录的名称
- public File[] listFiles():返回一个File数组,表示File目录中的所有子文件或目录的路径
二、IO流
- 输入流输出流是相对于
程序(内存)
而言的。将数据读入程序(内存)就是输入,把数据从程序(内存)中输出就是输出流。 流
的最大特点是数据的获取和发送均按照数据序列进行:每一个数据都必须等待排在它前面的数据读入或送出后才能被读写,不能随意选择输入输出的位置。- 在
java.io
包中IO流有着四大家族
:InputStream类
、OutputStream类
、Reader类
、Writer类
。
- 这四个类都是抽象类,下面有很多的实现类可以使用。
- 在java中只要
类名
以 Stream
结尾的都是字节流
。以Reader/Writer
结尾的都是字符流
。
- 注意:
所有的流
都实现了:java.io.Closeable
接口,都是可关闭的,都有close()
方法。流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。- 所有的
输出流
都实现了:java.io.Flushable
接口,都是可刷新的,都有flush()
方法。养成一个好习惯,输出流在最终输出之后,一定要记得flush()
刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。如果没有flush()可能会导致丢失数据。
System.in
标准输入设备是键盘。System.out
标准输出设备是终端或监视器。System.err
标准错误输出设备。
1.Java要掌握的流(16个)
- 文件专属:
- java.io.FileInputStream(掌握)√
- java.io.FileOutputStream(掌握)√
- java.io.FileReader
- java.io.FileWriter
- 转换流:(将字节流转换成字符流)
- java.io.InputStreamReader
- java.io.OutputStreamWriter
- 缓冲流专属:
- java.io.BufferedReader
- java.io.BufferedWriter
- java.io.BufferedInputStream
- java.io.BufferedOutputStream
- 数据流专属:
- java.io.DataInputStream
- java.io.DataOutputStream
- 标准输出流:
- java.io.PrintWriter
- java.io.PrintStream(掌握)
- 对象专属流:
- java.io.ObjectInputStream(掌握)
- java.io.ObjectOutputStream(掌握)
2.字节流
- 按照
字节
的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。 - 这种流是万能的,什么类型的文件都可以读取。包括:
文本文件,图片,声音文件,视频文件
等…
(1)java.io.FileInputStream
- 文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。
FileInputStream(String name) name为文件路径
FileInputStream(File file)
int read() 读取一个字节,返回值为该字节ASCII码;读到文件末尾返回-1
int read(byte[] b) 读b数组长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1
int read(byte[] b, int off, int len) 从b数组off位置读len长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1
int available() 返回文件有效的字节数
long skip(long n) 跳过n个字节
void close() 关闭文件输入流
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest04 {
public static void main(String[] args) {
FileInputStream in = null;
try {
in = new FileInputStream("test/test.txt");
byte[] bytes = new byte[4];
int readCount;
while((readCount = in.read(bytes)) != -1) {
System.out.print(new String(bytes, 0, readCount));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest05 {
public static void main(String[] args) {
FileInputStream in = null;
try {
in = new FileInputStream("test/test.txt");
System.out.println("总字节数量:" + in.available());
byte[] bytes = new byte[in.available()];
in.skip(3);
System.out.println(in.read());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(2)java.io.FileOutputStream
- 文件字节输出流,万能的,任何类型的文件都可以采用这个流来写。
-
FileOutputStream(String name) name为文件路径
FileOutputStream(String name, boolean append) name为文件路径,append为true表示在文件末尾追加;为false表示清空文件内容,重新写入,默认为false
FileOutputStream(File file)
FileOutputStream(File file, boolean append) append为true表示在文件末尾追加;为false表示清空文件内容,重新写入,默认为false
void write(int b) 将指定字节写入文件中
void write(byte[] b) 将b.length个字节写入文件中
void write(byte[] b, int off, int len) 将b素组off位置开始,len长度的字节写入文件中
void flush() 刷新此输出流并强制写出所有缓冲的输出字节
void close() 关闭文件输出流
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest01 {
public static void main(String[] args) {
FileOutputStream out = null;
try {
out = new FileOutputStream("test/myfile", true);
byte[] bytes = {48, 49, 50, 51, '\n'};
out.write(bytes);
out.write(bytes, 1, 4);
String s = "my name is Jack!!!\n";
byte[] bs = s.getBytes();
out.write(bs);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.字符流
- 照
字符
的方式读取数据的,一次读取一个字符。 - 这种流是为了方便读取
普通文本文件
而存在的,这种流不能读取:图片、声音、视频等文件。只能读取 纯文本文件
,连word文件都无法读取。
- 注意:纯文本文件,不单单是.txt文件,还包括
.java
、.ini
、.py
。总之只要 能用记事本打开
的文件都是普通文本文件。