JavaSE学习笔记 Day23
JavaSE学习笔记 Day23
个人整理非商业用途,欢迎探讨与指正!!
« 上一篇
文章目录
- JavaSE学习笔记 Day23
- ···
- 十九、流
- 19.1流的概念
- 19.2File类
- 19.2.1File对象的创建
- 19.2.2Java中的路径表示
- 19.2.3File中的常用方法
- 19.2.4FileNameFilter接口
- 19.3IO流
- 19.3.1流的划分
- 19.3.2字节流[重点]
···
十九、流
19.1流的概念
在程序中,数据是需要传输的,例如将磁盘上的数据显示到浏览器上,需要将数据进行传输
java中将数据传输的技术称为"流"
19.2File类
19.2.1File对象的创建
将系统中磁盘上的文件或者文件夹转换为java中的对象
public class Demo01 {
public static void main(String[] args) {
// 将D盘下的IO文件夹创建为java对象
// 文件夹
File file = new File("D:/IO");
// 判断是否存在的方法
System.out.println(file.exists());
// 文件
file = new File("D:/IO/a.txt");
System.out.println(file.exists());
// 分割符可以使用 / 或者 \\(转义字符)
file = new File("D:\\IO\\a.txt");
System.out.println(file.exists());
}
}
19.2.2Java中的路径表示
相对路径:
相对于当前的项目或者工程位置
绝对路径:
在磁盘上的位置
public class Demo02 {
public static void main(String[] args) {
// 绝对路径
File file = new File("D:/IO/a.txt");
System.out.println(file.exists());
// 相对路径
// 以/开头(\\) 表示当前项目的所在磁盘(省略了当前项目的所在磁盘)
// 我的项目在D盘: /省略了D:
File file2 = new File("/IO/a.txt");
System.out.println(file2.exists());
file2 = new File("/02-tools");
System.out.println(file2.exists());
// 不以/开头 针对当前项目的根路径
File file3 = new File("a.txt");
System.out.println(file3.exists());
// 创建IO/c.txt对象
file3 = new File("IO/c.txt");//当前项目中的IO文件夹下的c.txt文件
System.out.println(file3.exists());
// 创建com.qf.test01.Demo02文件对象
file3 = new File("src/com/qf/test01/Demo02.java");
System.out.println(file3.exists());
}
}
19.2.3File中的常用方法
public class Demo03 {
// File的常用方法
public static void main(String[] args) {
File file = new File("IO/d.txt");
// 创建一个文件
try {
// 创建一个文件
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Demo04 {
// 创建文件夹(目录)
// mkdir:创建一个目录,若父级目录不存在,则不创建(只能创建一层目录)
// mkdirs:创建一个目录,若父级目录不存在,则会一起创建(可以创建多层目录)
public static void main(String[] args) {
File file = new File("java");
//
// file.mkdir();
// file.mkdirs();
file = new File("se/io");
// file.mkdir();
file.mkdirs();
}
}
public class Demo05 {
public static void main(String[] args) {
// 删除方法,删除文件或者空目录
File file = new File("a.txt");
file.delete();
file = new File("IO");
// 非空目录无法删除
file.delete();
file = new File("java");
// 空的目录可以删除
file.delete();
file = new File("se");
file.delete();
// 判断目录或者是文件是否存在
System.out.println(file.exists());
// 获取文件或者文件夹的大小
System.out.println(file.length());
System.out.println(new File("b.txt").length());
}
}
public class Demo06 {
public static void main(String[] args) {
File file = new File("IO/c.txt");
// 绝对路径的String格式
System.out.println(file.getAbsolutePath());
// 返回绝对路径 返回值是File
System.out.println(file.getAbsoluteFile());
// 获取文件(夹)的名字
System.out.println(file.getName());
// 获取父目录
System.out.println(file.getParent());
// 判断是否为目录
System.out.println(file.isDirectory());
// 判断是否为文件
System.out.println(file.isFile());
file = new File("D:\\01-classin\\14-qf-jy-2305\\01-java\\03-课堂代码\\workspace_JAVASE\\20231221-25-JavaSE-IO流\\IO\\c.txt");
// 获取路径
System.out.println(file.getPath());
System.out.println("--------------------");
// 获取目录中的所有文件列表 查看D盘下的所有文件和目录
file = new File("D:/");
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
System.out.println(file2);
}
System.out.println("--------------------");
// 可以查看src下的所有内容
file = new File("src/com/qf/test01");
listFiles = file.listFiles();
for (File file2 : listFiles) {
System.out.println(file2);
}
}
}
19.2.4FileNameFilter接口
文件过滤器接口
public class Demo07 {
public static void main(String[] args) {
File file = new File("src/com/qf/test01");
// 对文件进行过滤
// file.listFiles(new MyFilter());
File[] listFiles = file.listFiles(new FilenameFilter() {
// dir当前调用者 name具体的名字
@Override
public boolean accept(File dir, String name) {
// System.out.println(dir+","+name);
// 帮助我们得到想到的文件
return name.startsWith("Test");
}
});
for (File f : listFiles) {
System.out.println(f);
}
}
}
class MyFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return false;
}
}
19.3IO流
文件是内存与存储设备之间的数据传输通道载体,需要借助流进行传输
所有的IO操作都会抛出IOException异常
所有的IO操作需要将资源关闭
19.3.1流的划分
按照方向划分:
输出流:将内存中的内容写入到磁盘中(存进去)
输入流:将存储设备中的内容读入到内存中(拿出来)
按照单位划分:
字节流:以字节为单位,进行所有文件的读与写
字符流:以字符为单位,只可以对文本数据进行读写(字符流是由字节流转换来的)
按照功能划分:
节点流:具有实际数据传输功能的流(实现类)
过滤流:在上述节点流的基础上进行功能的提升
19.3.2字节流[重点]
字节流:
抽象类:
InputStream:字节输入流
读取内容
OutputStream:字节输出流
写入内容
子类:
FileInputStream:文件字节输入流
FileOutputStream:文件字节输出流
public class Demo01 {
// 字节输出流
public static void main(String[] args) throws IOException {
// 创建FileOutputStream对象,可以向参数中的File内去写内容
// 文件可以不存在,第一次写的时候FileOutputStream会创建一个文件
// 若文件存在,直接向对应的文件中写内容
FileOutputStream fos = new FileOutputStream(new File("IO/hello.txt"));
// 写入一个int数据
// 一次写入一个字符
fos.write(97);
fos.write(65);
fos.write(90);
fos.write(94);
// 一次写入一个byte[]
byte[] bs = {97,98,99,100,101};
fos.write(bs);
// 重载方法
// 指定的开始的位置,和长度
fos.write(bs, 2, 3);
System.out.println("写入成功!");
// 所有的流资源都需要关闭
fos.close();
}
}
public class Demo02 {
public static void main(String[] args) throws IOException {
// fos一共有四个构造方法
// 1.通过file创建fos对象
// FileOutputStream fos = new FileOutputStream(new File("IO/hello.txt"));
// 2.通过文件名(String path)创建fos对象
// FileOutputStream fos = new FileOutputStream("IO/hello.txt");
// 3.通过file和string都有一个append重载的构造方法 append的作用是内容的追加
// FileOutputStream fos = new FileOutputStream("IO/hello.txt",true);
FileOutputStream fos = new FileOutputStream(new File("IO/hello.txt"),true);
fos.write(97);
System.out.println("写入成功!");
// 所有的流资源都需要关闭
fos.close();
}
}
public class Demo03 {
public static void main(String[] args) throws IOException {
// 读的文件必须是真实存在的
FileInputStream fis = new FileInputStream("IO/hello.txt");
// 读取内容 读取到结尾返回-1
// 一次读取一个字节
int read = fis.read();
/*System.out.println(read);
read = fis.read();
System.out.println(read);
read = fis.read();
System.out.println(read);
read = fis.read();
System.out.println(read);*/
while(read != -1) {
System.out.print((char)read);
// 再向下读取一次
read = fis.read();
}
fis.close();
}
}
public class Demo04 {
public static void main(String[] args) throws IOException {
// 读的文件必须是真实存在的
FileInputStream fis = new FileInputStream("IO/hello.txt");
// 读取按照byte[]进行读取
// 从流中将内容存储到byte[]中
// 数组的大小是多少都是ok的,一般情况下每次读取文件的大小1kb~4kb(对于字节流读取文件的速度是最快的)
byte[] bs = new byte[1024];//1kb
System.out.println(Arrays.toString(bs));
// 返回值为文件内容的长度
// int a = fis.read(bs);
int a = fis.read(bs, 10, 10);//放到数组中的某个位置 off开始位置,len长度
System.out.println(a);
// byte[]中是有值的
System.out.println(Arrays.toString(bs));
System.out.println(new String(bs,0,a));
fis.close();
}
}