zoukankan      html  css  js  c++  java
  • 十一、java-文件读写 I/O

    1、流概述

    流是一组有序的数据序列,可分为输入流和输出流两种。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。不仅可以使用在文件上,也可以用于键盘、鼠标、显示器等。

    输入流
    文件--->数据流--->目的地

    输出流
    源-->数据流--->文件

    2、流概述

    Java定义了许多类专门复杂各种方式的输入/输出。这些类都放在java.io包中。其中,输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而所有输出流都是OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

    2.1 输入流

    InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构。

    • InputStream
      • AudioInputStream
      • ByteArrayInputStream
      • StringBufferInputStream
      • FileInputStream
      • FilterInputStream
        • BufferedInputStream
        • DataInputStream
        • PushbackInputStream
      • InputStream
      • ObjectInputStream
      • SequenceInputStream
      • PipedInputStream

    该类中所有方法遇到错误时都会触发IOException异常。

    • [x] read()方法:从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。如果流已经到达末尾,而没有可用字节,则返回-1
    • [x] read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
    • [x] close():关闭此输入流并释放与该流关联的所有系统资源。

    Java中的字符时Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入提供了一套单独的类Reader。

    • Reader
      • CharArrayReader
      • BufferedReader
        • LineNumberReader
      • FilterReader
        • PushBackReader
      • InputStreamReader
        • FileReader
      • PipedReader
      • StringReader

    2.2 输出流

    OutputStream类是字节输出流的抽象类。

    • OutputStream
      • ByteArrayOutputStream
      • FileOutputStream
      • FilterOutputStream
        • BufferedOutputStream
        • DataOutputStream
        • PushbackOutputStream
      • OutputStream
      • ObjectOutputStream
      • SequenceOutputStream
      • PipedOutputStream

    OutputStream类中的所有方法均返回void,遇到错误时都会触发IOException异常。

    • [x] write(int b) 将指定的字节写入此输出流
    • [x] write(byte[] b):将b个字节从指定的byte数组写入此输出流
    • [x] write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流
    • [x] flush():彻底完成输出并清空缓存区
    • [x] close():关闭输出流

    Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。

    • Writer
      • CharArrayWriter
      • BufferedWriter
        • LineNumberWriter
      • FilterWriter
        • PushBackWriter
      • OutputStreamWriter
        • FileWriter
      • PipedWriter
      • PrintWriter
      • StringWriter

    3、File类

    File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台物馆的方法来操作文件,可以实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如所在目录,文件的长度,以及文件读写权限等。

    3.1 文件的创建与删除

    使用File类创建一个文件对象,通常使用以下3种构造方法来创建文件对象。

    // 1.File(String pathName)
    New File(String pathName)
    File file = new File("D:\a.txt");
    
    // 2.File(String parent, String child)
    // 该构造方法根据定义的父路径和子路径字符串创建一个新的File对象。
    new File(String parent, String child);
    String parent = "D:/doc";
    String child = "letter.txt";
    // 3.File(File f,String child)
    // 该构造方法根据parent抽象路径名和子路径字符串创建一个新的File实例
    String f = "D:/doc/";
    String child = "letter.txt";
    
    public static class {
    	public static void main(String[] args) {
    		File file = new File("test.txt");
    		if(file.exits()) {
    			file.delete();
    		}else{
    			try{
    				file.createNewFile();
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

    4、 文件输出/输出流

    4.1 FileInputStream与FileOutputStream类

    两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。

    FileInputStream类常用构造方法

    1. FileInputStream(String name);
    2. FileInputStream(File file); 该方法允许把文件连接输入流之前对文件做进一步操作。
    public static class {
    	public static void main(String[] args) {
    		File file = new File("test.txt");
    		try{
    			// 创建FileOutputStream对象
    			FileOutputStream out = new FileOutputStream(File);
    			byte byt[] = "两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。".getBytes();
    			out.write(byt);
    			out.close();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		try{
    			FileInputStream in = new FileInputStream(file);
    			byte byt[] = new byte[1024];
    			int len = in.read(byt);
    			// 将文件信息输出,但是这个输出new String有问题
    			System.out.println(new String(byt,0,len));
    			in.close()
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    }
    

    4.2 FileReader和FileWriter类

    汉字采取上面的字节流读入会产生乱码的问题,所以使用字符流的FileReader和FileWriter类,即可避免该现象。

    5.带缓存的输入/输出流

    缓存是I/O的一种性能优化,缓存流为I/O流增加了内存缓冲区,有了缓存,使得在流上执行skip(),mark(),和reset()方法成为可能。

    5.1 BufferedInputStream和BufferedOutputStream类

    BufferedInputStream构造方法

    • [x] BufferedInputStream(InputStream in)
    • [x] BufferedInputStream(InputStream in, int size)

    第一种形式的构造方法创建了一个带有32字节的缓存流;第二个按照指定的大小来创建最优的缓存区大小。

    BufferedOutputStream构造方法

    • [x] BufferedOutputStream(OutputStream out)
    • [x] BufferedOutputStream(OutputStream out,int size)

    5.2 BufferedReader和BufferedWriter

    以上分别继承了Reader和Writer类
    BufferedReader类的常用方法

    方法 描述
    read() 读取单个字符
    readLine() 读取一个文本行,并将其返回为一个字符串。若无数据,则返回null。

    BufferedWriter常用方法

    方法 描述
    write(String s,int off,int len) 写入字符串的某一部分
    flush() 刷新该流的缓存
    newLine() 写入一个行分割符

    在使用BufferedWriter类的Write()方法时,数据并没有立刻被写入值输出流,而是首先进入缓存去中。如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。

    字符数据--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件

    package simple.java;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import sun.net.www.content.text.plain;
    
    public class FileTest {
    	public static void main(String[] args) throws IOException {
    		String[] array = {"取等","学家尽快","断努力"};
    		File f = new File("C:\pox.txt");
    		try{
    			FileWriter fileWriter = new FileWriter(f);
    			BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    			for (int i=0;i<array.length;i++){
    				bufferedWriter.write(array[i]);
    				bufferedWriter.newLine();
    			}
    			bufferedWriter.close();
    			fileWriter.close();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		try{
    			FileReader fileReader = new FileReader(f);
    			BufferedReader bufferedReader = new BufferedReader(fileReader);
    			String s = null;
    			int i = 0;
    			// s=bufferedReader.readLine()很重要,否则会显示不全,还不知道为啥。
    			while((s=bufferedReader.readLine())!= null) {
    				i++;
    				System.out.println("第"+i+"行:"+s);
    			}
    			bufferedReader.close();
    			fileReader.close();
    		}
    
    
    
    
    谁不是孤身一人,翻山越岭
  • 相关阅读:
    MyBatis java and MySql local variables
    FileReader 基本介绍
    MyBatis插入多条
    mysql批量更新
    转载:mybatis自动生成
    Redis Replication
    Redis 持久化
    Python 调用 Redis API
    Redis 数据类型
    Redis 单节点安装
  • 原文地址:https://www.cnblogs.com/hasz/p/13040840.html
Copyright © 2011-2022 走看看