尚硅谷_Java零基础教程-java入门必备-初学者基从入门到精通全套完整版(宋红康主讲) P577-619
(*)表示仅需了解
// 构造器1
String dir = "D:\\web\\IdeaProjects\\chunzhao\\";
File file = new File("hello.txt");
File file1 = new File(dir+"src\\learn\\others\\io\\hello.txt");
System.out.println(file);//hello.txt
System.out.println(file1);//D:\web\IdeaProjects\chunzhao\src\learn\others\io\hello.txt
//构造器2
File file2 = new File(dir , "src\\learn\\others\\io");
System.out.println(file2);//D:\web\IdeaProjects\chunzhao\src\learn\others\io
//构造器3
File file3 = new File(file2, "hello.txt");
System.out.println(file3);//D:\web\IdeaProjects\chunzhao\src\learn\others\io\hello.txt
public static final String separator
。根据操作系统动态的提供分隔符。例如new File("d:"+File.separator+"java"+File.separator+"demo1"+File.separator+"hello.txt")
System.out.println(file1.getAbsolutePath());
//D:\web\IdeaProjects\chunzhao\world.txt --创建文件之后--> 不变
System.out.println(file1.getPath()); //world.txt --创建文件之后--> 不变
System.out.println(file1.getParent()); //null ---> null
System.out.println(file1.getName()); //world.txt ---> world.txt
System.out.println(file1.length()); //0 ---> 12
System.out.println(file1.lastModified()); //0 ---> 1592209152962
File file = new File(this.dir);
String[] list = file.list();
for (String s:list) {
System.out.println(s);
}
// .idea
// chunzhao.iml
// out
// src
// world.txt
File[] files = file.listFiles();
for (File f:files ) {
System.out.println(f);
}
// D:\web\IdeaProjects\chunzhao\.idea
// D:\web\IdeaProjects\chunzhao\chunzhao.iml
// D:\web\IdeaProjects\chunzhao\out
// D:\web\IdeaProjects\chunzhao\src
// D:\web\IdeaProjects\chunzhao\world.txt
File file1 = new File("world.txt");
File file2 = new File(dir+"src\\learn\\others\\io\\world.txt");
//移动文件路径:需要file1存在,file2不存在
boolean renameTo = file1.renameTo(file2);
System.out.println(renameTo);
File file2 = new File("world.txt");
File file1 = new File(dir+"src\\learn\\others\\io\\world.txt");
//默认值(如果文件不存在)都为false
System.out.println(file1.isAbsolute());
System.out.println(file1.isDirectory());
System.out.println(file1.isFile());
System.out.println(file1.isHidden());
System.out.println(file1.canRead());
System.out.println(file1.canWrite());
System.out.println(file1.canExecute());
File类的创建功能
File类的删除功能
@Test
public void test6(){
File file = new File("newFile.txt");
if (file.exists()){
file.delete();
System.out.println("删除文件成功");
return;
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("创建文件成功");
}
@Test
public void test7(){
//目录
File directory = new File("D:\\web\\IdeaProjects\\chunzhao\\src\\learn\\others\\io","newDir");
if (directory.exists()){
boolean delete = directory.delete();
if (delete) {
System.out.println("删除目录成功");
}else {
System.out.println("删除目录失败");
}
return;
}
boolean mkdir = directory.mkdir();
if (mkdir){
System.out.println("创建目录成功");
}else {
System.out.println("创建目录失败");
}
例题1:计算指定目录所占的空间
@Test
public void test1(){
File file = new File("D:\\web\\IdeaProjects\\chunzhao\\src\\learn\\others\\io");
System.out.println(calDirSize(file));
}
public long calDirSize(File dir){
if (dir.isFile()) return dir.length();
long len = 0;
for (File f:dir.listFiles()) {
len+=calDirSize(f);
}
return len;
}
例题2:删除指定目录下的所有文件和目录。
输入输出是站在程序的角度来看:
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
FileNotFoundException
对异常的不同处理,有3种写法:
@Test
public void test1() throws IOException {
//1. 实例化 File
File file1 = new File("src\\learn\\others\\io\\world.txt");
boolean exists = file1.exists();
System.out.println(exists);
if (!exists) return;
//2. 提供具体的流
FileReader fileReader = new FileReader(file1);
//3. 数据读入(方式一)
// int data = fileReader.read();
// while (data!=-1){
// System.out.println((char)data);
// data = fileReader.read();
// }
//3. 数据读入(方式一 修改)
int data;
while ((data = fileReader.read()) != -1) {
System.out.println((char) data);
}
//4.流的关闭
fileReader.close();
}
@Test
public void test2() {
//1. 实例化 File
File file1 = new File("src\\learn\\others\\io\\world.txt");
//2. 提供具体的流
FileReader fileReader = null;
try {
fileReader = new FileReader(file1);
//3. 数据读入(方式一 修改)
int data;
while ((data = fileReader.read()) != -1) {
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流的关闭
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void test3() {
//1. 实例化 File
File file1 = new File("src\\learn\\others\\io\\world.txt");
//2. File流的实例化
try (FileReader fileReader = new FileReader(file1)) {
//3. 数据读入(方式一 修改)
int data;
while ((data = fileReader.read()) != -1) {
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void testRead1() {
//1. File类实例化
File file1 = new File("src\\learn\\others\\io\\world.txt");
//2. File流的实例化
try (FileReader fileReader = new FileReader(file1)) {
//3. 读入操作
char[] cbuf = new char[5];//每次读数据存到data空间。长度为5表示一次最多可读5个字符
int len;
while ((len = fileReader.read(cbuf)) != -1) {
//正确方式一
for (int i = 0; i < len; i++) {
System.out.print(cbuf[i]); //hello world!
}
//错误方式一
// for (int i = 0; i < cbuf.length; i++) {
// System.out.print(cbuf[i]); //hello world!orl
// }
//错误方式二
// String str = new String(cbuf);
// System.out.print(str); //hello world!orl
//正确方式二
String str = new String(cbuf,0,len);
System.out.print(str); //hello world!
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
FileWriter fileWriter = new FileWriter(file1,true);
不覆盖原有文件FileWriter fileWriter = new FileWriter(file1,false);
或FileWriter fileWriter = new FileWriter(file1);
覆盖原有文件//写出数据到文件
@Test
public void testFileWriter(){
//1.File类
File file1 = new File("src\\learn\\others\\io\\world.txt");
//2. File流的实例化
//FileWriter fileWriter = new FileWriter(file1,true) 不覆盖原有文件
//FileWriter fileWriter = new FileWriter(file1,false) 覆盖原有文件
try (FileWriter fileWriter = new FileWriter(file1,false)) {
//3. 写出操作
fileWriter.append("到此一游!");
} catch (IOException e) {
e.printStackTrace();
}
}
//复制一个文件的内容到另一个文件
@Test
public void copyContentBetweenFiles(){
//1.File类
File outFile = new File("src\\learn\\others\\io\\hello.txt");
File inFile = new File("src\\learn\\others\\io\\world.txt");
//2. File流的实例化
try (FileWriter fileWriter = new FileWriter(outFile,true);
FileReader fileReader = new FileReader(inFile)) {
//3. 读写操作
fileWriter.write("\ncopy from "+inFile.getName());
char[] buf = new char[5];
int len ;
while ((len=fileReader.read(buf))!=-1){
String string = new String(buf,0,len);
fileWriter.write(string);
}
} catch (IOException e) {
e.printStackTrace();
}
}
从一个文件读取内容,复制到另一个文件
@Test
public void testCopyFileStream(){
// 1.造文件
File file1 = new File(curPath, "杨慎.png");
File file2 = new File(curPath, "hello.txt");
File inFile = file2;
File outFile = new File(curPath,"copy of-"+inFile.getName());
// 2. 流类
try(FileInputStream inputStream = new FileInputStream(inFile);
FileOutputStream outputStream = new FileOutputStream(outFile)){
//3. 读写数据
byte[] buf = new byte[10];
int len;
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
bos.write(bis.readAllBytes())
@Test
public void testCopyFileStream(){
// 1.造文件
File file1 = new File(curPath, "杨慎.png");
File file2 = new File(curPath, "hello.txt");
File inFile = file1;
File outFile = new File(curPath,"copy of-"+inFile.getName());
// 2. 流类
try(
// 2.1造节点流
FileInputStream inputStream = new FileInputStream(inFile);
FileOutputStream outputStream = new FileOutputStream(outFile);
// 2.2造缓冲流
final BufferedInputStream bis = new BufferedInputStream(inputStream);
final BufferedOutputStream bos = new BufferedOutputStream(outputStream)){
//3. 读写数据
// byte[] buf = new byte[1024];
// int len;
// while ((len = bis.read(buf)) != -1) {
// bos.write(buf,0,len);
// }
//内部有缓冲器,不用在外部写了
bos.write(bis.readAllBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedReader和BufferedWriter的按行读数据
String data;
while ((data= bf.readLine())!=null){
bw.write(data);
bw.newLine();//提供换行操作
}
@Test
public void test1(){
String str1 = curPath+"hello.txt";
String str2 = curPath+"杨慎.txt";
try (
final InputStreamReader isr = new InputStreamReader(new FileInputStream(str1),"UTF-8");
final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(str2),"GBK");
)
{
char[] cbug = new char[1024];
int len;
while ((len=isr.read(cbug))!=-1){
osw.write(cbug,0,len);
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
ASCII
:美国标准信息交换码(一个字节的7位)
ISO8859-1
:拉丁码表,欧洲码表(一个字节的8位)
GB2312
:中国的中文编码表。最多两个字节编码所有字符
GBK
:中国的中文编码表升级。最多两个字节编码所有字符
Unicode
:国际标准码,融合了目前人类使用的所有字符。位每个字符分配唯一的字符码。两个字节来表示。
UTF-8
:变长的编码方式,可用1-4个字节来表示一个字符。(修正的UTF-8编码最多可能需要6个字节)
Unicode不完美,有三个问题:1. 英文字母一个字节表示就够了, 2.如何才能区分Unicode和ASCII? 计算机怎么知道两个字节表示一个符号,而不是分别表示两个符号?3. 如果和GBK等双字节编码方式一样,用最高位是1或0来表示两个字节和一个字节,就少了很多可用的值,两个字节不够表示所有字符。Unicode在很长一段时间内无法推广,直到互联网的出现。
面向传输的众多UTF(UCS Transfer Format)标准出现了。UTF-8就是每次8个位传输数据,UTF-16
就是每次16位。这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界所有文化的字符了。
Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8和UTF-16。
ANSI
编码,通常指的是平台的默认编码。例如英文操作系统中是ISO-8859-1,中文系统是GBKSystem.in、System.out
从键盘输入字符串,要求将读到的整行字符转化为大写输出,然后继续输入,知道输入"e" 或"exit"退出
try(final InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);)
{
System.out.println("请输入字符串:");
while (true) {
String data = br.readLine();
if ("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)) {
System.out.println("程序结束");
break;
}
System.out.println(data.toUpperCase());
}
}
catch (IOException e) {
e.printStackTrace();
}
@Test
public void test2(){
// PrintStream ps = null;
String str = "src\\learn\\others\\io\\PrintStream.txt";
try (final FileOutputStream fos = new FileOutputStream(new File(str));
PrintStream ps = new PrintStream(fos,true)){
if (ps!=null){//把标准输出流改成文件
System.setOut(ps);
}
for (int i = 0; i < 256; i++) {
System.out.print((char) i );
if (i%10==0){
System.out.println();//换行
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
输入输出测试
@Test
public void test3() throws IOException {
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeUTF("数据输出流");
dos.flush();
dos.writeInt(23);
dos.flush();
dos.writeBoolean(true);
dos.flush();
dos.close();
}
@Test
public void test4() throws IOException {
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
System.out.println(dis.readUTF());
System.out.println(dis.readInt());
System.out.println(dis.readBoolean());
dis.close();
}
static
和transient
修饰的成员变量。Serializable
Externalizable
private static final long serialVersionUID
InvalidCastException
异常。private static final long serialVersionUID
输入输出测试:
String str = "src\\learn\\others\\io\\world.txt";
try(final RandomAccessFile accessFile = new RandomAccessFile(new File(str),"rw");){
accessFile.write("xyz".getBytes());
System.out.println(accessFile.getFilePointer());
long pos = 10l;
accessFile.seek(pos);
accessFile.write("TEN".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
用RandomAccessFile实现“插入”操作:
因为write()会覆盖文件原内容,可以先把内容读取出来保存起来(用StringBuilder或ByteArrayOutputStream保存),覆盖之后再append这部分内容。
可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能:
下载时建立两个临时文件,一个是与被下载文件大小相同的空文件,一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后下次继续下载,从而实现断点下载或上传的功能。
Path path = Paths.get("index.html")