Java基础IO流(三)字符流

字符流:

  文本和文本文件:

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

  字符流(Reader Writer) ------> 操作的是文本文件;一次处理一个字符;字符的底层仍然是基本的字节序列

  字符流的基本实现

    InputStreamReader 完成byte流解析为char流,按照编码解析

    OutputStreamWriter 提供char流到byte流,按照编码处理

复制代码
public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        FileInputStream in = new FileInputStream("D:\\my\\studyWorkSpace\\java\\test.txt");
        InputStreamReader isr = new  InputStreamReader(in);//默认项目的编码,将来操作的时候,要写文件本身的编码格式
        /*
        int c;
        while((c = isr.read()) != -1){
            System.out.print((char)c);
        }*/
        
        /*
        * 批量读取,放入buffer这个字符数组,从第0个位置开始放置,最多放buffer.length个
        *返回的是读到的字符的个数
        */
        char[] buffer = new char[8 * 1024];
        int len;
        while((len = isr.read(buffer,0,buffer.length)) != -1){
            String s = new String(buffer,0,len);
            System.out.println(s);
        }
        
    }
复制代码

心得:以字符为单位进行拷贝,和字节流用法差不多,主要是考虑编码格式。

 

FileReader,FileWriter

注意:FileReader读出的时候,按照项目默认编码读的,如果文件和项目默认编码不一致,那就只能用InputStreamReader来转码读取了。

复制代码
public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        FileReader fr = new FileReader("D:\\my\\studyWorkSpace\\java\\test.txt");
        FileWriter fw = new FileWriter("D:\\my\\studyWorkSpace\\java\\test1.txt");
        
        char[] buffer = new char[2056];
        int c;
        while((c = fr.read(buffer,0,buffer.length)) != -1){
            fw.write(buffer,0,c);
            fw.flush();
        }
        fr.close();
        fw.close();
    }
复制代码

字节流的过滤器:

  BufferedReader ---》readLine 一次读一行

       BufferedWriter/PrintWriter ----》写一行

复制代码
public static void main(String[] args) throws IOException{
        //对文件进行读写操作
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\my\\studyWorkSpace\\java\\test.txt")));
        /*BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\my\\studyWorkSpace\\java\\test2.txt")));*/
        PrintWriter pw = new PrintWriter("D:\\my\\studyWorkSpace\\java\\test3.txt");
        String line;
        while((line = br.readLine()) != null){
            System.out.println(line);//一次读一行,并不能识别换行(读的时候不识别换行符,一行一行读,一行一行的数据输出,但是没有输出换行符,没有手动换行的话所有数据会在一行输出)
            /*bw.write(line);
            //单独写出换行操作
            bw.newLine();//换行操作
            bw.flush();*/
            
            pw.println(line);
            pw.flush();
        }
        br.close();
        /*bw.close();*/
        pw.close();
    }
复制代码

行号追踪LineNumberReader

复制代码
public static void main(String[] args)throws IOException {
        FileReader fr = new FileReader("D:\\my\\studyWorkSpace\\java\\test.txt");
        PrintWriter pw = new PrintWriter("D:\\my\\studyWorkSpace\\java\\testlr.txt");
        LineNumberReader lr = new LineNumberReader(fr);
        //每一行的字符串
        String line = null;
        //当读到的内容不是空的时候
        while((line = lr.readLine()) != null){
            //每一行前面加上行号,并且换行输出
            pw.println(lr.getLineNumber() + ":" + line);
            pw.flush();
        }
        lr.close();
        pw.close();
        
    }
复制代码

 

posted @   瓶子coder  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示