一、File类
1.File类的构造方法
方法名 | 说明 |
---|---|
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的File实例 |
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的File实例 |
案例分析:
package com.file;
import java.io.File;
public class Test1 {
public static void main(String[] args) {
File f1=new File("F://Test//java.txt");
System.out.println(f1); //F:\Test\java.txt
File f2=new File("F://Test","java.txt");
System.out.println(f2); //F:\Test\java.txt
File f3=new File("F://Test");
File f4=new File(f3,"java.txt");
System.out.println(f4); //F:\Test\java.txt
}
}
2.File类的创建
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 |
案例分析:
package com.file;
import java.io.File;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
//在F盘的Test目录下创建一个test.txt文件
File f1=new File("F://Test//test.txt");
System.out.println(f1.createNewFile()); //true
//在F盘的Test目录下创建一个Spring目录
File f2=new File("F://Test//Spring");
System.out.println(f2.mkdir()); //true
//在F盘的Test目录下创建多个目录
File f3=new File("F://Test//MyBatis//SpringMVC");
System.out.println(f3.mkdirs()); //true
}
}
3.File类判断和获取
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
public File[]listFiles() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
案例分析:
package com.file;
import java.io.File;
public class Test3 {
public static void main(String[] args) {
File f=new File("F:\\Test\\java.txt");
System.out.println(f.isDirectory()); //false
System.out.println(f.isFile()); //true
System.out.println(f.exists()); //true
System.out.println(f.getAbsoluteFile()); //F:\Test\java.txt
System.out.println(f.getPath()); //F:\Test\java.txt
System.out.println(f.getName()); //java.txt
File f1=new File("F:\\Test");
String[] list = f1.list();
for (String s : list) {
System.out.println(s);
/*
a
b
java.txt
MyBatis
Spring
test.txt
TestOne
小飞侠
小马哥*/
}
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);
/*
F:\Test\a
F:\Test\b
F:\Test\java.txt
F:\Test\MyBatis
F:\Test\Spring
F:\Test\test.txt
F:\Test\TestOne
F:\Test\小飞侠
F:\Test\小马哥
*/
}
}
}
4.File类的删除
方法名 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
绝对路径和相对路径的区别
绝对路径: 完整的路径名,不需要任何其他信息就可以定位它所表示的文件。
- 例如:
E:\\study\\text.txt
- 例如:
相对路径: 使用取自其他路径名的信息进行解释。
- 例:
study\\text.txt
- 例:
案例分析:
package com.file;
import java.io.File;
import java.io.IOException;
public class Test4 {
public static void main(String[] args) throws IOException {
//在当前模块下创建one.txt文件
File f1=new File("E:\\JavaSE\\Test\\File\\one.txt"); //true
System.out.println(f1.createNewFile());
//删除当前模块下创建one.txt文件
System.out.println(f1.delete()); ////true
//在当前模块下创建one目录
File f2=new File("E:\\JavaSE\\Test\\File\\one");
System.out.println(f2.mkdir()); ////true
//删除当前模块下创建one目录
System.out.println(f2.delete()); ////true
}
}
二、IO流
1.io流的概述和分类
IO:输入/输出(Input/Output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
IO流就是用来处理设备间数据传输问题的
- 常见的应用:文件复制;文件上传;文件下载
IO流分类:
按照数据的流向
- 输入流:读数据
- 输出流:写数据
按照数据类型来分
字节流
- 字节输入流;字节输出流
字符流
- 字符输入流;字符输出流
- 一般来说,IO流的分类是按照数据类型来分的
2.字节流
1.字节流写数据
字节流抽象基类
- lnputStream: 这个抽象类是表示字节输入流的所有类的超类
- OutputStream: 这个抽象类是表示字节输出流的所有类的超类
- 子类名特点: 子类名称都是以其父类名作为子类名的后缀
FileOutputStream: 文件输出流用于将数据写入File
- FileOutputStream(Stringname): 创建文件输出流以指定的名称写入文件
案例分析:
package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test1 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
//将字节写入此文件输出流
f.write(97); //a
//释放资源
f.close();
}
}
2.字节流写数据的三种方式
方法名 | 说明 |
---|---|
void write(int b) | 将指定的字节写入此文件输出流,一次写一个字节数据 |
void write(byte[] b) | 将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据 |
案例分析:
package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
//将字节写入此文件输出流
/* f.write(97);
f.write(98);
f.write(99);
f.write(100); */ //abcd
//将指定的字节数组写入此文件输出流
byte[] bytes={97,98,99,100};
//f.write(bytes); //abcd
f.write(bytes,1,2); //bc
//释放资源
f.close();
}
}
3.换行和追加
- 字节流写数据实现换行
写完数据后,加换行符
- windows:\n
- linux:\n
- mac:\r
字节流写数据实现追加写入
- public FileOutputStream(Stringname,boolean append)
- 创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
案例分析:
package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt",true);
for (int i = 0; i <5 ; i++) {
f.write("hello".getBytes());
f.write("\r\n".getBytes());
}
f.close();
}
}
//执行三次的结果
/*
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
*/
4.字节流读数据(一次只能读一个字节)
FilelnputStream:从文件系统中的文件获取输入字节
- FilelnputStream(String name):通过打开与实际文件的连接来创建一个FilelnputStream,该文件由文件系统中的路径名name命名
使用字节输入流读数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
案例分析:
package com.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream f = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
//读取数据
/*int by = f.read();
System.out.println(by); //97
System.out.println((char)by); //a
*/
//一次只能读取一个字节
int by = f.read();
while (by != -1){
System.out.print((char) by); //abc
by=f.read();
}
//释放资源
f.close();
}
}
5.字节流复制文本文件
案例:
package com.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
FileOutputStream f2 = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");
int by = f1.read();
while (by !=-1){
f2.write((char)by);
by=f1.read();
}
}
}
6.字节流读数据(一次读一个字节数组)(复制图片操作一样)
案例:
package com.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");
byte[] bytes=new byte[1024];
int by;
by = f1.read(bytes);
while (by !=-1){
System.out.println(new String(bytes,0,by));
by=f1.read(bytes);
}
}
}
/*
Java
JavaWeb
Python
Spring
Mybatis
*/
7.字节缓冲流
案例:
package com.BufferStream;
import java.io.*;
public class Test1 {
public static void main(String[] args) throws IOException {
BufferedOutputStream b1 = new BufferedOutputStream(new FileOutputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));
b1.write("Hello".getBytes());
b1.write("\r\t".getBytes());
b1.write("World".getBytes());
b1.close();
BufferedInputStream b2 = new BufferedInputStream(new FileInputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));
int by = b2.read();
while (by !=-1){
System.out.print((char)by);
by=b2.read();
}
b2.close();
}
}
3.字符流
1.字符串中编码解码问题
编码:
- bytegetBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
- bytel]getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
解码
- String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
- String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
案例分析:
package com.zifu;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException {
/*String s1="小马哥";
byte[] bytes = s1.getBytes();
System.out.println(Arrays.toString(bytes)); //[-27, -80, -113, -23, -87, -84, -27, -109, -91]
//String s=new String(bytes); //小马哥
String s=new String(bytes,"UTF-8"); //小马哥
System.out.println(s);*/
String s2="小飞侠";
byte[] bytes =s2.getBytes("GBK");
System.out.println(Arrays.toString(bytes)); //[-48, -95, -73, -55, -49, -64]
String s=new String(bytes,"GBK");
System.out.println(s); //小飞侠
}
}
2.字符流中编码解码问题
InputStreamReader:是从字节流到字符流的桥梁
- 它读取字节,并使用指定的编码将其解码为字符
- 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
OutputStreamlriter:是从字符流到字节流的桥梁
- 是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
- 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
案例分析:
package com.zifu;
import java.io.*;
public class Test2 {
public static void main(String[] args) throws Exception {
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");
o.write("小飞侠");
o.close();
InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");
int by = i.read();
while (by !=-1){
System.out.print((char)by); //小飞侠
by=i.read();
}
}
}
3.字符流写数据的5种方式
方法名 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(char[]cbuf) | 写入一个字符数组 |
void write(char[]cbuf, int off, int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
案例分析:
package com.zifu;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Test3 {
public static void main(String[] args) throws Exception {
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"));
//写一个字符
o.write("97"); //97
o.write("a"); //a
//刷新流
o.flush();
//写一个字符数组
char[] chars={'a','b','c','d','e'}; //abcde
//o.write(chars);
//写一个字符数组的一部分
o.write(chars,0,chars.length); //abcde
o.write(chars,1,3); //bcd
//写一个字符串
//o.write("xyz"); //xyz
//写一个字符串的一部分
o.write("asdfghj",1,5); //sdfgh
o.close();
}
}
4.字符流读数据的2中方式
方法名 | 说明 |
---|---|
int read() | 一次读一个字符数据 |
int read(char[] cbuf) | 一次读一个字符数组数据 |
案例分析:
package com.zifu;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test4 {
public static void main(String[] args) throws IOException {
InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"));
//一次读一个字符数据
int by = i.read();
while (by !=-1){
System.out.print((char)by); //aabcdebcdsdfgh
by=i.read();
}
//一次读一个字符数组
char[] chars=new char[1024];
int c = i.read(chars);
while (c!=-1){
System.out.println(new String(chars,0,c));
c=i.read(chars);
/*
aab
cde
bcds
dfgh
*/
}
}
}
5.字符缓冲流
字符缓冲流:
- BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲 区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
- BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途
构造方法:
- BufferedWriter(Writer out)
- BufferedReader(Reader in)
案例分析:
package com.zifu;
import java.io.*;
public class Test5 {
public static void main(String[] args) throws IOException {
/*BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));
w.write("Hello");
w.write("\r\n");
w.write("World");*/
BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));
int by = r.read();
while (by!=-1){
System.out.print((char)by);
/*
Hello
World
*/
by=r.read();
}
//w.close();
r.close();
}
}
6.字符缓冲流特有功能
BufferedWriter:
- void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader:
- public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
案例分析:
package com.zifu;
import java.io.*;
public class Test6 {
public static void main(String[] args) throws IOException {
BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));
for (int i = 0; i <5 ; i++) {
w.write("Java"+i);
/*
Java0
Java1
Java2
Java3
Java4
*/
//换行
w.newLine();
w.flush();
}
w.close();
BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));
/*String s = r.readLine();
while (s!=null){
System.out.println(s);
s=r.readLine();
}*/
String s;
while ((s=r.readLine())!=null){
System.out.println(s);
}
}
}
/*
Java0
Java1
Java2
Java3
Java4
*/