Java中的I/O流

时间:2020-04-14
本文章向大家介绍Java中的I/O流,主要包括Java中的I/O流使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java中的I/O流

导言

在做java实验时发现并不会使用I/O流,经过一段时间学习后,补上此笔记,仅供参考,本人电脑为MacBook Pro,所以所有文件路径按Unix系统下的路径来写

文件对象

文件和文件夹都是File代表

使用绝对路径或者相对路径创建File

绝对路径:/Users/apple/Desktop/Numbers.txt

相对路径:/Desktop/Numbers.txt

package file
import java.io.File;
public class TestFile {
  public static void main(String[] args) {
    File f1 = new 			 File("/Users/apple/Desktop/Numbers.txt");
    System.out.println("f1的路径" + f1.getAbsolutePath());
  }
}

文件的常用方法

package file;
  
import java.io.File;
import java.util.Date;
  
public class TestFile {
  
    public static void main(String[] args) {
  
        File f = new File("/Users/apple/Desktop/Numbers.txt");
        System.out.println("当前文件是:" +f);
        //文件是否存在
        System.out.println("判断是否存在:"+f.exists());
         
        //是否是文件夹
        System.out.println("判断是否是文件夹:"+f.isDirectory());
          
        //是否是文件(非文件夹)
        System.out.println("判断是否是文件:"+f.isFile());
          
        //文件长度
        System.out.println("获取文件的长度:"+f.length());
          
        //文件最后修改时间
        long time = f.lastModified();
        Date d = new Date(time);
        System.out.println("获取文件的最后修改时间:"+d);
        //设置文件修改时间为1970.1.1 08:00:00
        f.setLastModified(0);
          
        //文件重命名
        File f2 =new File("/Users/apple/Desktop/Number.txt");
        f.renameTo(f2);
        System.out.println("把Numbers.txt改名成了Number.txt");
    }
}

流(stream)就是一系列的数据

在Java中,不同种类的数据交互时,就使用流来实现

数据源可以是文件,还可以是数据库,网络或者其他

输入流:InputStream

输出流:OutputStream

下面将介绍一些常用的流

字节流

用字节的形式读取和输入数据

字节输入流:InputStream

字节输出流:OutputStream

  • 以字节流的形式读取文件内容
package Stream;

import java.io.File;
import java.io.FileInputStream;
import java.io.IoException;

public class TestStream {
  public static void main(String[] args) throws IOException {
    File f = new File("/Users/apple/Desktop/Numbers.txt");
    //创建基于文件的输入流
    FileInputStream fis = FileInputStream(f);
    
    //创建字节数组,其长度就是文件的长度
    byte[] ans = new byte[(int)f.length()];
    //以字节流的形式读取文件内所有的内容
    fis.read(ans);
    
    for(byte b : ans) {
      System.out.println(b);
    }
    
    //使用完流,进行关闭
    fis.close();
  }
}
  • 以字节流的形式写入文件内容
package Stream;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestSream {
  public static void main(String[] args) throws IOException {
    File f = new File("Result.txt");
    byte data[] = {77.444,0.000};
    
    //创建基于文件的输入流
    FileOutputStream fos = new FileOutputStream(f);
    
    //把数据写到输入流
    fos.write(data);
    
    //关闭输入流
    fos.close;
  }
}

字符流

专门用于字符的形式的读取和写入数据

Reader 字符输入流

Writer 字符输出流

  • 使用字符流读取文件
package Stream;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class TestStream {
  public static void main(String[] args) throws IOException {
    File f = new File("/Users/apple/Desktop/Numbers.txt");
    
    //创建基于文件的Reader
    FileReader fr = new FileReader(f);
    
    //创建字符数组
    byte[] ans = new byte[(int)f.length()];
    
    //以字符流的形式读取文件的所有内容
    fr.read(ans);
    
    //打印
    for(char b : ans) {
      System.out.println(b);
    }
  }
}
  • 使用字符流把字符串写入到文件
package Stream;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class TestStream {
  public static void main(String[] args) throws IOException{
    File f = new File("/Users/apple/Desktop/Numbers.txt");
    FileWriter fr = new FileWriter(f);
    String data = "13214124142";
    char[] cs = data.toCharArray();
    fr.write(cs);
    fr.close();
  }
}

缓存流

字节流和字符流的弊端:在每读写一次,都会访问其介质,读写频率较高时,性能不佳。

采用缓存流

缓存流在读取的时候,会一次性读取较多的数据到缓存中,以后的每次一出访问,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。

举个例子:我们吃菜的时候,是把锅里的菜盛到盘子里去吃,盘子里吃完了再去锅里盛。

缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区到达一定的量,才把这些数据,一起写入到硬盘中去

  • 使用缓存流读取数据
package stream;
  
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
  
public class TestStream {
  public static void main(String[] args) throws IOException {
    File f = new File("/Users/apple/Desktop/Numbers.txt");
    
    //缓存流必须创建在一个流的基础上
    FileReader fr = new FileReader(f);
    BufferedReader br = new BufferedReadder(fr);
    
    while(br.hasNext()) {
      //一次读一行
      String line = br.readLine();
      System.out.println(line);
    }
  }
}
  • 使用缓存流读取数据
package stream;
   
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
   
public class TestStream {
   
    public static void main(String[] args) throws IOException {
      File f = new File("/Users/apple/Desktop/Numbers.txt");
      
      //缓存流必须创建在一个流的基础上
      FileWriter  fw = new FileWriter(f);
      PrintWriter pw = new PrintWriter(fw);
      pw.println("6666");
      pw.println("432432");
    }
}
  • flush

有的时候,需要立即把数据写到硬盘,而不是等缓存满了菜写出去,这时候就用flush

package stream;
   
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
   
public class TestStream {
   
    public static void main(String[] args) throws IOException {
      File f = new File("/Users/apple/Desktop/Numbers.txt");
      
      //缓存流必须创建在一个流的基础上
      FileWriter  fw = new FileWriter(f);
      PrintWriter pw = new PrintWriter(fw);
      pw.println("6666");
      //强制性把缓存中的数据写入硬盘,无论缓存是否已满
      pw.flush();
      pw.println("432432");
      pw.flush();
    }
}

数据流

使用数据流可以进行数据的格式化顺序读写

  • 直接进行字符串的读写

注意:要用DataInputStream读取一个文件,这个文件必须是由DataOutputStream写出的,否则会出现EOFException异常。

package stream;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOEXception;

public class TestStream {
      
    public static void main(String[] args) {
        write();
        read();
    }
 
    private static void read() {
        File f =new File("/Users/apple/Desktop/Numbers.txt");
        try (
                FileInputStream fis  = new FileInputStream(f);
                DataInputStream dis =new DataInputStream(fis);
        ){
            boolean b= dis.readBoolean();
            int i = dis.readInt();
            String str = dis.readUTF();
             
            System.out.println("读取到布尔值:"+b);
            System.out.println("读取到整数:"+i);
            System.out.println("读取到字符串:"+str);
 
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
 
    private static void write() {
        File f =new File("Result.txt");
        try (
                FileOutputStream fos  = new FileOutputStream(f);
                DataOutputStream dos =new DataOutputStream(fos);
        ){
            dos.writeBoolean(true);
            dos.writeInt(300);
            dos.writeUTF("123 this is gareen");
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
}

对象流

对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘。

一个对象以流的形式进行传输,叫做序列化。该对象所对应的类,必须是实现Serializable接口。

流的关系图

以上就是关于java中流的一些知识。

原文地址:https://www.cnblogs.com/mgd666/p/12698217.html