今日内容
1.复习
2.IO
3.Hutool
4.Idea会导jar包
一、File[熟悉]
1.1 介绍
文件和目录(文件夹) 路径名的抽象表示形式。
即使用路径来表示一个文件或者一个文件夹对象
路径:
- 相对路径,相对于当前项目的项目名下
- 绝对路径,按照磁盘来确定
1.2 构造方法
- File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
// 通过路径创建文件对象
File f1 = new File("a.txt");// 相对路径,相对于当前项目
System.out.println(f1 );
File f2 = new File("E:\\a.txt");// 绝对路径
File f3 = new File("E:/b.txt");// 绝对路径
1.3方法
- boolean createNewFile() 当且仅当不存在此路径名表示的
文件
时,创建一个新的空文件。- boolean mkdir()
创建
此抽象路径名指定的目录/文件夹
。- boolean mkdirs()
创建多层级的文件夹
。- boolean exists() 判断文件或目录是否存在。
- boolean delete() 删除文件或者空文件夹
- **String getAbsolutePath() **返回以绝对路径代表文件路径字符串
public static void main(String[] args) throws IOException {
// 通过路径创建文件对象
File f1 = new File("a.txt");// 相对路径,相对于当前项目
System.out.println(f1 );
File f2 = new File("E:\\a.txt");// 绝对路径
File f3 = new File("E:/b.txt");// 绝对路径
// 判断文件对象是否存在
// boolean exists = f2.exists( );
// System.out.println(exists );
if (!f3.exists( )){
// 如果文件不存在,就创建文件
boolean newFile = f3.createNewFile( );
System.out.println("创建文件"+newFile );
}
File f4 = new File("a");
// 创建单层文件夹
boolean mkdir = f4.mkdir( );// make directory
System.out.println("创建文件夹:" + mkdir );
// 创建多层文件夹
File f5 = new File("b/c/d");
boolean mkdirs = f5.mkdirs( );
System.out.println("创建多层文件夹:" + mkdirs );
// 删除文件
File f6 = new File("a.txt");
boolean delete = f6.delete( );
System.out.println("删除是否成功:" + delete );
// 只能删除空文件夹
File f7 = new File("a");
boolean delete1 = f7.delete( );
System.out.println("删除单层文件夹:" + delete1 );
// 只能删除空文件夹
File f8 = new File("b");
boolean delete2 = f8.delete( );
System.out.println("删除多层文件夹:" + delete2 );
// 获得文件绝对路径
File f9 = new File("a.txt");
String path = f9.getAbsolutePath( );
System.out.println(path );
}
二、IO流
2.1 介绍
流的概念:
在程序中,数据需要传输(移动),⽐如磁盘上的数据需要出现在显⽰器上,就需要进⾏数据传输。 在Java中进⾏数据传输的技术就是“流”.
IO - Input & Output - 输入 & 输出
IO按操作文件的类型分类
- 字节流
- 字节输入流
- 字节输出流
- 字符流
- 字符输入流
- 字符输出流
IO按方向分类
- 输入流
- 输出流
2.2 字节流
2.2.1FileInputStream
FileInputStream
用于读取诸如图像数据之类的原始字节流(二进制文件,例如图片,音频,视频等)
构造方法
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
方法
- int read() 一次读取一个字节
- void close() 关流
public static void main(String[] args) {
// 使用try-catch完成 读取a.txt中的数据
FileInputStream f = null;
try{
f = new FileInputStream("a.txt");
int i = -1;
while((i = f.read()) != -1){
System.out.println(i );
}
} catch (Exception e){
System.out.println("出错了" );
e.printStackTrace();
} finally {
try {
f.close( );
} catch (IOException e) {
e.printStackTrace( );
}
}
}
2.2.2 FileOutputStream
FileOutputStream是文件输出流,用于将数据写入
File
适合用于写入诸如图像数据之类的原始字节的流(二进制)
构造方法
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
方法
- void write(int b) 将指定字节写入此文件输出流。
- void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
public static void main(String[] args) throws IOException {
/**
* 跟读取数据不一样,读取数据时没有该文件会报错
* 但是现在写出数据,没有该文件,它会自动创建出来
* -----------------------------------------
* 如果该文件以前有内容,这样直接写,是覆盖直接的内容
* -----------------------------------------
* 如果想要对该文件实现追加内容,就需要构造方法中设置第二个参数为true
*/
// 创建对象
//FileOutputStream fos = new FileOutputStream("b.txt");
FileOutputStream fos = new FileOutputStream("b.txt",true);
// 写入一个字节
fos.write(65);
fos.write(67);
// 关流
fos.close();
}
2.3 练习: 拷贝图片
将D:\justdoit.jpg图片拷贝一份到E:\jiushigan.jpg
思路: 从d盘读取,写到e盘
// 边读边写
public static void copy() throws IOException {
FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
FileOutputStream fos = new FileOututStream("D:\\jiushigan.jpg");
int a = -1;
while((a = fis.read()) != -1) {
fos.write(a);
}
fis.close();
fos.close();
}
2.4 缓冲字节流
通过拷贝大文件,发现读写很慢!
为什么? 是因为读写都是一次读一个字节,写一个字节,文件很多,就需要几百万次读写…
怎么提高速度? 一次读取多个,写多个就会块 —> 缓冲字节流
所谓缓冲字节流,其实对原来的字节流做了包装,内部有个缓冲区,即就是一个数组,长度8192,即使用缓冲区字节流,就相当于一次读8192,写8192
FileInputStream —> 包装成BufferedInputStream
FileOutputStream --> 包装成 BufferedOutputStream
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis( );
// 创建字节输入流
FileInputStream fis = new FileInputStream("D:\\taotie2.png");
// 将其包装成缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
// 创建字节输出流
FileOutputStream fos = new FileOutputStream("E:\\taotie.png");
// 将其包装成缓冲流
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 需要缓冲流在读写
int i = -1;
while((i = bis.read()) != -1){
bos.write(i);
}
bis.close();
bos.close();
long end = System.currentTimeMillis( );
System.out.println(" 耗时: "+(end - begin) );
}
2.5 字符流
字节流适合读取二进制文件,读取字符数据可能会乱码!
建议读取字符,采用字符流!
字符流有两个抽象父类
- Reader (字符输入流 )
- Writer (字符输出流)
一般使用其子类
- FileReader 字符输入流
- FileWriter 字符输出流
- 默认缓冲区 1024,写出时要关流,如果不关流最后一点数据达不到数组大小就不会写出,此时就需要强制刷新flush
2.5.1 FileReader
构造方法
- FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
方法
- int read() 读取单个字符。
读完末尾返回-1
- void close() 关闭该流并释放与之关联的所有资源。
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("a.txt");
int a = -1;
while ((a = fr.read()) != -1) {
System.out.println((char)a );
}
fr.close();
}
2.5.2 FileWriter
FileWriter在创建时,内部默认构造一个缓冲数组,用于一次写出多个,大小是1024字节
构造方法
- FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
- FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
append指定成true,在原文件后面追加,指定成false,覆盖原文件
如果不知道,默认就是false
方法
- void close() 关闭此流,但要先刷新它。
- void write(char[] cbuf) 写入字符数组。
- void write(int c) 写入单个字符。
- void write(String str) 写入字符串。
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("d.txt");
// 写出一个字符
fw.write(97);
// 写出一个字符数组
fw.write(new char[]{'我','爱','学'});
// 写出一个字符串
fw.write("我爱java");
// 写出字符串中的部分数据
fw.write("javabigdata",4,3);
fw.close();
}
2.6 练习 复制小说
踹凯吃完成
public static void copyText() {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("E:\\三体.txt");
fw = new FileWriter("E:\\三体copy.txt");
int a = -1;
while((a = fr.read()) != -1) {
fw.write(a);
}
} catch(Exception e) {
System.out.println("出错了" + e.getMessage());
} finally {
try{
fr.close();
fw.close();
}catch(Exception e){
System.out.println("出错了" + e.getMessage());
}
}
}
2.7 缓冲字符流
自学
2.8 总结
IO今天学的这些,以后不会直接这么用的…
学的就是一个思想: 读写的思想,要知道数据如何在程序和磁盘之间传输的
学到一些数据传输的方式: 按字节传输或者按字符串传输,或者使用缓冲区提高传输速度
学到一种代码写法: try-catch-finally
三、Hutool
Hutool 万能工具包
API网站: Overview (hutool - Gitee.com))
文件工具类 - FileUtil
IO工具类 - IoUtil
public static void main(String[] args) {
// 删除文件/文件夹
// boolean del = FileUtil.del("E:\\2311\\第一组");
// System.out.println(del );
// 改名
// File rename = FileUtil.rename(new File("E:\\2333.txt"), "2311.txt", true);
// System.out.println(rename );
// 加水印
ImgUtil.pressText(//
FileUtil.file("d:/taotie2.png"), //
FileUtil.file("e:/taotie4.png"), //
"版权所有", Color.WHITE, //文字
new Font("黑体", Font.BOLD, 100), //字体
0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
);
BufferedInputStream in = FileUtil.getInputStream("E:\\Angel.mp3");
BufferedOutputStream out = FileUtil.getOutputStream("E:\\ge.mp3");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
System.out.println("-- over --" );
}
四、Idea导入jar包
什么是jar包?
答: 就是java代码打包
为什么要用jar包?
答: 别人写好的一些工具代码,我们项目中需要使用,所以自己的项目就需要加入这些jar包
idea项目中如何加入jar包