目录
1.File:
File类的创建方法:
public static void main(String[] args) {
//File对象的创建
//File(String pathname)
// 在java中, \ 代表转义字符
File f1 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb\\cc.txt");
System.out.println(f1);
File f2 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb");
System.out.println(f2);
//File(String parent,String child)
File f3 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb","cc.txt");
System.out.println(f3);
//File(File parent,String child)
File f4 = new File(f2,"cc.txt");
System.out.println(f4);
File f5 = new File("C:\\Users\\Administrator\\Desktop\\aa\\xx");
System.out.println(f5);
}
绝对路径: 以磁盘符开头
相对路径:不以磁盘符开头,相对于当前工程
获取Flie对象基本信息:
public static void main(String[] args) {
File f1 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb");
//exists():判断是否存在
System.out.println(f1.exists());
//isFile(): 判断是否是文件
System.out.println(f1.isFile());
//isDirectory(): 判断是不是文件夹
System.out.println(f1.isDirectory());
//getName(): 获取文件的名称或者文件夹的名称
System.out.println(f1.getName());
//length(): 获取文件的大小, 1.获取字节个数 2.只能获取文件的大小,不能获取文件夹的大小
System.out.println(f1.length());
//lastModified(): 获取最后一次修改时间
//时间: 1970年1月1日0时0分0秒(UTC时间)
System.out.println(f1.lastModified());//1731548215290,相对于时间原点的毫秒数
//getPath(): 获取创建对象时,在构造方法中传递的路径
System.out.println(f1.getPath());
//getAbslutePath(): 获取绝对路径, 以磁盘符开始
System.out.println(f1.getAbsolutePath());
//相对路径和绝对路径
/*
绝对路径: 以磁盘符 为开头的路径
相对路径: 不以磁盘符 为开头的路径, 在IDEA中, 如果一个路径不以磁盘付开始,那么相对于 当前的工程(Project)路径
*/
File f2 = new File("aa");
System.out.println(f2.getPath());
System.out.println(f2.getAbsolutePath());
}
File创建或删除 文件或文件夹:
注意:delete只能删除 文件或者空文件夹
File类对象的遍历方法:
listFiles()返回值为 数据类型为File类的数组
2.字符集:
UTF-8编码方式:
汉字在 utf-8 编码方式中占3个字节 在GBK编码方式中占2个字节
对字符的编码和解码:
汉字在 utf-8 编码方式中占3个字节 在GBK编码方式中占两个字节
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "a中b";
//编码 getBytes(): 使用平台(IDEA)默认编码方式(UTF-8), getBytes(String charsetName): 使用指定编码方式
byte[] bys1 = str.getBytes();
System.out.println(Arrays.toString(bys1));//[97, -28, -72, -83, 98]
byte[] bys2 = str.getBytes("GBK");
System.out.println(Arrays.toString(bys2));//[97, -42, -48, 98]
//解码 String(byte[] bys): 使用平台(IDEA)默认编码方式(UTF-8), String(byte[] bys,String charsetName): 使用指定编码方式
byte[] bys3 = {97, -28, -72, -83, 98};
//String result1 = new String(bys3);
//String result1 = new String(bys3,"UTF-8");
String result1 = new String(bys3,"GBK");//a涓璪 乱码
System.out.println(result1);
}
构造方法的参数为 指定的编码格式
构造器参数也为用指定的格式解码
字符串的构造方法中只能传两个数组 一个是字符数组返回值为 把字符都链接在一起的字符串
另一个是byte类型数组 会返回一个解码之后字符串
3.IO流:
作用: 读写文件(网络)数据
IO流的分类:
文件字节输入流:
FileInputStream类的构造器 可以传文件对象 和 路径名 注意只能操作文件
注意: read()空参 返回读取字节 没有发现数据返回-1
read(数组)返回读取了多少个字节 数组中没有读取任何到数据返回-1
offest 为读取数组的起始位置 len为读取数组中元素的个数
文件字节输出流:
构造器中如果文件不存在会创建一个新的文件
注意 append 为true是追加文件数据 默认为false 替换当前文件的所有数据
write空参构造为写入一个字节a
public static void main(String[] args) {
//文件赋值案例
//需求: 把 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 复制到 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg
InputStream is = null;
OutputStream os = null;
try{
//1.创建字节输入流, 关联C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 文件
is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly.jpg");
//2.创建字节输出流, 关联C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg 文件
os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly2.jpg");
//3.使用字节输入流读取数据
byte[] bys = new byte[1024];//1024及其整数倍,<=8192
int len = -1;//记录有效字节个数
while ((len = is.read(bys))!=-1){
//4.把读取到的数据写入到目标文件中
os.write(bys,0,len);
}
}catch (Exception e){
System.out.println("出错辣~~~~");
}finally {
//释放资源
//做非空判断,确保关联资源了,才释放
if (is!=null){
try {
is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (os!=null){
try {
os.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
此为文件复制的完整流程 如果指针为空不应该让其执行close语句
如果执行到try中报错语句则不继续执行try之后的语句
不用throws而用try-catch处理编译器异常的原因为 不能让程序停止执行 如果throws给jvm会停止程序运行并打印错误信息
资源释放的方案:
jdk7以前的方案 在finally中 .close
jdk7 以后:用try—with—resource
以下为改进之后的代码:
public static void main(String[] args) {
//文件赋值案例
//需求: 把 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 复制到 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg
//不管报不报错, jvm会自动的帮你释放资源
//AutoClosable: 接口,用于标识某个对象是 可自动关闭的对象
try (
//String s1 = "abc"; 会报错
InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly.jpg");
OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly2.jpg");
) {
//int i = 1/0;
//3.使用字节输入流读取数据
byte[] bys = new byte[1024];//1024及其整数倍,<=8192
int len = -1;//记录有效字节个数
while ((len = is.read(bys)) != -1) {
//4.把读取到的数据写入到目标文件中
os.write(bys, 0, len);
}
} catch (Exception e) {
System.out.println("出错辣~~~~");
}
}
字符输入流:
使用字节流操作字符不方便
字符流 = 字节流+编码方式
public static void main(String[] args) throws IOException {
//需求: 需要把出师表复制一份到出师表2
//1.构建一个字符输入流用于读取数据
InputStream in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day05\\资料\\出师表.txt");
String charsetName = "UTF-8";
Reader r = new InputStreamReader(in, charsetName);
//2.构建一个字符输出流用于写数据
OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day05\\资料\\出师表2.txt");
Writer w = new OutputStreamWriter(os, charsetName);
//3.循环读写
char[] chs = new char[1024];
int len = -1;
while ((len = r.read(chs)) != -1) {
//把字符数组中的有效字符转化成字符串
String str = new String(chs, 0, len);
//把字符串写出去
w.write(str);
w.flush();//把数据刷入到文件中
}
//4.释放资源
r.close();
w.close();
}
字符输出流:
在文件字符输出流的构造方法中加上ture可以做到在 文件中 用字符输出流中续写文件
public static void main(String[] args) throws IOException {
//构建字节输出流对象和编码方式
OutputStream os = new FileOutputStream("aa\\d.txt");
//使用平台默认的编码方式
Writer w = new OutputStreamWriter(os);
//调用方法,写出数据 写出一首诗
w.write("床秦明月光");
//需要往文件中写一个换行符号: windows: \r\n, mac: \r, linux: \n
w.write("\r\n");
w.write("疑是地上霜");
w.write("\r\n");
w.write("举头望明月\r\n");
//w.write("\r\n");
w.write("低头思故乡");
//释放资源
w.close();
}
flush 和 close 的区别(重要):
共同点: 把内存的数据刷入到 文件/硬盘中
不同点: flush 调用后流可以继续使用 close调用后不能再使用
缓冲流:
缓冲字节输入流:
读写的方法和 字符输入/输出流都一样
缓冲字符输入流:
注意:readLine()和 newLine()为 缓冲字符输入输出流中新增的功能
缓冲字符输出流:
newLine的作用仅为换行
剩下的方法和 字符输出流一样: