zoukankan      html  css  js  c++  java
  • 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:
    
            // linux:
    
            // mac:
    
            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 + "
    ");
                    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码转换后的十进制数字。

  • 相关阅读:
    PS3 可播放的多媒体类型
    VB个性化文件夹图标
    Delphi源码:编辑长求字符串相似度
    Delphi使用zlib来压缩文件
    汉字编码问题
    Silverlight 3 学习概要
    asp.net下大文件上传知识整理
    DHTML动态创建一个弹出遮罩层
    Delphi的运算符重载
    Windows Vista 交互式服务编程
  • 原文地址:https://www.cnblogs.com/Bernard94/p/11256452.html
Copyright © 2011-2022 走看看