Java的输入和输出处理(二)字符篇

| — | — |
| int read() | 读取单个字符并返回其Unicode值,如果到达流的末尾,则返回-1。 |
| int read(char[] c) | 将字符读入数组c,并返回读取的字符数。如果到达流的末尾,则返回-1。 |
| int read(char[] c, int off, int len) | 将字符读入数组cbuf的指定部分,并返回读取的字符数。如果到达流的末尾,则返回-1。 |
| long skip(long n) | 跳过n个字符,并返回实际跳过的字符数。 |
| boolean ready() | 判断是否可以从流中读取字符,返回true表示可以读取,false表示不可读取。 |
| void close() | 关闭流并释放与之关联的所有系统资源。 |

请注意:Reader基类、Writer基类与InputStream、OutputStream基类一样都是抽象类,不可以被实例化,都是由其子类实例化

Reader类的子类InputStreamReader

常用的构造方法:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)

charseName是字符编码的意思
在这里插入图片描述

InputStreamReader的子类FileReader类

FileReader类只可以按照本地平台的字符编码来读取数据,用户不可以指定其他的字符编码类型

获得本地平台的字符编码类型
System.out.println(System.getProperty(file.encoding))
常用方法:
可以使用Markdown表格来列举Java中FileReader类的常用方法。下面是一个示例:

方法描述
int read()读取单个字符并返回其Unicode值,如果到达流的末尾,则返回-1。
int read(char[] cbuf)将字符读入数组cbuf,并返回读取的字符数。如果到达流的末尾,则返回-1。
int read(char[] cbuf, int off, int len)将字符读入数组cbuf的指定部分,并返回读取的字符数。如果到达流的末尾,则返回-1。
long skip(long n)跳过n个字符,并返回实际跳过的字符数。
boolean ready()判断是否可以从流中读取字符,返回true表示可以读取,false表示不可读取。
void close()关闭流并释放与之关联的所有系统资源。

构造方法

  • FileReader(File file)
  • FileReader(String name)
BufferedReader类

用来提高字符流读取文本文件的效率
常用的构造方法
BufferedReader(Reader in)
在这里插入图片描述
举例:

package 面向对象.文件的输入与输出;

import java.io.\*;

public class 字符流输入 {
    public static void main(String[] args) {
        try {
            // 调用测试方法
// testreader1();
            testreader2();
// testreaderBuff();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void testreader1() {
        //FileReader子类 继承 InputStreamReader父类 继承 Reader基类
        // 创建字符输入流对象
        Reader reader = null;
        try {
            // 创建FileReader对象,指定文件路径
            reader = new FileReader("C:\\Java\\a.txt");
            int data;
            while ((data = reader.read()) != -1) {
                // 将读取到的字符转换为char并打印输出
                System.out.println((char) data);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testreader2() {
        // 创建字符输入流对象
        Reader reader = null;
        FileInputStream fis = null;
        try {
            // 创建FileInputStream对象,指定文件路径
            fis = new FileInputStream("C:\\Java\\a.txt");
            // 创建InputStreamReader对象,将字节流转换为字符流,并指定字符编码为UTF-8
            reader = new InputStreamReader(fis, "UTF-8");
            char ch[] = new char[1024];
            StringBuffer sb = new StringBuffer();
            int data;
            while ((data = reader.read(ch)) != -1) {
                // 将读取到的字符数组转换为字符串,并追加到StringBuffer对象中
                sb.append(ch, 0, data);
            }
            // 将StringBuffer对象转换为字符串并打印输出
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testreaderBuff() {
        Reader reader = null;
        BufferedReader br = null;
        try {
            // 创建字符输入流对象
            reader = new FileReader("C:\\Java\\a.txt");
            // 创建BufferedReader对象,将字符输入流包装在其中,实现缓冲功能
            br = new BufferedReader(reader);
            String str = null;
            while ((str = br.readLine()) != null) {
                // 逐行读取文本内容并打印输出
                System.out.println(str);
            }
// char ch[] = new char[1024];
// StringBuffer sb = new StringBuffer();
// int data;
// while ((data = br.read(ch)) != -1) {
// sb.append(ch);
// }
// System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                br.close();
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}



这三个方法实现了不同的字符读取方式:

testreader1() 方法使用 FileReader 类直接读取文件的字符流。它每次读取一个字符并将其转换为 char,然后打印输出。这种方式适用于读取较小的文本文件。

testreader2() 方法使用 InputStreamReader 类将 FileInputStream 的字节流转换为字符流。它使用字符数组作为缓冲区,每次读取一定数量的字符数据,并将其追加到 StringBuffer 对象中。最后,将 StringBuffer 对象转换为字符串并打印输出。这种方式适用于读取较大的文本文件。

testreaderBuff() 方法使用 BufferedReader 类对字符输入流进行缓冲。它包装了 FileReader 对象,并通过 readLine() 方法逐行读取文本内容并打印输出。使用缓冲区可以提高读取效率,尤其适用于大型文本文件。

字符输出流Writer类

常用方法:

方法描述
write(int c)将指定的字符写入输出流
write(char[] cbuf)将字符数组的内容写入输出流
write(char[] cbuf, int off, int len)将字符数组的指定部分写入输出流
write(String str)将字符串写入输出流
write(String str, int off, int len)将字符串的指定部分写入输出流
append(char c)将指定字符追加到输出流
append(CharSequence csq)将指定字符序列追加到输出流
append(CharSequence csq, int start, int end)将指定字符序列的指定部分追加到输出流
flush()刷新输出流,将缓冲区中的内容写入目标设备
close()关闭输出流,释放与之关联的资源

子类OutputStreamWriter常用的构造方法
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,String charsetName)

OutputStreamWriter的子类FileWriter类

构造方法
FileWriter (File file)
FileWriter (String name)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
在这里插入图片描述

BufferedWriter类

可以使用FileWriter类与BufferedWriter类
提高字符流写文本文件的效率。

  • BufferedWriter类是Writer类的子类
  • BufferedWriter类带有缓冲区

构造方法
BufferedWriter(Writer out)

最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

如何准备面试?

1、前期铺垫(技术沉积)

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

  • Java程序员必看《Java开发核心笔记(华山版)》

  • Redis学习笔记

  • Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

  • Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

  • 大厂面试必问——数据结构与算法汇集笔记

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

②BAT大厂面试总结(部分内容截图)

③面试总结

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

[外链图片转存中…(img-EWlfKB6m-1718703110091)]

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值