File

File是文件和路径名的抽象表示,File封装的并不是一个真正存在的文件,是一个路径名,可以存在也可以不存在

常用方法:

  • 创建文件:createNewFile()
  • 创建目录:mkdir()
  • 创建多级目录:mkdirs()
import java.io.File;
import java.io.IOException; public class FileDemo {
public static void main(String[] args) throws IOException {
// 最好不要这样写,如果创建文件,最好指明文件类型
// File f1 = new File("D:\\javaee.txt");
File f1 = new File("D:\\javaee.txt");
System.out.println(f1.createNewFile());
File f2 = new File("D:\\javaee");
System.out.println(f2.mkdir());
File f3 = new File("D:\\JavaSe\\java");
System.out.println(f3.mkdir());
File f4 = new File("D:\\JavaSe\\java");
System.out.println(f4.mkdirs());
}
}

File类别判断和获取功能:

  • isDirectory:测试此抽象路径名表示的File是否为目录
  • isFile:是否为文件
  • exists:是否存在
  • getAbsolutePath:绝对路径名字符串
  • getPath:路径名字符串
  • getName:文件或目录的名称
  • list:目录中的文件和目录的名称字符串数组
  • listFiles:目录中的文件和目录的File对象数组
import java.io.File;

public class Demo {
public static void main(String[] args) {
File f = new File("C:\\Users\\yourname\\Desktop\\code\\java_project");
boolean exists = f.exists();
System.out.println(exists);
System.out.println(f.isFile());
System.out.println(f.isDirectory());
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
System.out.println(f.list());
System.out.println(f.listFiles());
String[] file_list = f.list();
for(String s:file_list){
System.out.println(s);
}
File[] listFiles = f.listFiles();
for(File x:listFiles){
System.out.println(x);
}
}
}

File有了list方法,但是还是有listFiles方法,这时因为list生成的就是String,而listFiles生成的File对象,这样还可以继续使用File中的方法

删除目录时注意事项:如果一个目录中有内容(目录,文件),不能直接删除,而应该先删除目录中的内容

递归

递归指的是方法定义中调用方法本身的现象

递归需要有递归出口和递归规则

递归求5的阶乘的过程:

题目:

import java.io.File;

public class Demo {
public static void main(String[] args) {
File file = new File("C:\\Users\\yourname\\Desktop\\code\\java_project");
fileOutPut(file);
}
public static void fileOutPut(File f){
if(f.isFile()){
System.out.println(f.getAbsolutePath());
}else{
File[] files = f.listFiles();
for(File file:files){
fileOutPut(file);
}
}
}
}

IO流

流是一种抽象的概念,是对数据传输的总成,也就是说数据在设备间的传输成为流,流的本质是数据传输

IO流就是用来处理设备间数据传输问题的,如文件复制、文件上传、文件下载

分类:

  • 数据流向:输入流和输出流
  • 数据类型:字节流和字符流

可以读懂的就用字符流,读不懂的用字节流,不知道用什么就用字节流

字节流抽象基类:

  • InputStream:这个抽象类是表示字节输入流的所有类的超类
  • OutputStream:这个抽象类是表示字节输出流的所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀
// FileOutputStream的write的三种写
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets; public class Demo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("./My_File/demo.txt",true);
fos.write(98);
byte[] bys = "abcde".getBytes(StandardCharsets.UTF_8);
fos.write(bys);
fos.write(bys,1,3);
fos.close();
}
}

如果想换行,则需要输入

文件名.write("\n".getBytes())

在ASCII码中,换行符为10

finally

在异常处理时提供finally块来执行所有清除操作,比如IO流中的释放资源

字节流读数据

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./My_File/demo.txt");
int by;
while((by=fis.read())!=-1){
System.out.print((char)by);
}
}
}

字节流复制文件

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("My_File/demo.txt");
FileOutputStream fos = new FileOutputStream("My_File/src/demo6/demo.txt");
int by;
while((by=fis.read())!=-1){
fos.write(by);
}
}
}

字节数组读数据

import java.io.FileInputStream;
import java.io.IOException; public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("My_File/src/demo7/hello.txt");
byte [] bys = new byte[5];
// byte [] bys = new byte[20];
int len = fis.read(bys);
System.out.println("第一次读取情况:");
System.out.println(len);
// System.out.println(new String(bys));
System.out.println(new String(bys,0,len));
len = fis.read(bys);
System.out.println("第二次读取情况:");
System.out.println(len);
// System.out.println(new String(bys));
System.out.println(new String(bys,0,len));
len = fis.read(bys);
System.out.println("第三次读取情况:");
System.out.println(len);
// System.out.println(new String(bys));
System.out.println(new String(bys,0,len));
}
}

实际上用字节数组读数据为改进的代码:

import java.io.FileInputStream;
import java.io.IOException; public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("My_File/demo.txt");
byte [] bys = new byte[1024];
int read;
while((read=fis.read(bys))!=-1){
System.out.println(new String(bys,0,read));
}
}
}

注意,如果是直接读,返回的是读出的值,int类型

如果是读字节,那么把读出的数据存储到byte中,返回的是读出的长度,int类型

复制图片:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("My_File/src/demo9/mn.jpg");
FileInputStream fis = new FileInputStream("mn.jpg");
byte [] bys = new byte[1024];
int len;
while((len=fis.read(bys))!=-1){
fos.write(bys);
}
fis.close();
fos.close();
}
}

字节缓冲流:

字节缓冲输出流可以向底层输出流写入字节,而不必为写入的每个字节导致系统底层的调用

字节缓冲输入流和字节缓冲输出流差不多,都是为了提高效率的

import java.io.*;
import java.nio.charset.StandardCharsets; public class Demo {
public static void main(String[] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("My_File/src/demo10/demo.txt"));
bos.write("Hello".getBytes(StandardCharsets.UTF_8));
bos.write(97);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("My_File/src/demo10/demo.txt"));
byte [] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
bis.close();
bos.close();
}
}

如果像我这样写,是不会有输出的,因为先写,并且都还没关闭文件,也就是还没结束写的过程就去读,是不会有结果的,可以把bos.close()放到bis开始前

为什么有字符流,因为例如汉字之类的可能直接输出会出现乱码

// My_File/demo.txt文件中有汉字
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets; public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("My_File/demo.txt");
// 读方法一
/*
int read;
while((read = fis.read())!=-1){
System.out.println((char)read);
}
*/
// 读方法二
byte [] bys = new byte[1024];
int len;
while((len=fis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
fis.close();
}
}

用方法一即一个字节一个字节读取会出现乱码,而用字节数组则不会有这样的问题

字符流=字节流+编码表

上述过程包含了解码问题,new String的时候按照默认的UTF-8进行了解码

对上述代码换成字符流进行读取

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; public class DemoModify {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("My_File/demo.txt"));
int ch;
while((ch=isr.read())!=-1){
System.out.print((char)ch);
}
}
}

同样是读read(),但是前面的字节流会乱码,而字符流不会

这时因为字符流中的read一次读一个字符,而默认的UTF-8是一个字符对应3个字节(汉字),然后解码出来就是正常的汉字

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter; public class Test {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test.txt"));
osw.write(97);
// 如果使用了close,那么不需要使用flush
osw.flush();
osw.close();
}
}

字符流复制文件

import java.io.*;

public class Demo {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("My_File/src/demo12/Test.java"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("My_File/src/demo13/Test.java"));
// 一次读一个字符
/*
int len;
while((len=isr.read())!=-1){
osw.write(len);
}
*/
// 一次读一个字符数组
char [] ch = new char[1024];
int len;
while((len=isr.read(ch))!=-1){
osw.write(ch,0,len);
}
isr.close();
osw.close();
}
}

在上面介绍的字符流中,InputStreamReaderOutputStreamWriter有编码解码功能,其子类FileReaderFileWriter没有这两个功能,但是简洁很多,而且构造方法中,不用传入InputStreamOutputStream,可以直接传入字符串或者文件

字符缓冲流

  • BufferedWriter(writer out)
  • BufferedReader(Reader in)

字符缓冲流特有功能

  • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
  • public String readLine():读一行文字,结果包含行的内容的字符串,不包括任何终止字符,如果到达结尾,则为null

用自己的话对文件内容小结:

  • 首先是File类,File类创建的是一个文件对象,可以进行createNewFilemkdirmkdirs,并且还有listlistFilesisDirectorygetName等函数
  • 然后是字节流,字节流中,可以直接传入文件名的字符串,这样write时会自动创建文件
  • 字节流中,可以一次读一个字节,或者一次读一个字节数组,读字节数组时,建议输出时加上0,len这样的内容,不然会出现空值
  • 字节流每次调用都会使用系统底层的东西,建议使用缓冲字节流,缓冲字节流创建时是stream类型的,要注意下
  • 接着是字符流,字符流是字节流+编码方式,当然也可以继续用字节流中的字节数组读取,这样会有解码,也可以使用字符流,但是注意构造方法传入的参数,FileReaderFileWriter都可以直接传入字符串

复制单级文件夹

import java.io.*;

public class Demo {
public static void main(String[] args) throws IOException {
// 将My_File/src/demo7文件复制到D:Java_Content中,如果不存在文件夹则创建
File src_file = new File("My_File/src/demo7");
String src_fileName = src_file.getName();
File dest_File = new File("D:/Java_Content",src_fileName);
dest_File.mkdirs();
File[] src_files = src_file.listFiles();
for(File file:src_files){
String fileName = file.getName();
File dest_file = new File(dest_File,fileName);
copyFile(file,dest_file);
}
} private static void copyFile(File file, File dest_file) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest_file));
byte [] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
}
}

复制多级文件

import java.io.*;

public class Demo {
public static void main(String[] args) throws IOException {
// 将My_Set文件夹复制到D盘
File src_folder = new File("My_Set");
File dest_folder = new File("d:");
copyFolder(src_folder,dest_folder);
} private static void copyFolder(File src_folder, File dest_folder) throws IOException {
if(src_folder.isDirectory()){
String src_folderName = src_folder.getName();
File new_folder = new File(dest_folder,src_folderName);
if(!new_folder.exists()){
new_folder.mkdirs();
}
File[] listFiles = src_folder.listFiles();
for(File file:listFiles){
copyFolder(file,new_folder);
}
}else{
File dest_file = new File(dest_folder,src_folder.getName());
copyContent(src_folder,dest_file);
}
} private static void copyContent(File src_folder, File dest_file) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src_folder));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest_file));
byte [] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
}

Java学习笔记-基础语法Ⅸ-文件的更多相关文章

  1. Java学习笔记-基础语法Ⅳ

    多态:同一个对象,在不同时刻表现出来的不同形态 例如: 猫 cat = new 猫(); 动物 animal = new 猫(); 这里的猫在不同时刻表现出来不同的形态,这就是多态 多态的前提和体现: ...

  2. Java学习笔记-基础语法

    Java基础包含关键字,标识符,注释,常量和变量,运算符 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 Java的关键字 用于定义数据类型的关键 ...

  3. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  4. JAVA 学习笔记 - 基础语法1

    1. 类的定义 public class  与  class的区别 一个java文件只有一个public class, 而且类名必须与文件名一致. 一个java文件可以有多个class定义,javac ...

  5. Java学习笔记-基础语法ⅩⅠ-UDP、TCP

    网络编程 三要素:IP地址.端口.协议 IP地址:使用ipconfig查看,如果装了VM的话,会有VMnet1.VMnet8和WLAN,net1不能从虚拟机到主机,net8不能从主机到虚拟机,net0 ...

  6. Java学习笔记-基础语法Ⅷ-泛型、Map

    泛型 泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类.方法和接口中,分别为泛型类.泛型方法 ...

  7. Java学习笔记-基础语法Ⅴ

    学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...

  8. Java学习笔记-基础语法Ⅲ

    继承:子类使用extends来继承父类,子类可以有父类的内容,还可以有子类自己特有的内容 继承的好处: 提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要 ...

  9. JAVA 学习笔记 - 基础语法 2

    ---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null;             //在堆栈中申明变量名称 数组名称 =  new  数据类型[10];       // ...

随机推荐

  1. docker 容器简单使用

    文章目录 docker简介 docker容器简单使用 1.HelloWorld 2.运行交互式的容器 3.启动容器(后台模式) 安装docker容器的博文有很多这里就不做过多赘述了,另外如果不想安装d ...

  2. 安装Backstage.io应用

    Backstage介绍 What's Backstage? Backstage is an open platform for building developer portals. Powered ...

  3. About HTML

    HTML 简介 HTML 历史 最初的 HTMl 是由 CERN负责制定的,后来转交给 IETF. 在 1990-1995 年期间, HTML 经历了许多次的版本修改与扩充: 1995 年的时候 HT ...

  4. Mac 安装WordPress

    Mac 安装WordPress 一.环境要求 PHP 5.2.4或更新版本 MySQL 5.0或更新版本 WebServer(可以选择Apache.nginx等支持PHP的,这里我选择Apache) ...

  5. 深入理解ES6之《扩展对象》

    属性初始值的简写 当对象字面量只有一个属性的名称时,JS引擎会在可访问作用域中查找其同名变量:如果找到则该变量的值被赋给对象字面量里的同名属性 function createPerson(name, ...

  6. onActivityResult执行两次问题

    差点被坑死 记一次onActivityResult被调用两次的坑

  7. AcWing 1222. 密码脱落

    题目链接 题目描述: X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于 ...

  8. DRF-认证权限频率

    目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...

  9. Django框架中settings.py注释

    1 # coding:utf8 2 """ 3 Django settings for DjangoTest project. 4 5 Generated by 'dja ...

  10. JAVA 进程线程详解

    线程和进程 一.进程 进程是指运行中的程序,比如我们使用QQ,就启动该进程分配内存空间. 进程是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:有它自升的产生,存在和消亡的过程 二.线程 ...