目录
1. 泛型
2. File对象
3. IO流
1.泛型
1.1 什么是泛型
1、泛型是限制我们的数据类型。
2、为什么要使用泛型?
在未使用泛型时,我们定义集合默认是Object类型,可以放入任何数据类型,但是在使用集合内的数据时,需要强制转换为我们需要的类型,不方便对元素进行其他的操作。
List list = new ArrayList();
list.add("星期一");
list.add("星期二");
list.add("星期三");
String s = (String) list.get(1);//获取元素时需要对其进行强制转换
System.out.println(s);
1.2 怎么去使用泛型
泛型的格式:
List<类型> list = new ArrayList<类型>(); 集合中存储的数据必须是其定义的类型数据,后一个<类型>可以省略不写。也可以只写<>,其默认和前面的类型保持一致
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class Test03 {
public static void main(String[] args) {
List<String> list = new ArrayList();// 集合中只能添加String类型
list.add("星期一");
list.add("星期二");
list.add("星期三");
String s = list.get(1);//不需要对其进行强制转换
System.out.println(s);
HashMap<String,Integer> map = new HashMap<>();
map.put("孙悟空",500);
map.put("猪八戒",400);
Set<String> strings = map.keySet();
System.out.println(strings);
}
}
1.3自己定义泛型
public class 类名<标识,标识,....>{
标识 变量名;
public 标识 方法名(){
}
public void 方法名(标识 参数名){
}
......
}
public class Test04 {
public static void main(String[] args) {
Point p1 = new Point();// 创建对象时未指定泛型类型则默认为Object类型
p1.setX(5);
p1.setY("南偏北30度");
Point<Integer> p2 = new Point<>();//指定为泛型为int类型
p2.setX(5);
p2.setY(5);
p2.show();
// 如果要存储其他类型数据,需要重新new一个对象
Point<String> p3 = new Point<>();
}
}
public class Point<E> {
private E x;
private E y;
public void show(){
System.out.println("x轴坐标为:"+x+";y轴坐标为:"+y);
}
public E getX() {
return x;
}
public void setX(E x) {
this.x = x;
}
public E getY() {
return y;
}
public void setY(E y) {
this.y = y;
}
}
2.File对象
2.1 file的介绍
File类就是当前系统中的文件或者文件夹的抽象表示。通俗的讲就是使用file对象来操控我们电脑系统中的文件或者文件夹。学习File类,就是通过file对象,对系统文件或文件夹的增删改查操作。
2.2 创建file对象
import java.io.File;
import java.io.IOException;
public class Test01 {
public static void main(String[] args) throws IOException {
File file = new File("D:/AAA");// ios和linux系统下分隔符是 /
File file1 = new File("D:\\AAA\\aaa");// window系统对/和\都兼容,第一个 \ 是转义字符
// File.separator:根据当前系统自动获取相应的分隔符
File file2 = new File("D:"+File.separator+"AAA"+File.separator+"bbb");
}
2.3增加操作
File file = new File("D:/AAA/aaa.txt");
file.createNewFile();// 创建相应的文件
File file1 = new File("D:/AAA/bbb");
file1.mkdir();//创建单层目录
File file2 = new File("D:/AAA/BBB/bbb");
file2.mkdir();// 文件名不区分大小写,所以bbb会创建到bbb文件夹内
File file3 = new File("D:/AAA/CCC/bbb");
file3.mkdirs();//创建多层目录
File file4 = new File("D:/AAA/DDD");
file4.createNewFile();
// 创建的不是文件夹,而是文件。会根据调用的不同方法,创建不同类型的文件
2.4删除操作
// 删除操作
File file = new File("D:/AAA/aaa.txt");
file.delete();// 删除文件。当删除文件夹时,如果文件夹内还有文件,delete删除不掉文件夹
File file1 = new File("D:/AAA/DDD");
file1.deleteOnExit();// 当程序执行完毕退出后删除文件
Thread.sleep(5000);// 休眠五秒
2.5 修改操作
// 修改操作
File file = new File("D:/AAA/aaa.txt");
file.createNewFile();
file.setReadable(false);//设置文件为不能读
file.setWritable(false);// 设置文件为不能写入
file.setReadOnly();//设置文件为只读
file.renameTo(new File("D:/AAA/bbb.txt"));// 重命名
2.6 查询操作
// 查询操作
File file = new File("D:/AAA/CCC/bbb/a.txt");
String name = file.getName();// 获得文件名称
System.out.println("name:"+name);
String parent = file.getParent();// 获得父级路径名称
System.out.println("parent:"+parent);
String path = file.getPath();// 获得文件路径名
System.out.println("path:"+path);
boolean file1 = file.isFile();// 判断文件对象是否为文件类型,以布尔值返回
System.out.println(file1);
boolean file2 = file.isDirectory();// 判断是否为目录类型
System.out.println(file2);
File file3 = new File("D:/AAA");
String[] list = file3.list();//列出该目录下所有子文件的名称
System.out.println(Arrays.toString(list));
File[] files = file3.listFiles();// 列出该目录下所有的文件对象
for(File f:files){
System.out.println(f.toString());
}
经典题目:显示指定目录下的所有文件
import java.io.File;
public class Test02 {
public static void main(String[] args) {
showAllFiles("D:/AAA");
}
public static void showAllFiles(String path){
//根据接收的路径创建文件对象
File file = new File(path);
// 判断该文件是否存在或者是否是目录
if(!file.isDirectory() || !file.exists()){
return;
}
// 列出该目录下所有的文件对象
File[] files = file.listFiles();
// 遍历数组
for (File f:files){
if(f.isDirectory()){
System.out.println(f.getPath()+" <Dir>");// 显示AAA下的目录文件
showAllFiles(f.getPath()); //循环调用,查找所有目录
}else {
System.out.println(f.getPath()+" ");
}
}
}
}
3 IO流
1、IO是什么?
I:input 输入 O:output 输出
2、IO的作用:对文件内容进行操作
输入:读操作,获得文件内容 输出:写操作,向文件内写入内容
3、IO流的分类:
(1)根据流的方向:
输入流:程序可以读取数据的流
输出流:程序可以写入数据的流
(2)根据流的单位:
字节流: 以字节为单位传输数据的流字符流: 以字符为单位传输数据的流
(3)根据功能
节点流: 直接和文件进行交互
处理流: 不是直接作用在文件上。四个基本的流: 其他的流都是在这四个流的基础上进行扩展的
字节输入流
字节输出流
字符输入流
字符输出流
3.1 Writer字符输出流
Writer字符输出流是所有字符输出流的根类,我们通常使用其中的FileWriter类:
mport java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test05 {
public static void main(String[] args) throws IOException {
// 字符输出流 -->指定文件进行操作
Writer writer = new FileWriter("D:/AAA/d.txt");
String str = "今天天气不错!";
writer.write(str);
writer.flush();// 刷新流
writer.close(); // 关闭流资源
}
}
上面每次往文件中写内容关闭文件后,再次写入内容就会把原来的内容覆盖掉。 想要保留文档中原有内容,只需要在将 Writer writer = new FileWriter(“D:/AAA/d.txt”) 改为 Writer writer = new FileWriter(“D:/AAA/d.txt”,true);
3.2Reader字符输入流
Reader字符输入流是所有字符输入流的根类 它的实现类有很多,我们使用FileReader实现类
mport java.io.FileReader;
import java.io.Reader;
public class Test06 {
public static void main(String[] args) throws Exception {
// 创建字符输入流对象,读取指定文件内的内容
Reader reader = new FileReader("D:/AAA/d.txt");
int count = 0;// 记录读取字符的个数
char[] cs = new char[10]; // 将每次读取10个字符,并将读取到的内容存入cs数组中
while ((count = reader.read(cs))!=-1){ //每次读取完后,会记录此次读取的结束位置,下次在读取时,会在上次结束的位置开始读取内容。当读取完所有内容后,会返回-1
String str = new String(cs,0,count);// 从cs数组中读取内容,从0开始,到count结束
System.out.println(str);
}
}
}
符的个数
char[] cs = new char[10]; // 将每次读取10个字符,并将读取到的内容存入cs数组中
while ((count = reader.read(cs))!=-1){ //每次读取完后,会记录此次读取的结束位置,下次在读取时,会在上次结束的位置开始读取内容。当读取完所有内容后,会返回-1
String str = new String(cs,0,count);// 从cs数组中读取内容,从0开始,到count结束
System.out.println(str);
}
}
}