`
huihui920823
  • 浏览: 36492 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

字符流---IO学习笔记(三)

 
阅读更多

字符流:

文本和文本文件的区别:
文本:
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)。
文件:
文件是byte byte byte…的数据序列。
文本文件:
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果。

字符流(Reader,Writer)
操作的是文本文件。对于mp3,二进制文件是字节文件不适合用字符流读取,因为读取出来的是char,没有意义。
字符的处理,一次处理一个字符
字符的底层仍然是基本的字节序列

字符流(字节字符转换流)的基本实现:
InputStreamReader:
完成byte流解析为char流,按照编码解析
OutputStreamWriter:
提供char流到byte流,按照编码处理

字符流的基本方法的使用:

package com.test.FileInputStreamReader;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileInputStreamReaderTest {

    public static void main(String[] args){
        try {
            String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
            ReadFile1(filename);
            ReadFile2(filename);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 单字符读取
     * 返回的是读到字节转换成int类型(最后8位)的值
     * @param fis
     */
    public static void ReadFile1(String filename) throws IOException{
        System.out.println("单字节读取的方式:");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
//      InputStreamReader isr = new InputStreamReader(fis, "gbk");
        int i;
        while((i = isr.read())!=-1){
            System.out.print((char)i);
        }
        isr.close();
    }

    /**
     * 批量读取
     * 放入buf这个字符数组中,从第0个位置开始放置,最多放buf.length个
     * 返回的是读到字符的个数
     * @param fis
     * @throws IOException
     */
    public static void ReadFile2(String filename) throws IOException{
        System.out.println();
        System.out.println("批量读取的方式:");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默认的是项目的编码(这里是gbk)
        char[] buf = new char[2*1024];
        int i;
        while((i = isr.read(buf, 0, buf.length))!=-1){
//          //第一种转换成字符的方式
//          for(int j = 0;j<i;j++){
//              System.out.print((char)buf[j]);
//          }
            //第二种转换成字符串的方式
            String str = new String(buf,0,i);
            System.out.println(str);

        }
        isr.close();
    }

}

结果截图:
这里写图片描述

注意:在操作字符流的时候要注意编码的问题。这里读取的文件是gbk编码格式的,所以在读取的时候要采用gbk编码的读取方式。否则就会出现乱码。

FileWriter和FileReader:
其实上边的代码中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
这部分代码完全可以使用
FileReader fr = new FileReader(String filename);
来替代。
FileReader和FileWriter的基本方法的使用:

package com.test.FileReaderAndFileWriter;

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

public class FileReaderAndFileWriterTest{

    public static void main(String[] args) throws IOException{

        FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt");//缺点:不过这里只能识别项目默认的编码不能设置其他的编码,如果读取的文件编码不是项目默认的编码,读取时就会出现乱码
        FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\写出的测试文件.txt");
        char[] buf = new char[2*1024];
        int i;
        while((i = fr.read(buf, 0, buf.length))!=-1){
            fw.write(buf, 0, i);
            fw.flush();
        }

        fr.close();
        fw.close();
    }


}

注意:FileReader和FileWriter与之前的代码中通过InputStreamReader包装FileInputStream相比,虽然简洁,但是不能设置采用什么编码读取文件,只能使用项目默认的编码读取文件。

字符流的过滤器:
BufferedReader——>readLine 一次读一行
BufferedWriter/PrintWriter———>写一行

package com.test.BufferedReaderAndBufferedWriter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class BufferedReaderTest {

    public static void main(String[] args){
        String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\读取的测试文件.txt";
        try {
            BufferedWriter(filename);
            PrintWriter(filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 使用BufferedWriter写出
     * @throws IOException
     */
    public static void BufferedWriter(String filename) throws IOException{
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(
                                filename)));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件1.txt")));


        String line;
        while((line = br.readLine())!=null){//但是这里的readLine并不识别换行符
            System.out.println(line);
//          bw.write(line);//写出的文件内容没有进行换行
//          bw.write(line+"\r\n");//这里再写出文件的时候要单独写出换行操作

            bw.write(line);
            bw.newLine();//换行操作
            bw.flush();
        }

        br.close();
        bw.close();
    }

    /**
     * 使用PrintWriter写出
     * @param filename
     * @throws IOException
     */
    public static void PrintWriter(String filename) throws IOException{
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(
                                filename)));
        PrintWriter pw = new java.io.PrintWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\测试文件2.txt");

        String line;
        while((line = br.readLine())!=null){
            pw.println(line);
            pw.flush();
        }
        br.close();
        pw.close();
    }
}

上边这两种写出文件的方法的效果是一样的。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    java IO流学习笔记——(2)文件字符流&字节数组流

    java IO流学习笔记——(2)文件字符流&字节数组流 文件字符流FileReader&FileWriter FileReader :通过字符的方式读取文件,仅适合字符文件 FileWriter :通过字节的方式写出或追加数据到文件中,仅适合字符文件 部分...

    java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流

    目录java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流字节缓冲流 —BufferedInputStream&BufferedOutputStream字符缓冲流—BufferedReader&BufferedWriter转换流—InputStreamReader&...

    Java学习笔记-个人整理的

    {7.9}字符流}{112}{section.7.9} {7.10}缓冲字符输入输出流}{113}{section.7.10} {7.11}文件常用操作}{114}{section.7.11} {7.12}对象序列化}{117}{section.7.12} {8}多线程}{121}{chapter.8} {8.1}线程的常用...

    秃头星人进化记(IO流学习总结)

    学习笔记.总结开始基本概念File类(*****)*构造方法**常用方法*字节流(*****)字符流(*****)处理流(*****)关闭流(***)打印流(***)其他流(**)1:字节数组 节点流2:基本数据类型+String 保留数据+类型3:...

    Java开发详解.zip

    031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 031204_【第12章:JAVA IO】_字节-字符转换流笔记.pdf 031205_【第12章:JAVA IO】_内存操作流笔记.pdf 031206_【第12章:JAVA IO】_管道流笔记.pdf 031207_【第...

    整理后java开发全套达内学习笔记(含练习)

    注意:默认类型转换(自动类型提升)会丢失精度,但只有三种情况: int&gt;float; long&gt;float; long&gt;double. 看一下他们的有效位就明白。 二进制是无法精确的表示 0.1 的。 进行高精度运算可以用java.math包中...

    java7hashmap源码-network_program:学习java网络编程

    用于存放学习java网络编程过程遇见的重难点笔记和相关代码 附带代码大部分是《java网络编程 第四版》的课程代码 对运算字符串进行识别的作业 @since2020.11.26 IO流 - 多线程 @since2020.11.26 internet地址 @since...

    J2SE技术总结-Java学习精华教程-电子书

    本书内容非常全面,涵盖了《Java编程思想》、《Java学习笔记》等书籍所有知识要点,并结合作者自己经验总结而编写,内容丰富程度胜过一切书籍 众所周知,一般书籍为了销售需要,往往很少的知识点,却需要添加大量的...

    跟汤老师学Java(第15季):I/O输入输出流

     字节流、字符流  节点流、包装流 4.字节流  InputStream:FileInputStream、ByteArrayInputStream、ObjectInputStream  OutputStream:FileOutputStream、ByteArrayOutputStream、ObjectOutputStream 5....

    java8集合源码分析-Awesome-Java:真棒-Java

    字符流 NIO等 Java8 Java8语言的行为参数化和流编程等 Java虚拟机 Java虚拟机相关,内存模型,类加载机制,JVM性能解析等 零散的文章 数据结构与算法 算法的度量,基础数据结构,链表,二叉树,B树,图论,深度和...

    Jsoup学习——Saz2Csv解析器

    2、Java IO类:输入输出流、压缩流(Zip流) 3、Java File类操作:文件及文件夹的遍历(递归)、读写、复制,批量修改文件后缀名,csv格式文件的读写 4、Java FilenameFilter类的使用:遍历指定后缀名的文件 5、Java中...

Global site tag (gtag.js) - Google Analytics