Java高级编程--输入和输出处理(一)

发布于:2025-08-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

Java高级编程–输入和输出处理

1.Java I/O

在这里插入图片描述

2.文件

2.1什么是文件?

  • 相关记录或放在一起的数据的集合

2.2Java程序如何访问文件属性?

  • JAVA API :java.io.File

2.3File类访问文件属性

在这里插入图片描述

创建File对象

//Windows操作系统
File file=new File("d:\\test.txt");
//Linux操作系统
File file1=new File("d:/test.txt");

2.4File类的常用方法

方法名称 说明
boolean exists( ) 判断文件或目录是否存在
boolean isFile( ) 判断是否是文件
boolean isDirectory( ) 判断是否是目录
String getPath( ) 返回此对象表示的文件的相对路径名
String getAbsolutePath( ) 返回此对象表示的文件的绝对路径名
String getName( ) 返回此对象表示的文件或目录的名称
boolean delete( ) 删除此对象指定的文件或目录
boolean createNewFile( ) 创建名称的空文件,不创建文件夹
long length() 返回文件的长度,单位为字节,如果文件不存在,则返回0L
//将文件封装为一个File类的对象
File file= new File("D:\\2.txt");
System.out.println("文件名称:"+file.getName());
System.out.println("文件绝对路径"+file.getAbsolutePath());
System.out.println("文件相对路径"+file.getPath());
System.out.println("文件大小:"+file.length()+"字节");
System.out.println("文件是否存在:"+file.exists());
System.out.println("文件是否删除:"+file.delete());

3.流

3.1如何读写文件?

  • 通过流来读写文件
    • 流是一组有序的数据序列
    • 以先进先出方式发送信息的通道

在这里插入图片描述

3.2输入/输出流与数据源

在这里插入图片描述

3.3Java流的分类

在这里插入图片描述

注:输入输出流是相对于计算机内存来说的

在这里插入图片描述

注:字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

3.4输入流Input (读取)

InputStream->FilelnputStream(路径|File对象)

  • InputStream类常用方法

    • int read( )
    • int read(byte[] b) read(字节数组)丨read()返回字节
    • int read(byte[] b,int off,int len)
    • void close( ):释放资源
    • int available():可以从输入流中读取的字节数目
  • 子类FileInputStream常用的构造方法

    • FileInputStream(File file)
    • FileInputStream(String name)
  • 使用FileInputStream 读文本文件

在这里插入图片描述

package com.hz.test01;
//引入相关的类
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test2 {
    public static void main(String[] args) throws IOException {
       InputStream fis = null;
        try {
            fis = new FileInputStream("D:\\2.txt");
            byte[] bytes = new byte[fis.available()];
            //读取文本文件的数据
            fis.read(bytes);
            String s = new String(bytes);
            System.out.println(s);
            //关闭文件流对象
            fis.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (fis != null)
                    fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

3.5输出流Output(写入)

OutputStream->FileOutputStream(路径,boolean是否追加)

  • OutputStream类常用方法

    • write(字符串.getBytes(“编码”))写入内容

    • void write(int c)

    • void write(byte[] buf)

    • void write(byte[] b,int off,int len)

    • void close():释放资源

    • void flush():强制把缓冲区的数据写到输出流中

  • 子类FileOutputStream常用的构造方法

  • FileOutputStream (File file)

  • FileOutputStream(String name)

  • FileOutputStream(String name,boolean append)

注:

  1. 前两种构造方法在向文件写数据时将覆盖文件中原有的内容
  2. 创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
  • 使用FileOutputStream 写文本文件
//构造文件输入流FileOutputStream对象
FileOutputStream fos=new FileOutputStream("D:\\test.txt");
String s="Java";
byte[] words=s.getBytes();
//把数据写入文本文件
fos.write(words,0, words.length);
//关闭文件流对象
fos.close();
FileOutputStream fos = null;
      try {
            //true表示追加写入
            fos = new FileOutputStream("D:\\test.txt",true);
            String s = "爱Java";
            //把数据写入文本文件
            fos.write(s.getBytes());
            //把数据写入文本文件
            fos.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (fos != null)
                    fos.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

    }

4.输入流Reader读取

Reader->InputStreamReader(InputStream,编码)->FileReader(路径|File对象)

  • Reader类常用方法
    • int read( )
    • int read(char[] c):字符数组
    • read(char[] c,int off,int len)
    • void close( ):释放资源
  • 子类InputStreamReader常用的构造方法
    • InputStreamReader(InputStream in)
    • InputStreamReader(InputStream in,String charsetName)

5.FileReader类

  • FileReader类是InputStreamReader的子类

    • FileReader(File file)
    • FileReader(String name)
  • 该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类

    • System.out.println(System.getProperty(“file.encoding”)); 获得本地平台的字符编码类型
  • 使用FileReader读取文件

//引入相关的类
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Test03 {
    public static void main(String[] args) {
      Reader fr = null;
        try {
            //创建FileReader对象
            fr = new FileReader("D:\\2.txt");
            //读取文本文件的数据
            char[] chars = new char[100];
            fr.read(chars);
            String msg=new String(chars);
            System.out.println(msg);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fr.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

6.缓冲区BufferedReader

  • 如何提高字符流读取文本文件的效率

​ 使用FileReader类与BufferedReader类

​ BufferedReader类是Reader类的子类

​ BufferedReader类带有缓冲区

​ 按行读取内容的readLine()方法

  • BufferedReader常用的构造方法

    • BufferedReader(Reader in)
  • 子类BufferedReader特有的方法

    • readLine()
  • 使用 BufferedReader读文本文件

//引入相关的类
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Test03 {
    public static void main(String[] args) throws IOException {
        Reader fr = null;
        BufferedReader br = null;
        try {
            //构造BufferedReader对象和FileReader对象
            fr = new FileReader("D:\\2.txt");
            br = new BufferedReader(fr);
            //调用readLine()方法读取数据
            System.out.println(br.readLine());

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                br.close();
                fr.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
  • 解决读取时中文乱码
FileInputStream fis=new FileInputStream("D:\\test.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8");
BufferedReader br=new BufferedReader(fr);
//调用readLine()方法读取数据
br.readLine();
//关闭文件流对象
br.close();
fr.close();

7.输出流Writer写入

Writer->OutputStreamWriter(字节流,编码)->FileWriter(File对象|路径,boolean是否追加)

  • Writer类常用方法

    • write(String str)

    • write(String str,int off,int len)

    • void close()

    • void flush()

  • 子类OutputStreamWriter常用的构造方法

    • OutputStreamWriter(OutputStream out)
    • OutputStreamWriter(OutputStream out,String charsetName)

8.FileWriter类

  • FileWriter类是OutputStreamWriter的子类

    • FileWriter (File file)

    • FileWriter (String name)

  • 该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

  • 使用FileWriter写文件

//引入相关的类
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test04 {
    public static void main(String[] args)  {
           Writer fw = null;
        try {
            //创建FileReader对象
            fw = new FileWriter("D:\\test.txt");
            //写文本文件
            fw.write("hello,world"); 
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fw.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

9.缓冲区BufferedWriter

  • 如何提高字符流写文本文件的效率?

    • 使用FileWriter类与BufferedWriter类

    • BufferedWriter类是Writer类的子类

    • BufferedWriter类带有缓冲区

  • BufferedWriter常用的构造方法

//引入相关的类
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Test04 {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            //构造BufferedWriter对象和FileWriter对象
            fw = new FileWriter("D:\\test.txt");
            BufferedWriter bf = new BufferedWriter(fw);
            //调用write()方法写数据
            bf.write("Java");
            bf.newLine();
            bf.write("Hello World");
            //流对象的清空和关闭flush()和close()
            bf.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fw.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}