第57节:Java中流的操作以及编码解码

时间:2022-08-28 10:50:21

第57节:Java中流的操作以及编码解码

我的博客:

https://huangguangda.cn/

https://huangguangda.github.io/

前言:

编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为coding,逆过程为解码.编码时用代码表示的,解码为Decoding,有了编码就有相关的编码表,是对生活中的文件和计算机进行二进制的对应关系.

ascii,GB2312,unicode,UTF-8

把文字进行转变为二进制位编码,把二进制转变为文字为解码.

把字符串转变为字节数组为编码,把字节数组转变为字符串为解码.字符串的表示为:string,而字节数组的表现形式为byte[],

string-->byte[]: 字符串变字符数组,使用getBytes()方法,字节数组变字符串,使用new String((byte[]))方法.

java.langstring

java.lang.object->java.lang.string

实现的接口:

serializable,charsequence,comparable<string>

public final class String extends Object

implements Serializable, Comparable<String>, CharSequence

String代表字符串,字符串是常量,字符串的值在创建之后就不能更改,只有字符串缓冲区可以支持可变的字符串.

string对象是不可以变的,但是可以共享.

String str = "abc";

=

char data[] = ['a', 'b', 'c'];

String str = new String(data)

String类的方法可以用来查询单个字符,进行比较字符串,提取字符串等等.字符串的串联可以通过StringBuilderStringBuffer的类来实现.而字符串的转换可以通过toString的方法来实现.

String类表示字符串类型,表示一个UTF-16格式的字符串.

import java.io.UnsupportedEncodingException;
public class EnDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "abc";
byte[] buf1 = str.getBytes("utf-8");
String s1 = new String(buf1,"utf-8");
System.out.println(s1);
}
}

实例:

public class CutStringTest {
public static void main(String[] args){
String str = "你好aa,谢谢";
byte[] buf = str.getBytes("GBK");
for (int i = 0; i < buf.length; i++) {
String s = cutString(str,i+1);
System.out.println(str+",截取"+(i+1)+"个结果是:"+s);
}
int len = 5;
String s = cutString(str,len);
System.out.println(s);
}
public static String cutString(String str,int len) throws UnsupportedEncodingException {
// 中文由两个字节组成
// 将字符串编码成字节数组
byte[] buf = str.getBytes("GBK");
int count = 0;
// 对数组进行遍历, 从截取位置开始往回遍历
for(int i = len -1; i >= 0; i--){
// 判断最后的截取位是否是负数
if(buf[i]<0){
count++;
}else{
break;
}
}
// 判断奇偶数
if(count%2==0){
return new String(buf, 0, len);
}else{
return new String(buf,0,len-1);
// 舍弃最后一个。
}
return null;
}
}

联通:

第57节:Java中流的操作以及编码解码

移动:

第57节:Java中流的操作以及编码解码

public class Test {
public static void main(String[] args) {
String str = "联通";
byte[] buf = str.getBytes();
// 二进制
for(byte b : buf){
System.out.println(Integer.toBinaryString(b&255));
}
}
}

第57节:Java中流的操作以及编码解码

字符流的缓冲区

public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
BufferedReader bufr = new BufferedReader(new FileReader("Test.java"));
String line = null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
bufr.close();
}
}

readLine和缓冲区

BufferedReader();字符数组 fr.read(char[]);

FileReader(); read()字符

readLine(); 一次读取一行

readLine():

调用缓冲区的read方法,是将读取到的字符存储到另一个容器,当读取到终止符时,就将临时容器中存储的数据转换为字符串返回.

缓冲区:

使用底层流对象从具体设备上获取数据,并将存储到缓冲区中的数据内,通过缓冲区中read()方法,可以从缓冲区中获取具体的字符数据,可以提高效率,如果用read()方法读取字符数据,并存储到另一个容器中,直到读取到了换行符,这时另一个容器的临时存储的数据就会换成字符串返回,就会形成readLine()的功能.

实例:

自定义一个字符流缓冲区,用来缓冲字符数据,从而提高效率,可以使用缓冲区数据的方法.

缓冲区应该具备什么?

1,要有数组。

2,对数组进行操作,对数组操作一定要有角标。

第57节:Java中流的操作以及编码解码

第57节:Java中流的操作以及编码解码

public class MyBufferedReader {
private Reader r;
// 定义一个字符数组,作为缓冲区。
private char[] buf = new char[1024];
// 定义了一个索引,用于操作数组中的元素。
private int index = 0;
// 定义了一个变量,用于记录读取字符的个数。
private int count = 0; // 需要一初始化就具备一个流对象。
public MyBufferedReader(Reader r) {// 可以对Reader的所有子类进行高效读取。
this.r = r;
} public int read() throws IOException { /*
* 1,需要先通过流对象从底层设备上获取一定数据的数据到缓冲区数组中。 使用流对象read(char[]);
*/
//如果count记录字符个数的变量为0,说明缓冲区已经没有字符数据。
if(count==0){
//需要从设备上获取一定数量的数据存储到缓冲区中,并用count记录存储字符的个数。
count = r.read(buf);
//每取一次新的数据,就需要将角标归0.
index = 0;
}
//如果count小于0,说明到-1,没有数据了,程序直接返回-1.
if(count<0){
return -1;
}
//从缓冲区中取出一个字符。
char ch = buf[index];
//角标自增。
index ++;
//计数器要自减。
count --; return ch;
} public String readLine() throws IOException{
//1,定义一个临时容器。
StringBuilder sb = new StringBuilder(); //2,调用本类中的read方法,从缓冲区中读取一个字符,存储到临时容器中。
//存的时候要注意:必须判断,如果是行终止符就不要存储了。就将临时容器中的
//字符转成字符串返回。 int ch = 0;
while((ch=this.read())!=-1){
if(ch=='\r'){
continue;
} if(ch=='\n'){
return sb.toString();
} sb.append((char)ch);//将读取到的字符数字转成char类型,存储到sb中。 } //万一文本中最后以后没有行终止符,判断一下sb中是否有内容,如果有则返回。
if(sb.length()!=0){
return sb.toString();
} return null;
} // 关闭流资源。
public void close() throws IOException {
// 其实内部就是关闭具体的流。
r.close();
}
}
public class MyBufferedReaderDemo {

	/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 验证自定义的缓冲区。
MyBufferedReader myBufr = new MyBufferedReader(new FileReader("dashucoding\\1.txt")); String line = null; while((line=myBufr.readLine())!=null){
System.out.println(line);
} myBufr.close();
}
}

字节流:

FileInputStream FileOutputStream

BufferedInputStream BufferedOutputStream

字符流:

FileReader FileWriter

InputStreamReader OutputStreamWriter

BufferedReader BufferedWriter

public class ReadDemo {
public static void main(String[] args) throws IOException { /*
* 思路:
* 将数据存储到的文件
* 怎么获取数据来源呢?键盘录入怎么弄呢?
* 键盘录入是输入
* 在System类找到了标准输入流
* System.in 对应的类型是InputStream。字节输入流。
*/
//获取了键盘录入的输入流对象。可以不用关闭。
InputStream in = System.in; int ch = in.read();
System.out.println(ch); int ch1 = in.read();
System.out.println(ch1); int ch2 = in.read();
System.out.println(ch2); int ch3 = in.read();
System.out.println(ch3); }
}

第57节:Java中流的操作以及编码解码

第57节:Java中流的操作以及编码解码

读取的:

第57节:Java中流的操作以及编码解码

此抽象类表示字节输入流的所有类的超类

字节输入流转成字符输入流

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

第57节:Java中流的操作以及编码解码

public class DataToFileTest {

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

		//键盘录入。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//目的是文件。
// FileWriter fw = new FileWriter("dashucoding\\key.txt");
// BufferedWriter bufw = new BufferedWriter(fw);
BufferedWriter bufw = new BufferedWriter(new FileWriter("dashucoding\\key.txt")); String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line)){
break;
}
bufw.write(line);
bufw.newLine();
bufw.flush();
} bufw.close();
}
}

IO流

操作的数据是数据源还是数据

源: InputStream Reader

目的: OutputStream Writer

要操作的设备是字节还是文本

源: 字节:InputSteam 文本:Reader

目的: 字节:OutputSteam 文本:Writer

具体设备:

源设备: 硬盘:文件File,内存:数组,字符串,键盘:System.in,网络:Socket

目的设备: 硬盘:文件File,内存:数组,字符串,屏幕:System.out,网络:Socket

需求

源:字符串,目的:文件, OutputStream, Writer

FileWriter fw = new FileWriter("a.txt");
fw.write(string);

高效

BufferedWriter bw= new BufferedWriter(new FilewWriter("a.txt"));
bw.write(string);
bw.newLine();
bw.flush();

复制文本文件

源:InputStream Reader

目的:OutStream Writer

(可有过滤需求)

FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");

高效

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String line = br.readLine();
line = line.replace("dashucoding","达叔小生");
bw.write(line);

读取键盘录入到文件中(一般都是文本)

源: InputStream Reader

目的: OutputStream Writer

InputStream in = System.in;
FileWriter fw = new FileWriter("a.txt"); byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
fw.write(str);

字节转字符 InputStreamReader

InputStreamReader isr=new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");

高效

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt");

读取文件到屏幕

FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;
System.out.println();

第57节:Java中流的操作以及编码解码

第57节:Java中流的操作以及编码解码

第57节:Java中流的操作以及编码解码

读取文件到文本数据,将数据按照utf-8存储到文件中

FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");

第57节:Java中流的操作以及编码解码

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8"));

达叔小生:往后余生,唯独有你

You and me, we are family !

90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通

简书博客: 达叔小生

https://www.jianshu.com/u/c785ece603d1

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

第57节:Java中流的操作以及编码解码的更多相关文章

  1. day8&lowbar;文件操作及编码解码

    一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...

  2. Java中流的操作练习

    文件中的学生信息 学生信息存储在TXT文件中,我们需要对信息进行基本的,增.删.改.查,全部显示操作. 1.学生类/Student package com.yujiao.student; public ...

  3. Java文件读写操作指定编码方式防乱码

    读文件:BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Re ...

  4. Java文件读写操作指定编码方式。。。。。

    读: File file=new File(this.filePath);BufferedReader br=new BufferedReader(new InputStreamReader(new ...

  5. java中文乱码解决之道(六)-----javaWeb中的编码解码

    在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...

  6. java中文乱码解决之道(六)—–javaWeb中的编码解码

    在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...

  7. java&period;io中流的操作:字节流、字符流

    java.io中流的操作:字节流.字符流(1)使用File类打开一个文件(2)通过字节流或字符流的子类指定输出的位置(3)进行读/写操作(4)关闭输入/输出 1.字节流:主要是byte类型数据,以by ...

  8. 第69节&colon;Java中数据库的多表操作

    第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...

  9. 第68节&colon;Java中的MYSQL运用从小白到大牛

    第68节:Java中的MYSQL运用从小白到大牛 前言 学习java必备要求,学会运用!!! 常见关系化数据库 BootStrap是轻量级开发响应式页面的框架,全局css组件,js插件.栅格系统是将页 ...

随机推荐

  1. 【基于WPF&plus;OneNote&plus;Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  2. sublime的插件安装

    如何将Emmet安装到到 Sublime text 3?   看清楚哦~~这是Sublime text 3不是2的版本,两者的安装还是有区别的,下面的方法是我感觉比较简单的,其他的要命令什么的感觉太复 ...

  3. SQL&sol;T-SQL实例参考

    ,D.[Score] B_Score ,'Distince'= CASE WHEN C.Score > D.Score THEN C.[Score] - D.[Score] WHEN C.Sco ...

  4. Shiro权限控制框架

    Subject:主体,可以看到主体可以是任何可以与应用交互的"用户": SecurityManager:相当于SpringMVC中的DispatcherServlet或者Strut ...

  5. windows&OpenCurlyDoubleQuote;画图”工具用法

    图片编辑工具不少,photoshop功能强大,但是并不是那么容易掌握.而且,倘若一个简单的图片处理问题就使用这么强大的工具,有点“杀鸡焉用牛刀”的意思,要知道只打开photoshop就需要一段等待时间 ...

  6. (转载)prepare函数的学习,我要学习php第二天

    (转载)http://www.boyuan78.com/htm/company/2012_1030_60.html prepare函数的学习,我要学习php第二天 $mysqli = new mysq ...

  7. easyui 实现Tooltip

    $('#btnAddr').tooltip({ content: $('<div class="table"></div>'), //弹出收件地址 show ...

  8. 运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)

    上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd ...

  9. python并发&lowbar;进程&lowbar;multiprocessing

    多进程基础, 主要是用了 multiprocessing模块 : 在一个python进程中开启子进程,start方法和并发效果. import time from multiprocessing im ...

  10. ZooKeeper集群详细安装教程

    1. 安装JDK 1.1 官网下载JDK 进入网址<a href="http://www.oracle.com/technetwork/java/javase/downloads/jd ...