Java基础(10)——基本文件输入输出流
2020-04-17 本文已影响0人
让时间走12138
本节内容
1.文件简介和创建
2.文件类型和过滤
3.输入输出流
4.图片读取并写入
5.图片和文本读取和写入
一、文件简介和创建
1.文件:数据在磁盘的唯一最小描述,也就是说上层应用程序只能通过文件来操作磁盘上的数据。文件也是操作系统和磁盘数据交互的一个最小单元。
2.文件也可以叫作目录、文件。可以是虚拟的,也可以是真实存在的。
3.文件的基本操作:①创建文件/目录(文件夹) ②判断文件/目录是否存在 ③写入数据 ④删除
注:new file并不会创建一个文件,如果需要创建,那么就使用.createNewFile()函数。这个过程可能会出现异常,所以我们需要使用try-catch函数接受异常
①以下为创建一个文件的具体代码
//1.让File指向一个指定的文件,(存在/不存在)都有文件名
File file =new File("C:\\Users\\86178\\Desktop\\1.txt");
//2.判断文件或者目录是否存在
if( file.exists()){
//3.创建文件
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
以下为创建一个目录的代码,床架目录调用.mkdir()函数。
File file = new File("C:\\Users\\86178\\Desktop", "file");
if (file.exists()) {
return;
}
try {
//创建目录
file.mkdir();
} catch (NullPointerException e) {
e.printStackTrace();
}
④以下为删除一个文件的具体代码
File parent = new File("C:\\Users\\86178\\Desktop");
File file = new File(parent,"file");
if(file.exists()){
file.delete();
}
③写入数据:File没有具体读取和写入数据的方法,数据的读取和写入通过I/O流来操作(具体见 第三、输入输出流)
二、文件类型和过滤
1.file有一个isDirectory()方法判断它是不是目录,还有一个isFile()方法判断它是不是普通的文件
//判断是文件还是目录
if(file.isDirectory()){
System.out.println("是目录 文件夹");
}
if(file.isFile()){
System.out.println("是普通的文件");
}
2.file使用没有参数的list()方法可以查看当前文件的所有内容
//查看当前文件的所有内容
String[] filePathList= file.list();
for(String name:filePathList){
System.out.println(name);
}
3.file使用参数类型为FilenameFilter的list()方法时,可以起到文件过滤的作用。我们一般使用匿名内部类,直接在()里面new一个FilenameFilter对象,这个时候会自动弹出一个accept()方法,它是boolean类型的,如果返回true,当前这个文件会被过滤出来。如果返回false,当前文件会被放弃。
String[] filePathList= file.list(new FilenameFilter() {
@Override
public boolean accept(File file, String s) {
//如果返回true 当前这个文件会被过滤出来
//如果返回false 当前文件会被放弃
File f =new File(file,s);
if(f.exists()){
return true;
}
return false;
}
});
4.通过listFiles()方法,然后再调用getAbsoluteFile()方法可以获取当前文件的路径
File[] files= file.listFiles();
for(File f:files){
System.out.println(f.getAbsoluteFile());
}
三、输入输出流
1.I /O流:输入流 ,输出流
2.方向:相对的,相对于内存—运行的程序—进程来说的
3.输出流:从内存里读到外部(硬盘,网络,外部设备)
4.输入流:从外部(硬盘,网络,外部设备)到内存
5.数据的存储形式有两种:①二进制形式存储(图片,视频,音频,exe)②字符的形式存储
6.读取方式:①二进制文件—字节流(一次读取一个字节)②文本文件—字符流(一次读取两个字节)。如果想一打开就能看懂这个文件,那么一般用字符流。反之就用字节流(比如打开一张图片)
7.I/O操作:①字节流,输入流 InputStream ,输出流OutputStream ②字符流,输入流 Reader ,输出流 Writer
8.具体实现类:①字节流,输入流 FileInputStream 输出流 FileOutputStream ②字符流,输入流 FileReader,输出流FileWriter
注意:当使用I/O流时,不需要的资源需要自己手动释放(关闭文件)
例如,以下代码为在文件中写入数据
String des= "C:\\Users\\86178\\Desktop\\1.txt";
//写入需要的数据
String text ="你好啊,老王";
//选择字符流还是字节流
FileWriter fw=null;
try {
//写入的内容是文本,所以是字符流
//把内存的文本写到磁盘,所以是输出流
fw =new FileWriter(des);
//开始写入数据
fw.write(text);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
四、单个字节操作 图片读取并写入
1.单个字节操作,将图片读取到内存中,因为是读到内存,所以为输入流。因为是读取图片,所以为字节流。FileInputStream
2.将内存中的图片数据写入到内存磁盘中,因为是写入磁盘,所以为输出流。因为是图片,所以为字节流。FileOutputStream
3.首先创建对象,因为有可能创建失败,所以需要使用try-catch。
4.然后从输入流里面获取数据,写入到输出流。
5.因为是一个字节一个字节地读取,直到read(无参数)函数的返回值为-1,才读取完毕。在它读取完毕之前,都要将它一个字节一个字节地写出去,所以需要使用while循环
6.注:凡是实现了closeable接口的类,都可以在try()括号内部创建。这样当try代码块执行完毕或者有异常,系统会自动关闭对应的对象。这样就没必要在finally里面写close()函数了
例如,以下代码为将图片复制到另外一个文件中
String des="C:\\Users\\86178\\Desktop\\file\\ad.jpg";
String src ="C:\\Users\\86178\\Desktop\\ad.jpg";
//1.将图片读取到内存中
//输入流,字节流 FileInputStream
//2.将内存中的图片数据写入到内存磁盘中
//输出流,字节流 FileOutputStream
try (FileInputStream fis =new FileInputStream(src);
FileOutputStream fos =new FileOutputStream(des)){
//创建字节输入流对象
//创建字节输出流对象
//从输入流里面获取数据,写入到输出流
int b=0;
while (true){
//read()无参数,是一个字节一个字节读取
b= fis.read();
//判断是否读取完毕 返回值为-1
if (b==-1){
break;
}
//一个字节一个字节地写出去
fos.write(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
五、整个数组操作 图片和文本读取和写入
1.为了使图片的读取速度快一点,我们将对上面的代码进行修改。
2.首先我们不要单个字节操作,就整个数组操作,那么就需要定义一个字节数组,一般大小为1024字节。
3.然后我们可以调用一个System.currentTimeMillis()来记录时间,在程序最前面设置一个,在结尾再设置一个,两个变量相减就是这段代码运行的时间。其他内容与上面的代码基本相同。以下代码为字节输入输出流
String des="C:\\Users\\86178\\Desktop\\file\\ad.jpg";
String src ="C:\\Users\\86178\\Desktop\\ad.jpg";
long start= System.currentTimeMillis();
try (FileInputStream fis =new FileInputStream(src);
FileOutputStream fos =new FileOutputStream(des)){
//定义一个数组用于保存一次性读取的多个数据
byte [] buffer= new byte[1024];
//从输入流里面获取数据,写入到输出流
int len=0;
while (true){
//read()无参数,是一个字节一个字节读取
len= fis.read(buffer);
//判断是否读取完毕 返回值为-1
if (len==-1){
break;
}
//一个字节一个字节地写出去
fos.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
long stop= System.currentTimeMillis();
System.out.println("使用时间为:"+(stop-start));
4.文本读取和写入
①单个字节写入,以下代码为字符输出流
String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
String src ="C:\\Users\\86178\\Desktop\\1.txt";
try (FileReader fr= new FileReader(src);
FileWriter fw =new FileWriter(des);){
while (true){
int ch=fr.read();
if(ch==-1){
break;
}
fw.write(ch);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
②通过数组写入,以下代码也为字符输出流
String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
String src ="C:\\Users\\86178\\Desktop\\1.txt";
char [] buffer =new char[1024];
try (FileReader fr= new FileReader(src);
FileWriter fw =new FileWriter(des);){
while (true){
int len=fr.read(buffer);
if(len==-1){
break;
}
fw.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
欧克儿,以上就为今天的全部内容了,再见!