> 文档中心 > 【Java】 认识I/O(代码示例,超详解释)

【Java】 认识I/O(代码示例,超详解释)

文章目录

    • 前言
    • File
    • Java流
      • 流的分类
      • 读写文本文件
        • 1.使用字节流读写文本文件
        • 2.使用字符流读写文本文件
      • 读写二进制文件
      • 重定向标准I/O

前言

在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。

File

  1. File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。

  2. File类构造方法:

方法 说明
File(String pathname) 用指定文件路径构造文件
File(String dir,String subpath) 指定文件路径下创建指定文件名的文件
File(File parent,String subpath) 指定文件对象中创建指定文件名文件
  1. File类常见方法

    方法 说明
    boolean exists() 文件是否存在,存在返回true
    String getAbsolutePath() 返回此对象表示的文件的绝对路径名
    String getName() 返回吃对象表示的文件的名称
    String getParent() 返回此File对象的路径名的上一级,没有则返回null
    boolean delete() 删除此对象指定的文件
    boolean isDirectory() 是否是目录
    boolean mkdir() 创建目录,路径由当前File对象指定
    boolean mkdirs() 创建包括父目录的目录

代码示例:

public static void main(String[] args) throws IOException { //构造文件对象 File file=new File("C:/Users/29616/desktop/1.txt"); //判断是否存在 if(file.exists()){     //存在,判断是否是文件     if(file.isFile()){  System.out.println("文件存在");  //定义str字符串  String str="好好学习,天天向上\t";  //字符流 写入   true表示向文件追加内容 false表示覆盖  FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true);  //写入  fw.write(str);  //关比字符流,不关闭会导致长期占用资源,并且安全性低  fw.close();  //字符流 读取  FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt");  //定义一个字符数组,用于存储读到字符  char[] datas=new char[1024];  //把读取的内容存到数组里,读到的是字符个数  fr.read(datas);  System.out.println(datas);  fr.close();  //文件大小  long length=file.length();  System.out.println(length);  //文件路径  String path=file.getPath();  System.out.println(path);  //文件绝对路径  String abspath=file.getAbsolutePath();  System.out.println(abspath);  //最后修改时间  long time=file.lastModified();  //System.out.println(time);  //格式化时间  Date date=new Date(time);  SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  System.out.println(simpleDateFormat.format(date));  //删除文件  if(file.delete()){      System.out.println("删除成功");  }  //不是文件     }else{  System.out.println("文件夹");     } }else{     //文件不存在     System.out.println("不存在,创建");     //创建新文件     file.createNewFile();     System.out.println("创建成功" ); }    }

Java流

​ 前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。

​ 读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。

流的分类

数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。

  • 按照流的方向主要分为输入流和输出流两大类。
  • 数据流按照数据单位的不同分为字节流和字符流。
  • 按照功能可以划分为节点流和处理流。

1.输入流和输出流

​ 输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。

2.字节流和字符流

​ 输入/输出流又按照处理数据单元的不同分为字节流和字符流。

​ 字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。

​ 字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。

​ 注:所有方法再出现错误时,都会抛出IOExcpetion。

读写文本文件

1.使用字节流读写文本文件

  1. 使用字节流FileInputStream读文本文件
package exam;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class FileInputStreamTest {    /**     * 字节流读文件     * @param args     * @throws IOException     */    public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.txt"); //创建流对象 FileInputStream fis=new FileInputStream(file); int data; System.out.println("可读取的字节数:"+fis.available()); System.out.println("文件内容为:"); //循环读数据 while ((data=fis.read())!=-1){     System.out.println(data+""); } fis.close();    }}
  1. 使用字字节流FileOutputStream写文本文件
package exam;import java.io.FileOutputStream;import java.io.IOException;/** * 字节流写文件 */public class FileOutputStreamTest {    public static void main(String[] args) throws IOException { try{     String str="java";     byte[] b=str.getBytes();//字节数组     FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true);     fos.write(b,0,b.length);     System.out.println("文件已更新");     fos.flush();     fos.close(); }catch (IOException obj){     System.out.println("创建文件时出错"); }    }}

2.使用字符流读写文本文件

  1. 使用字符流BufferedReander和FileReader读文本文件
package exam;import java.io.*;/** * 字符流读文件 */public class BufferedReaderTest {    public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.txt"); FileReader fr=new FileReader(file); BufferedReader br=new BufferedReader(fr); String line=br.readLine(); while(line!=null){     System.out.println(line);     line=br.readLine(); } br.close(); fr.close();    }}
  1. 使用字符流BufferedWriter和FileWriter写文本文件
package exam;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;/** * 字符流写文件 */public class BufferedWriterTest {    public static void main(String[] args) throws IOException { BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true)); bw.write("java"); bw.newLine(); System.out.println("写入成功!"); bw.flush(); bw.close();    }}

读写二进制文件

读写二进制文件常用的类有DataInputStream和DataOutputStream。

代码示例:

package exam;import java.io.*;/** * 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中 */public class ReadAndWriteClass {    public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.class"); File copyfile=new File("C:/Users/29616/desktop/2.class"); file.createNewFile(); copyfile.createNewFile(); //字节流读文件 FileInputStream fis=new FileInputStream(file);//字节流读二进制文件 DataInputStream dis=new DataInputStream(fis); //字节流写文件 FileOutputStream fos=new FileOutputStream(copyfile,true); //字节流写二进制文件 DataOutputStream dos=new DataOutputStream(fos); int temp; while ((temp=dis.read())!=-1){ //读数据     dos.write(temp);  //把读取数据写入到2.clss中 } System.out.println("读写成功"); fis.close(); fos.close(); dis.close(); dos.close();    }}

重定向标准I/O

Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。

使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。

System类提供3个重定向标准I/O的方法:

方法 说明
static void setErr(PrintStream err) 重定向标准错误输出流
static void setIn(InputStream in) 重定向标准输入流
static void setOut(PrintStream out) 重定向标准输出流

代码示例:

package demo1;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintStream;public class Test3 {    public static void main(String[] args) { //创建PrintStream输入流 try {     PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt"));     //将标准输出流重定向到文件     System.setOut(ps);     //向文件中输出内容     System.out.print("重定向测试"); } catch (FileNotFoundException e) {     e.printStackTrace(); } finally { }    }}

植物大战僵尸