字节流 字符流 - 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

原文地址:https://www.cnblogs.com/alice-bj/p/12411172.html

时间: 2024-10-24 02:10:16

字节流 字符流 - 12的相关文章

Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理

通过socket获取字节流处理时最初使用的是BufferedReader和PrintWriter  这种方式在解析字符串时是比较方便的 但是在处理字节时不够方便最终还是回归到InputStream和OutputStream方式 不使用缓存直接使用字节流操作,一次传输的字节数据在300字节以内,目前没有测试差距会有多大. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException;

IO-03字节流字符流

在程序中所有的数据都是以流的方式进行传输和保存的,程序需要数据的时候要使用输入流读取数据,而程序需要将一些数据保存起来则需要使用输出流来完成. 在JAVA.IO包中操作文件内容的主要有两大类:字节流,字符流,两类都分为输入和输出操作.在字节流中输出数据主要是使用OutputStream,输入主要使用InputStream,在字符流中输出主要使用Writer类完成,输入只要使用Reader类完成. 主要的操作流程如下: 使用FILE类打开一个文件 通过字节流或者字符流的子类,指定输出的位置. 进行

IO 复习字节流字符流拷贝文件

/* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ import java.io.*; //in order to utilize stream object import java.util.*; // in order to utilize ArrayList import java.net.*; class Copy{ public static v

Java 字节流 字符流 转换流

我们知道Java中的流分为字符流和字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片.电影等只要是文件都是以二进制的形式存在的,而不是字符. 字符流: FileReader FileWriter. BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream 我们看一下J2SE文档: BufferedReader(

Java+字节流+字符流转换

原文地址:http://blog.51cto.com/janephp/2150039

字节流与字符流简单操作(OutputStream、InputStream、Writer、Reader)

操作流程 使用File类打开一个文件 通过字节流或者字符流的子类.指定输出的位置. 进行读/写操作 关闭输入/出 字节流与字符流 在java.io包中操作文件内容主要有两大类:字节流字符流.两大类分为输入和输出操作,在字节流中输出数据主要是OutputStream完成,输入使用InputStream,在字符流冲输出主要是使用Writer类完成,输入主要是Reader完成 字节流 字节流主要是操作byte类型数据,以byte数组为准,主要操作类是OutputStream和InputSream 字节

JAVA 字节流和字符流度读写的区别

java处理文件的类里面,stream结尾都是采用字节流,reader和writer结尾都是采用字符流.两者的区别就是读写的时候一个是按字节读写,一个是按字符. 字符流的底层就是字节流.而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容.而字节流读取单位为byte.byte作为计算机存储最基本单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等.基于B/S和C/S的文件传输都可以采用字节流的形式.在读写文件需要对内容按行处理,比如比较特定字符,

字节流与字符流的一些个人看法

一.字节与字符 IO操作,首先要提到字节与字符.字符串. 名称 数据类型 含义 字节 byte 是硬盘中文件存储的单位,也是网络传输信息的单位. 字符 char 我们常用的字母.数字.字和符号. 字符串 String 字符的集合,char[]的封装类型 笼统来讲,字节用来与文件打交道,而字符用来和人打交道 二.字节流与字符流 流,我的理解流就是用来传输水的水管,数据则是水管里面的水. 流有很多种分类方式,在这里只讨论按数据类型的分类,即字节流(OutputStream.InputStream)与

字节流还是字符流

我的个人主页:http://www.alphaway.org 以下说的流都是文件流. 字节流和字符流的区别 文件在磁盘上的存储是按二进制存储的,也即按字节存储的.所以字节流就是相当于一个管道连通了应用程序和磁盘上的文件,每次读取都是以字节为单位.而字符流虽然也相当于一个管道连通了应用程序和磁盘上的文件,但是该管道自带过滤效果,即根据编码,将字节组装成不同的字符.为什么需要过滤呢,因为你存的时候是根据编码存的,所以读的时候自然也要根据编码读呗. 何时使用字节流字符流 如果你所要读的文件是与编码无关