java基础——IO

IO流

在 Java IO 中,流是一个核心的概念。流表示的是连续的数据,称之为数据流。我们既可以读取流中的数据,也可向流中写入数据。在 Java IO 中,根据读写数据的类型不同,可以将流分为两种类型:字节流(按字节读取数据),字符流(按字符读取数据)。

java.io 包提供了操作流的类,而这些类的顶层父类如下(输入和输出是相对于 JVM 来说的):

 字节流字符流
输入流 InputStream Reader
输出流 OutputStream Writer

 字节流

计算机中的文件都是以字节的形式进行存储。

字节输出流——OutputStream

 以上就是 OutputStream 类的所有方法。OutputStream 只是提供了一些共用的方法,其直接子类共有六个。

 FileOutputStream

该类是向磁盘文件中写入数据。以下是其构造方法和一般方法。

 

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

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\javaTest\\IO\\a.txt");
        
        //创建一个输出流对象, 参数是一个File对象, 路径必须是实际存在的, 否则会报FileNotFoundException
        //如果路径下的文件不存在, 则会创建该文件
        FileOutputStream out = new FileOutputStream(file);
        
        //调用write()方法, 向文件中写入数据, 只能以字节的方式写入
        out.write(97);   //写入文件的是字母 a
        
        //关闭数据流, 释放资源
        out.close();
        
    }
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\javaTest\\IO\\a.txt");
        
        //创建一个输出流对象, 参数是一个File对象, 路径必须是实际存在的, 否则会报FileNotFoundException
        //如果路径下的文件不存在, 则会创建该文件
        FileOutputStream out = new FileOutputStream(file);
        
        //写入数据会先转换为ASII码, 然后在根据ASII码写入数据
        //调用write(Byte byte)方法, 向文件中写入数据, 以单个字节的方式写入
        out.write(97);   //写入文件的是字母 a
        
        //调用write(Byte []byte)方法, 向文件中写入数据, 以字节数组的方式写入
        //如果某个字节是负数,那该字节就会与后一个字节一起以GBK编码格式显示字符
        byte[] bytes = {-47, 64, -65, -66};
        out.write(bytes);   //写入的是  袬烤
        
        //如果想写入一个字符串, 可以使用String类中的getBytes();
        String str = "向文件中写入字符串";
        out.write(str.getBytes());
        
        //关闭数据流, 释放资源
        out.close();
        
    }
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        File file = new File("D:\\javaTest\\IO\\a.txt");
        
        //通过构造函数 FileOutputStream(File file, boolean append)向文件中续写数据,不会覆盖
        //append为true表示续写, 为false会创建一个新文件覆盖原文件
        FileOutputStream out = new FileOutputStream(file, true);
        
        out.write("可以".getBytes());
        out.write("向文件".getBytes());
        out.write("中".getBytes());
        
        out.write("\r".getBytes());  //换行
        
        out.write("续写数据".getBytes());
        
        //关闭数据流, 释放资源
        out.close();
        
    }
}

字节输入流——InputStream

 

 

 FileInputStream

 

import java.io.FileInputStream;
import java.io.IOException;

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileInputStream in = new FileInputStream("D:\\javaTest\\IO\\a.txt");
        
        int len1 = 0; 
        while((len1 = in.read()) != -1) {  //read()每次只能读入一个字节, 方法调用一次指针就后移一位
            System.out.println(len1);      
        }
        
        byte[] bytes = new byte[2];
        int len2 = 0;
        while((len2 = in.read(bytes)) != -1) {  //read(byte []bytes), 每次最多读取byte数组的长度个字节 
            System.out.println(new String(bytes, 0, len2)); //读取byte数组中有效的字节个数,以免出现空格或数组之前的内容
        }
        
        //关闭数据流, 释放资源
        in.close();
        
    }
}

字符流

字符流与包括读(Reader)和写(Writer),每次读或写一个字符。使用方式和字节流一样,只需要把 InputStream 和 OutputStream 替换成 Reader 和 Writer。

字符输入流——Reader

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

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileReader reader = new FileReader("D:\\javaTest\\IO\\a.txt");
        
        
        int len1 = 0; 
        while((len1 = reader.read()) != -1) {  //read()每次只能读入一个字节, 方法调用一次指针就后移一位
            System.out.print((char)len1);      
        }
        
        char[] c = new char[2];
        int len2 = 0;
        while((len2 = reader.read(c)) != -1) {  //read(byte []bytes), 每次最多读取byte数组的长度个字节
            System.out.print(new String(c, 0, len2)); //读取byte数组中有效的字节个数,以免出现空格或数组之前的内容
        }
        
        //关闭数据流, 释放资源
        reader.close();
        
    }
}

字符输出流

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

public class IOTest {
    
    public static void main(String[] args) throws IOException {
        
        FileWriter writer = new FileWriter("D:\\javaTest\\IO\\a.txt", true);
        
        writer.write("字符写入文件");
        
        writer.flush();  //写完数据必须刷新回硬盘
        
        char[] c = {'可', '以', '通', '过', '数', '组' };
        writer.write(c);
        writer.flush();
        
        //关闭数据流, 释放资源
        writer.close();
        
        //flush()和close()都可以把缓冲刷新回内存, 但是flush()使用后还可以继续使用流, 而close则已经关闭了流
        
    }
}

参考文献

Java IO

posted @ 2020-07-19 15:33  路半_知风  阅读(305)  评论(0编辑  收藏  举报