文件操作
- 1. File类
- 2. Java的IO流
- (1)流的分类
- (2)输入流和输出流的工作机制
- 3. 输入流(InputStream 和 Reader)
- 4. 输出流(OutputStream 和 Writer)
1. File类
File代表的是与平台无关的文件和目录,File能够新建、删除、重命名文件和目录。
但是如果需要访问文件内容本身,则需要输入、输出流。
TIPS:
windows下路径分隔符:\,因为\表示转义符
java支持用/作为平台无关的路径分隔符
File类常用方法参考这里。
File类方法实例程序:
public class FileTest {
public static void main(String[] args) throws IOException {
//创建File对象
File file = new File(".");
//获取文件名
System.out.println(file.getName());
//获取父路径
System.out.println(file.getParent());
//获取绝对路径
System.out.println(file.getAbsoluteFile());
//获取上一级路径
System.out.println(file.getAbsoluteFile().getParent());
//创建临时文件
File tempFile = File.createTempFile("aaa", ".txt",file);
//JVM退出时删除该文件
tempFile.deleteOnExit();
//创建新文件
File newFile = new File(System.currentTimeMillis()+"");
//判断newFile文件是否存在
System.out.println(newFile.exists());
//以指定newFile对象创建文件
newFile.createNewFile();
System.out.println(newFile.exists());
//以指定newFile对象创建目录
System.out.println(newFile.mkdir());
//使用list方法列出当前路径下所有的文件和路径
String[] fileList = file.list();
for (String fileName : fileList) {
System.out.print(fileName+" ");
}
System.out.println();
//listRoot静态方法列出所有的磁盘根目录
File[] roots = file.listRoots();
for (File root : roots) {
System.out.print(root+" ");
}
}
}
输出如下:
.
null
C:\Users\Administrator\Workspaces\MyEclipse 2017 CI\File\.
C:\Users\Administrator\Workspaces\MyEclipse 2017 CI\File
false
true
false
.classpath .project .settings 1539013363207 aaa8487166334884126973.txt bin src
C:\ D:\ E:\ F:\ G:\ H:\ I:\
2. Java的IO流
(1)流的分类
抽象基类 | 输入流 | 输出流 | |
字节流 | InputStream | OutputStream | 操作数据单元是8位的字节 |
字符流 | Reader | Writer | 操作数据单元是16位的字符 |
- 节点流:程序和输入输出节点直接连接
- 处理流:包装节点流
(2)输入流和输出流的工作机制
- 输入流使用隐式的记录指针表示当前正准备从什么位置开始读取,读取后,记录指针自动向后移动。(这里就涉及到输入流只能读取一次的问题)
- 输出流同样使用隐式指针标识当前准备放入的位置,输出后,记录指针同样自动向后移动。
3. 输入流(InputStream 和 Reader)
InputStream中包含如下三个方法:
方法 | 说明 | 返回值 |
int read() | 读取单个字节 | 所读取的单个字节(int类型) |
int read(byte[] b) | 读取b.length个字节的数据,放在b中 | 读取的字节数(返回-1表示读到了输入流的结束点) |
int read(byte[] b,int off,int len) | 读取len个字节的数据,放在b中off开始的位置 | 读取的字节数 |
Reader中包含三个类似的方法,区别只是字节和字符:
- int read()
- int read(char[] cbuf)
- int read(char[] cbuf,int off,int len)
实例:使用FileInputStream读取文件H:/test.txt:
try (FileInputStream fis = new FileInputStream("H:/test.txt"))
{
byte[] bbuf = new byte[1024];
int hasRead=0;
while ((hasRead=fis.read(bbuf))>0) {
System.out.print(new String(bbuf,0,hasRead));
}
} catch (IOException e) {
e.printStackTrace();
}
实例:使用FileReader读取文件H:/test.txt:
try (FileReader fr = new FileReader("H:/test.txt"))
{
char[] cbuf = new char[32];
int hasRead=0;
while ((hasRead=fr.read(cbuf))>0) {
System.out.print(new String(cbuf,0,hasRead));
}
} catch (IOException e) {
e.printStackTrace();
}
Tips:
- Java 7 之后可通过自动关闭资源的try语句关闭IO流,使用方法是把流的定义放在try后的()中;
- 移动记录指针的方法:
void mark(int readAheadLimit)
boolean markSupported()
void reset()
long skip(long n)
4. 输出流(OutputStream 和 Writer)
OutputStream中包含如下三个方法:
方法 | 说明 |
void write(int c) | 将指定的字节输出到输出流 |
void write(byte[] b) | 将字节数组中的数据输出到输出流 |
void write(byte[] b,int off,int len) | 将字节数组中从off开始,长度为len的字节输出到输出流 |
Writer中包含三个类似的方法,区别只是字节和字符。
Writer中还包含另外两个以字符串为参数的方法:
方法 | 说明 |
void write(String str) | 将字符串输出到输出流 |
void write(String str, int off, int len) | 将字符串中从off开始,长度为len的字符输出到输出流 |
实例:使用FileInputStream输入,并使用FileOutputStream输出,实现复制文件的功能。
try (FileInputStream fis = new FileInputStream("H:/test.txt");
FileOutputStream fos = new FileOutputStream("H:/new-test.txt"))
{
byte[] bbuf = new byte[32];
int hasRead = 0;
while ((hasRead = fis.read(bbuf))>0) {
fos.write(bbuf, 0, hasRead);
}
} catch (IOException e) {
e.printStackTrace();
}
实例:使用Writer直接输出字符串内容。
try (FileWriter fw = new FileWriter("H:/out-test.txt"))
{
fw.write("长城\r\n");
fw.write(" ——诗一首\r\n");
fw.write("啊\r\n");
fw.write("长城啊\r\n");
fw.write("你可真他喵的长\r\n");
} catch (IOException e) {
e.printStackTrace();
}