IO流学习之字符流(一)

IO流(Input/Output)

简介:

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。

IO技术实际上就是让数据在电脑内存或程序系统和硬件(硬盘,内存卡)之间转换的技术。

分类:

1、按流向

输入流:读取数据,把持久设备的数据读取到内存中。

输出流:写出数据,把内存的数据写出到持久设备。

2、按种类

字节流:传输过程中,传输数据的最基本单位是字节的流,常用的文件(txt、图片、mp3、mp4等)都可以用字节流来进行IO操作。

字符流:传输过程中,传输数据的最基本单位是字符的流,一般只能用于文本文件进行IO操作。

 字节流转换:字节流+编码 =》字符流 ;字符流 =》字节流 + 解码 。

IO流之字符流

1、FileWriter类

 常用方法:

输出流写数据步骤:

  • 指定文件位置
  • 创建输出流对象
  • 调用方法写数据
  • 将数据刷新到文件中
  • 关闭资源

代码案例:

代码:

package InputOutput;

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

public class FileWriterDemo1 {
    public static void main(String[] args) {
        // 指定文件位置
        // 两个“\\”,因为一个“\”会被编译成特殊符号,也可以只用一个“/”
        // 文档不存在系统会创建文件,但文件夹缺少会报错!
        // String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo1.txt";
        String path = "E:/JavaCodeDemo/InputOutput/filewriter/demo1.txt";
        // 相对路径会根据当前项目的位置创建文档
        // String path = "demo1.txt";

        // 不带文件后缀也会创建成功,但本质还是字符流
        // String path = "demo";

        try {
            // FileWriter类(字符流输出)
            FileWriter writer = new FileWriter(path);
            // 也可以直接写成 : FileWriter writer = new FileWriter("E:/JavaCodeDemo/InputOutput/filewriter/demo1.txt");

            // 获取此流使用的字符编码的名称
            String name = writer.getEncoding();
            System.out.println("编码名称 :"+name);
            /*
             * 创建输出流对象做了哪些事情: A:调用系统资源创建了一个文件 B:创建输出流对象 C:把输出流对象指向文件
             */
            // 调用输出流对象的写数据的方法
            // 写一个字符串数据
             writer.write("helloworld!");

            // 写一个字符串中的一部分数据
            // 结果:hel (0:起始下标;3:长度)
            // writer.write("helloworld", 0, 3);

            // 写一个字符数组数据
            // 結果:A0中(如果打开有乱码应该是文档和编译器的编码不同,设置一下编码格式即可)
            // char[] demo = { 'A', '0', '中' };
            // writer.write(demo);

            // 写一个字符数组的一部分数据
            // 結果:A (0:起始下标;1:长度)
            // char[] demo = { 'A', '0', '中' };
            // writer.write(demo, 0, 1);

            // 调用flush,将内容写道文档中
            writer.flush();
            // 释放资源
            writer.close();
            // 流程没问题输出“Success”
            System.out.println("Success");
        } catch (IOException e) {
            e.printStackTrace();
            // 流程出错输出“failed”
            System.out.println("failed");
        }
        // close()和flush()方法的区别:
        // flush():刷新缓冲区。流对象还可以继续使用。
        // close():先刷新缓冲区調用flush,然后通知系统释放资源。流对象不可以再被使用了。
    }
}

结果:

 上面只是简单的写入数据,每次都会把数据删除再重新写入,下面尝试一下不删除原有数据,而是直接在文本内追加数据:

 代码:

package InputOutput;

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

public class FileWriterDemo2 {
    public static void main(String[] args) {
        // 换行写入字符
        // 不同的操作系统换行符是不一样的,常见系统换行符如下所示:
        // windows:\r\n
        // linux:\n
        // mac:\r
        String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo2.txt";
        try {
            // true表示追加写入,默认是false
            FileWriter writer = new FileWriter(path, true);
            for (int i = 0; i < 2; i++) {
                writer.write("测试 :" + i + "\r\n");
                writer.flush();
            }
            writer.close();
            // 流程没问题输出“Success”
            System.out.println("Success");
        } catch (IOException e) {
            e.printStackTrace();
            // 流程出错输出“failed”
            System.out.println("failed");
        }

    }
}

结果:

2、FileReader类

常用方法:

 输入流读数据步骤:

  • 指定文件位置
  • 创建输入流对象
  • 调用方法读数据
  • 关闭资源

代码案例:

文档内容:

代码:

package InputOutput;

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

public class FileReaderDemo1 {
    public static void main(String[] args) throws IOException {
        // 读取文件位置
        // 文件路径需要准确不然报错
        String path = "E:\\JavaCodeDemo\\InputOutput\\filewriter\\demo3.txt";
        // 创建FileReader类(字符输入流)
        FileReader reader = new FileReader(path);
        // int result1 = reader.read();
        // System.out.println(result1);//49
        // result1 = reader.read();
        // System.out.println(result1);//50
        // result1 = reader.read();
        // System.out.println(result1);//51
        // result1 = reader.read();
        // System.out.println(result1);//52
        // result1 = reader.read();
        // System.out.println(result1);//53
        // result1 = reader.read();
        // System.out.println(result1);//54
        // 读取完以后读取到“-1”
        // result1 = reader.read();
        // System.out.println(result1);//-1
        //读取方法优化
        int flag = 0;
        while ((flag = reader.read()) != -1) {
            System.out.println(flag);
        }
        reader.close();
        // 流程成功输出Success
        System.out.println("Success");
    }
}

此处会把文档中的“123456”转化为字符‘1’、‘2’、‘3’、‘4’、‘5’、‘6’,所以输出结果是字符‘1’、‘2’、‘3’、‘4’、‘5’、‘6’根据ASCII码转换后的十进制数字。

 

posted @ 2019-07-27 20:32  请别耽误我写BUG  阅读(236)  评论(0编辑  收藏  举报