Java IO操作 字节流&字符流

参考 字节流与字符流的区别详解

1.基本概念

:程序通过流来传输和保存数据 程序的输入输出都是以流的方式,流里保存的是字节。

Java IO通过Stream(流)来实现。Java中定义了两种类型的流:字节型,和字符型。 关于流,可以理解为是一种“数据的管道”。管道中流动的东西可以是基于字节,也可以是基于字符的等。就好像管道里面可以流动水,也可以流动石油一样。

输入流 和 输出流:程序 需要数据的时候,通过输入流来获取数据。程序 需要保存数据的时候,通过输出流保存数据。输入流和输出流是相对程序而言,程序需要数据就需要输入流,程序保存数据 相对程序来说是是输出数据 就需要输出流。

字节流和字符流: 在java.io包中 操作文件内容主要有两大类:字节流和字符流。 字节流常用来操作 图片,音频,视频等。字符流长用来操作含有中文的文件。 

在字节流中,输入和输出是使用InputStream和OutStream完成的。

在字符流中,输入和输出是Reader类和Writer类完成的。

 

2.java IO 操作的步骤:

1.创建文件: 根据文件路径 创建文件和文件夹

2.打开输入输出流: 如果是保存文件,根据文件打开输出流;如果是读取文件,根据文件打开输入流

3.读取操作: 这一步需要用到byte[] 数组。如果是保存文件,就把要保存的内容转换成byte[] 数组,然后把byte[] 数组写入输出流。 如果是读取文件,就new 一个byte[] 数组,然后通过输入流 把要读取的文件内容读取到byte[] 数组。

4.关闭输入输出流。

 

3.字节流 byte  IO操作

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.junit.Test;

public class IOTest {

    // 字节数组 写的时候,把待保存的文件转化为字节数组,然后把字节数组写入输出流。
    // 字节数组 读的时候 创建一个空的字节数组,把要读取的文件,读入字节数组

    @Test
    public void readFileByStream() throws IOException {
        // 1.创建文件
        File file = new File("D:/xml/file/test.txt");
        if (file.exists()) {
            // 2.打开输入输出流---根据文件打开输入流
            InputStream inputStream = new FileInputStream(file);

            // 3.读写操作---把要读的文件 读取到字节数组里
            byte[] b = new byte[(int) file.length()];
            int len = inputStream.read(b);

            // 4.关闭输入出处流
            inputStream.close();
            System.out.println(new String(b));
        }
    }

    @Test
    public void saveFileByStream() throws IOException {

        //1.创建文件 
        String folderPath = "D:/xml/file";
        File folder = new File(folderPath);
        if(!folder.exists()){
            folder.mkdirs();
        }
        File file = new File("D:/xml/file/test.txt");
       
        //2.打开输入输出流--- 根据要保存的文件 创建文件输出流
        OutputStream outputStream = new FileOutputStream(file);
        
        //3.读写操作:  把要保存的内存转化到byte数组,然后以字节的方法 把字节数组输出到输出流 
        String str = "haaaaaaaa";
        outputStream.write(str.getBytes());
        
        //4.关闭输入输出流
        outputStream.close();
    }
}
View Code

 

4.字符流 IO操作 

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

import org.junit.Test;

public class IOTest {

    @Test
    public void saveFileByChar() throws IOException {
        // 1.创建文件
        String folderPath = "D:/xml/file";
        File folder = new File(folderPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        File file = new File("D:/xml/file/testChar.txt");

        // 2.打开输入输出流: 根据文件打出输出流
        Writer writer = new FileWriter(file);
        // 3.读写操作:把要保存的内容 写入到输出流
        String str = "我这次真的有点纠结了!";
        writer.write(str);
        // 4.关闭输入输出流
        writer.close();
    }

    @Test
    public void readFileByChar() throws IOException {
        // 1.创建文件
        File file = new File("D:/xml/file/testChar.txt");
        if (file.exists()) {
            // 2.打开输入输出流: 根据文件打开输入流
            Reader reader = new FileReader(file);
            // 3.读写操作:把要读取的内容 读取到输入流
            char[] c = new char[(int) file.length()];
            reader.read(c);
            System.out.println(new String(c));
            // 4.关闭输入输出流
            reader.close();
        }
    }
}
View Code

 

5.字节流和字符路的区别:

1.字节流 是byte 字节来传输的,字符流是by 字符的。如果对是中文字符操作,最好用字符流

2.字节流是没有用到缓存区的,直接对文件操作,所以即使没有即使关闭资源 outputstream.close() ,也可以输出内容。

字符流是用了缓存区的,如果没有及时关闭资源,不会有内存输出。但是如果没有关闭资源,通过flush() 强制刷新缓存,也可以输出内容。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;

import org.junit.Test;

public class IOTest {

    @Test
    public void saveFileByStream() throws IOException {

        String folderPath = "D:/xml/file";
        File folder = new File(folderPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        File file = new File("D:/xml/file/test1.txt");

        OutputStream outputStream = new FileOutputStream(file);

        String str = "haaaaaaaa";
        outputStream.write(str.getBytes());

        // 4.关闭输入输出流 这样文件里也有内容
        // outputStream.close();
    }

    @Test
    public void saveFileByChar() throws IOException {

        String folderPath = "D:/xml/file";
        File folder = new File(folderPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        File file = new File("D:/xml/file/testchar1.txt");

        Writer writer = new FileWriter(file);

        String str = "haaaaaaaa";
        writer.write(str);

        // 4.关闭输入输出流        
        //writer.close(); //这样testchar1.txt文件里 没有内容
        //writer.flush(); //强制刷新缓存也 可以输出内容
    }
}
View Code

 

posted on 2017-02-16 16:48  dreamstar  阅读(53)  评论(0编辑  收藏  举报