首页 > 编程语言 >Java基础(I/O)

Java基础(I/O)

时间:2024-05-26 17:01:03浏览次数:13  
标签:Java String 基础 File close new public 字节

一、File类

1.1File类概述

I/O(Input/Output)指应用程序对设备的数据输入/输出。负责输入/输出的类都位于java.io包中。

File类中的java.io包是唯一代表磁盘本身文件的对象,定义了一些与平台无关的方法用于操作文件。

常用构造方法如下图。

常用方法如下图。

1.2遍历目录下的文件

File类的list()方法用于遍历指定目录下的所有文件。

提供重载的list(FilenameFilter filter)方法获取指定类型的文件。FilternameFilter是一个接口,称为文件过滤器,当中定义了一个抽象方法accept(File dir,String name)。在调用该方法时需要Filenamefilter,并在accept()方法中作出判断,从而获得指定类型的文件。

eg.

import java.io.File;
import java.io.FilenameFilter;
public class Main{
    public static void main(String[] args)throws Exception{
        File file = new File("D:");
        FilenameFilter filter = new FilenameFilter(){
        //实现accept方法
            public boolean accpet(File dir, String name){
                File currFile = new File(dir,name);
                if(currFile.isFile()&&name.endsWith(".java")){
                    return true;
                }else{
                    return false;
                }
            }
        };
        if(file.exists()){
            String[] names = file.list(filter);
            for(String name : names){
                System.out.println(name);
            }
        }
    }
}

如果想实现得到所有子目录下的File类型对象,需要使用listFiles()。该方法返回一个File对象数组,当对数组中的元素进行遍历时,如果元素中还有子目录遍历则使用递归。

eg.

import java.io.File;
public class Main{
    public static void main(String[] args)throws Exception{
        File file = new File("D:");
        fileDir(file);
    }
    public static void fileDir(File dir){
        File[] files = dir.listFiles();
        for(File file : files){
            if(file.isDirectory()){
                fileDir(file);
            }
        System.out.println(file.getAbsolutePath());
        }
    }
}

1.3删除文件及目录

File类中的delete()方法只能删除一个指定的文件,假如File对象代表目录且包含子目录或文件,则不允许直接删除这个目录,需要使用递归。

eg.

import java.io.File;
public class Main{
    public static void main(String[] args)throws Exception{
        File file = new File("D:");
        deleteDir(file);
    }
    public static void deleteDir(File dir){
        if(dir.exists()){
            File[] files = dir.listFiles();
            for(File file : files){
                if(file.isDirectory()){
                    deleteDir(file);
                }else{
                    file.delete();
                }
            dir.delete;//删除完所有文件后删除目录
            }
        }
    }
}

注意,删除目录是从虚拟机直接删除而不放入回收站,文件一旦删除就无法恢复。

二、字节流

2.1字节流的概念

计算字的所有文件都是以二进制(字节)形式存在的。为字节的输入/输出(I/O)流提供的一系列的流,统称为字节流,根据数据的传输方向可将其分为字节输入流和字节输出流。

JDK中提供了两个抽象类InputStream和OutputStream,他们是字节流的顶级父类,他们不能被实例化,子类结构如下图。

2.2FileInputStream

FileInputStream是InputStream的子类,是操作文件的字节输入流,专门用于读取文件中的数据。

常用方法如下图

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileInputStream in = new FileInputStream("test.txt");
        int b = 0;//定义变量b记住每次读取的一个字节
        while(true){
            b = in.read();
            if(b == -1){
                break;
            }
            System.out.println(b);
        }
        in.close();
    }
}

2.3FileOutputStream

FileOutputStream是InputStream的子类,是操作文件的字节输出流,专门用于把数据写入文件。

常用方法如下图

注意,如果通过FileOutputStream向一个已经存在的文件中写入数据,那么么该文件中的数据首先会被清空再写入新数据。若希望在后面追加新内容,则可以使用FileOutputStream(String fileName, boolean append)来创建文件输出流对象,并把append参数的值设置为true。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileOutputStream out = new FileOutputStream("test.txt",true);
        String str = "123";
        byte b[] = str.getBytes();
        for(int i = 0; i < b.length; i++){
            out.write(b[i]);
        }
        out.close();
    }
}

I/O流进行读写数据时可能发生I/O错误,由Java虚拟机自动封装成I/O Exception异常并抛出。

如果发生I/O错误,则close()方法无法执行,可以用try...finally来保证无论是否发生错误都能正常关闭。

eg.

finally{
    try{
        if(in != null){
            in.close();
        }    
    }catch(Exception e){
        e.printStackTrace();
    }
    try{
        if(out != null){
            out.close();
        }    
    }catch(Exception e){
        e.printStackTrace();
    }
}

2.4文件的复制

文件的复制需要通过输入流来读取文件中的数据,输出流将数据写入文件。

当通过流的方式复制文件时,为了提高效率可以定义一个字节数组作为缓冲区,一次性读取多个字节的数据并保存在字节数组中,然后将字节数组中的数据一次性写入文件。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileInputStream in = new FileInputStream("source.txt",true);
        FileOutputStream out = new FileOutputStream("target.txt",true);
        int len;
        while((len = in.read() != -1){
            out.write(len);
        }
        in.close();
        out.close();
    }
}

I/O提供两个带缓冲的字节流,BufferedInputStream和BufferedOutputStream,他们的构造方法中分别接受InputStream和Outputstream类型的参数作为对象。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        BufferedInputStream bis = new BufferedInputStream("source.txt",true);
        BufferedputStream bos = new BufferedOutputStream("target.txt",true);
        int len;
        while((len = bis.read() != -1){
            bos.write(len);
        }
        bis.close();
        bos.close();
    }
}

三、字符流

3.1字符流的概念

字符流有两个抽象的顶级父类,Reader和Writer,子类结构如下图。

3.2FileReader和FileWriter

FileReader读取文件中的字符。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileReader reader = new FileReader("test.txt");
        int ch;//定义变量b记住每次读取的一个字节
        while((ch = reader.read()) != -1){
            System.out.println((char)ch);
        }
        reader.close();
    }
}

注意,字符输入流的read()方法返回的是int类型的值,如果需要获得字符需要强制类型转换。

FileReader对象返回的字符流是char,InputStream对象返回的字符流是byte,这是两者之间最大的区别。

FileWriter写入字符。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileWriter writer = new FileWriter("test.txt",true);
        String str = "123";
        writer.write(str);
        writer.close();
    }
}

如果指定的文件不存在,则先创建再写入,如果存在,则先清空再写入。

如果想追加内容,则调用重载的构造方法。

3.3BufferedReader和BufferedWriter

包装流是对一个已存在的流进行包装来实现提高数据读写功能效率,字符流提供带缓冲区的包装流BufferedReader和BufferedWriter。

BufferedReader中的方法readLine()用于一次读取一行文本。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileReader reader = new FileReader("src.txt"); 
        BufferedReader br = new BufferedReader(reader);
        FileWriter writer = new FileWriter("des.txt"); 
        BufferedWriter bw = new BufferedWriter(writer);
        String str;
        while((str = br.readLine() != null){
            bw.write(str);
        }
        br.close();
        bw.close();
    }
}

注意,调用BufferedWriter的write()方法写入字符时,字符首先会被写入缓冲区。当缓冲区写满或调用close()方法时,缓冲区中的字符才会被写入目标文件。因此最后一定要调用close()方法,否则很可能导致部分存在缓冲区中的数据未被写入文件。

3.4InputSreamReader和OutputStreamWriter

JDK提供了两个类将字节流转换为字符流。

eg.

import java.io.*;
public class Main{
    public static void main(String[] args)throws Exception{
        FileInputStream in = new FileInputStream("src.txt"); 
        InputStreamReader isr = new InputStreamReader(in);
        FileOutputStream out = new FileOutputStream("des.txt"); 
        OutputStreamWriter osw = new OutputStreamWriter(out);
        int ch;
        while((ch = isr.read() != -1){
            osw.write(ch);
       }
        isr.close();
        osw.close();
    }
}

标签:Java,String,基础,File,close,new,public,字节
From: https://blog.csdn.net/fwputty/article/details/139200111

相关文章

  • Java基础(集合)
    一、集合概述集合:可以存储任意类型的对象,并且长度可变的类集合类位与java.util包中集合类的继承体系如下图。二、Collection接口Collection是所有单列集合的父接口,定义了单列集合通用的一些方法,常用方法如下图。开发中基本使用其子接口。三、List接口3.1List接口简介......
  • java顺序结构,循环结构,选择结构,增强for循环,switch穿透现象,值匹配
    顺序结构inta=10;intb=20;intc=a+b;System.out.println(c);//按顺序执行循环结构一、For循环格式for(初始化语句;循环条件;迭代语句){循环语句体;}for(inti=0;i<5;i++){System.out.println("我爱你");}int[]is={1,2,3};for(inti=0;i<is.l......
  • java数组一篇文章搞定
    Array数组数组(Array) 是一种线性数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。这些数据可以是整数、浮点数、字符、对象等,但必须是同一种类型。数组中的每个数据元素都有一个唯一的索引值,这个索引值通常从0开始,用于访问或修改该元素。数组基本特点:1.长度......
  • Java中的变量分类(按照位置分类)
    变量按位置分通过上面类的建立我们又得到了新的概念:成员变量和局部变量成员变量:可以使用基本数据类型,也可以使用引用数据类型.java中的变量在使用时必须初始化,成员变量可以不对其初始化,系统会对其默认初始化为null或0;成员变量可以在成员方法,构造方法,代码块中使用补:成......
  • Docker Java项目部署
    将你的java项目打包为一个jar包准备Dockerfile文件#设置本镜像需要使用的基础镜像FROMjava:8#把jar包添加到镜像中ADDyylq-ds.jar/app.jar#镜像暴露的端口EXPOSE8199RUNbash-c'touch/app.jar'#容器启动命令ENTRYPOINT["java","-jar","/app.......
  • linux核心基础-权限管理
    1、更改文件的权限命令总结2、文件、目录的的rwx想要删除文件,要看是否有该文件所在目录,目录是否有w权限,才可以删除文件,且还得有x权限,才能进入文件夹。(用普通用户测试)3、环境变量1、env和set命令env命令为单个用户的环境变量命令为系统整体的环境变量[root@muserver1etc]......
  • javaSwing+JDBC+mysql校园跑管理项目(附源码下载)
    1.数据准备DELETEFROMstudents;Deletefromrunning;INSERTINTOstudents(student_id,name,age,major,grade)VALUES(1,'王小明',20,'计算机科学与技术','男'),(2,'张小红',21,'软件工程','女'),(3......
  • 【精简笔记】JavaScript基础内容大总结
    往期文章目录【精简笔记】JavaScript基础内容第一天【精简笔记】JavaScript基础内容第二天【精简笔记】JavaScript基础内容第三天【精简笔记】JavaScript基础内容第四天【精简笔记】JavaScript基础内容第五天文章目录往期文章目录前言一、JavaScript的书写位置1.......
  • JavaScript 新特性:新增声明命令与解构赋值的强大功能
    个人主页:学习前端的小z个人专栏:JavaScript精粹本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论!ES5、ES6介绍文章目录......
  • JavaScript 系列教程 III JavaScript 代码质量
    ......