Java基础字符编码、内存流和BufferedReader类4月打卡day25

举报
java厂长 发表于 2022/04/13 09:33:12 2022/04/13
【摘要】 Java基础之多线程(综合案例)4月打卡day25关于作者作者介绍🍓 博客主页:作者主页🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。1、字符编码1.1 常用字符编码在计算机的世界之中,所有的显示文字都是按照其指定的数字编...

Java基础之多线程(综合案例)4月打卡day25

关于作者

  • 作者介绍


🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

1、字符编码

1.1 常用字符编码

在计算机的世界之中,所有的显示文字都是按照其指定的数字编码进行保存的,如果没有正确的解码,那么就坑你产生乱码,如果要想清楚解决乱码问题,就要了解经常见到一些常见的编码:

GBK/GBK2312:表示国标中文编码,其中GBK是包含简体中文和繁体中文,而GB2312只有简体;

ISO 8859-1:是一种国际通用编码,可以表示任何文字,但是对于中国文字需要进行转码;

UNICODE:使用十六进制完成的编码,可以准确的表示出任何的语言文字;

UTF-8:部分编码使用UNICODE,而一些编码继续使用像ISO 8859-1,类型的编码,适合于网络传输,在以后的所有的项目开发之中,都必须采用此编码。可是考虑到日后学习的方便,几乎都会使用命令行进行操作,所以命令行只支持GBK编码,UTF不支持,一旦程序设置了UTF编码,那么通过命令行查看就是乱码。

在开发之中经常会遇见乱码的问题,所谓的乱码的核心在于编码和解码不统一。如果要想正确的避免项目之中出现的乱码,那么首先就应该知道环境之中所支持的编码是什么。

1.2 乱码产生分析

读取Java运行属性

package com.day15.demo;
​
public class ListDemo {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

这个时候显示出来的信息是很多的,这里面有专门的编码选项“file.encoding=GBK”,也就是说如果没有任何的意外,所有的文字编码都是GBK。

改变编码

package com.day15.demo;
​
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
​
public class ListDemo {
    public static void main(String[] args) throws Exception{
        OutputStream out = new FileOutputStream(new File("f:" + File.separator + "test" + File.separator + "hello.txt"),true);
        out.write("世界和平".getBytes());
        out.close();
    }
}

2、内存流基本操作

在讲解之前首先来思考一个问题:就是如果现在某个操作必须发生IO,但有不希望有一些临时文件产生的话,那么现在肯定无法使用之前的文件操作流,所以为了解决这样的问题,提供了内存操作流,即:以内存进行操作的终端,以发生IO操作关系。

image-20210819132612577

对于内存操作流也分为两组:

字节内存操作流:内存输入流(ByteArrayInputStream)内存输出流(ByteArrayOutputStream)

字符内存操作流:内存输入流(CharArrayReader)内存输出流(CharArrayWriter)

image-20210819132728511

ByteArrayInputStream ByteArrayOutputStream
java.lang.Object java.io.InputStream java.io.ByteArrayInputStream java.lang.Object java.io.OutputStream java.io.ByteArrayOutputStream
public ByteArrayInputStream(byte[] buf) public ByteArrayOutputStream()

输出流

image-20210819133020134

输入流

image-20210819133247011

通过内存实现大小写转换的操作

package com.day15.demo;
​
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
​
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
​
public class MemoryDemo {
    public static void main(String[] args) throws Exception{
        String str = "Hello,World!";
        InputStream in = new ByteArrayInputStream(str.getBytes());
        OutputStream out = new ByteOutputStream();
        int temp = 0;
        while((temp = in.read())!=-1){
            out.write(Character.toUpperCase(temp));
        }
        in.close();
        out.close();
        System.out.println(out.toString());
    }
}

此过程我们发现没有文件的产生,而此过程只不过是产生了临时文件。

3、BufferedReader类

BufferedReader属于一个缓冲的输入流,而且是一个字符流的操作对象。但是必须清楚一点就是对于我们的缓存流定义有两类:字节缓冲流( BufferedInputStream )、字节缓冲流( BufferedReader )。

如果说想在把所有的输入数据放在一起了,一次性读取出来,那么这个时候肯定就能够避免中文问题了,而这一操作就必须依靠缓冲区操作流完成。对于缓冲区的读取在IO包中定义了两种类:BufferedInputStream,BufferedReader,但是考虑到本次操作有中文的问题,肯定使用BufferedReader类完成操作。下面就需要观察一下BufferedReader类的继承结构,构造方法,操作方法:

继承结构: java.lang.Object java.io.Reader java.io.BuffereedReader
构造方法: public BuffereedReader(Reader in)
读取操作: public String readLine() throws IOException

之所以选择BufferReader类操作提供的readLine()方法,这个方法可以读取一行数据以回车为准。

image-20210819191629741

使用BufferedReader进行数据读取

package com.day15.demo;
​
import java.io.BufferedReader;
import java.io.InputStreamReader;
​
public class BufferReaderDemo {
    public static void main(String[] args) throws Exception{
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入");
        //默认的换行模式是BufferReader最大的缺点
        String str = bufr.readLine();//接受输入信息,默认使用回车换行
        System.out.println(str);
    }
}

对输入的数据进行验证,判断是否是数字

package com.day15.demo;
​
import java.io.BufferedReader;
import java.io.InputStreamReader;
​
public class BufferReaderDemo {
    public static void main(String[] args) throws Exception{
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入年龄");
        //默认的换行模式是BufferReader最大的缺点
        String str = bufr.readLine();//接受输入信息,默认使用回车换行
        if(str.matches("\\d{1,3}"))
            System.out.println(str);
        else
            System.out.println("输入数据有误!");
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。