字节流 字符流 - 12

Posted alice-bj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节流 字符流 - 12相关的知识,希望对你有一定的参考价值。

一、IO概述

Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存 中写出到其他设备上的流。
  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。
技术图片
 

二、字节流

一切皆为字节
 

OutputStream、FileOutputStream

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。
java.io.FileOutputStream类是文件输出流,用于将数据写出到文件。
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。  
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。  
public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。  
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。  
public abstract void write(int b) :将指定的字节输出流。

public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。 
public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。 

数据追加续写
true 表示追加数据,false 表示清空原有数据。
public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。  
public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称

 

InputStream、FileInputStream

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。
java.io.FileInputStream类是文件输入流,从文件中读取字节。
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。    
public abstract int read(): 从输入流读取数据的下一个字节。 
public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 
FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。  

 

图片复制练习

public class Copy {
    public static void main(String[] args) throws IOException {
        // 1.创建流对象
        // 1.1 指定数据源
        FileInputStream fis = new FileInputStream("D:\test.jpg");
        // 1.2 指定目的地
        FileOutputStream fos = new FileOutputStream("test_copy.jpg");

        // 2.读写数据
        // 2.1 定义数组
        byte[] b = new byte[1024];
        // 2.2 定义长度
        int len;
        // 2.3 循环读取
        while ((len = fis.read(b))!=-1) {
            // 2.4 写出数据
            fos.write(b, 0 , len);
        }

        // 3.关闭资源
        fos.close();
        fis.close();
    }
}

三、字符流

遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。
 

Reader、FileReader

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。
public void close() :关闭此流并释放与此流相关联的任何系统资源。    
public int read(): 从输入流读取一个字符。 
public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。   
FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。  

public class FISRead {
    public static void main(String[] args) throws IOException {
          // 使用文件名称创建流对象
           FileReader fr = new FileReader("read.txt");
          // 定义变量,保存有效字符个数
        int len ;
        // 定义字符数组,作为装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr.read(cbuf))!=-1) {
            System.out.println(new String(cbuf,0,len));
        }
        // 关闭资源
        fr.close();
    }
}

输出结果:
xx
xx
x

 

Writer、FileWriter

java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。
java.io.FileWriter类是写出字符到文件的便利类。
void write(int c) 写入单个字符。
void write(char[] cbuf)写入字符数组。 
abstract  void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 
void write(String str)写入字符串。 
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
void flush()刷新该流的缓冲。  
void close() 关闭此流,但要先刷新它。 

FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。   
FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。  

public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");     
          // 写出数据
          fw.write(97); // 写出第1个字符
          fw.write(‘b‘); // 写出第2个字符
          fw.write(‘C‘); // 写出第3个字符
          fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
      
          /*
        【注意】关闭资源时,与FileOutputStream不同。
           如果不关闭,数据只是保存到缓冲区,并未保存到文件。
        */
        // fw.close();
    }
}
输出结果:
abC田

关闭和刷新
flush :刷新缓冲区,流对象可以继续使用。
close: 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

 

四、IO异常的处理

我们一直把异常抛出,而实际开发中并不能这样处理,建议使用try...catch...finally 代码块,处理异常部分

public class HandleException1 {
    public static void main(String[] args) {
          // 声明变量
        FileWriter fw = null;
        try {
            //创建流对象
            fw = new FileWriter("fw.txt");
            // 写出数据
            fw.write("黑马程序员"); //黑马程序员
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fw != null) {
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

扩展
try (创建流对象语句,如果多个,使用‘;‘隔开) {
    // 读写数据
} catch (IOException e) {
    e.printStackTrace();
}

public class HandleException2 {
    public static void main(String[] args) {
          // 创建流对象
        try ( FileWriter fw = new FileWriter("fw.txt"); ) {
            // 写出数据
            fw.write("黑马程序员"); //黑马程序员
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

JDK9扩展
public class TryDemo {
    public static void main(String[] args) throws IOException {
           // 创建流对象
        final  FileReader fr  = new FileReader("in.txt");
        FileWriter fw = new FileWriter("out.txt");
           // 引入到try中
        try (fr; fw) {
              // 定义变量
            int b;
              // 读取数据
              while ((b = fr.read())!=-1) {
                // 写出数据
                fw.write(b);
              }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

五、属性集

java.util.Properties 继承于Hashtable ,来表示一个持久的属性集。

构造方法:
public Properties() :创建一个空的属性列表。
存储方法:
public Object setProperty(String key, String value) : 保存一对属性。  
public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
public Set<String> stringPropertyNames() :所有键的名称的集合。
与流相关得
public void load(InputStream inStream): 从字节输入流中读取键值对。 

public class ProDemo2 {
    public static void main(String[] args) throws FileNotFoundException {
        // 创建属性集对象
        Properties pro = new Properties();
        // 加载文本中信息到属性集
        pro.load(new FileInputStream("read.txt"));
        // 遍历集合并打印
        Set<String> strings = pro.stringPropertyNames();
        for (String key : strings ) {
              System.out.println(key+" -- "+pro.getProperty(key));
        }
     }
}
输出结果:
filename -- a.txt
length -- 209385038
location -- D:a.txt

 

 

 

 

以上是关于字节流 字符流 - 12的主要内容,如果未能解决你的问题,请参考以下文章

java 字节流与字符流的区别(转)

字节流 字符流 - 12

java 字节流与字符流的区别

java 字节流和字符流的区别

总结12

字节流与字符流的简单应用