Java - IO 内存流和打印流
IO 内存流和打印流操作
字符编码
- 计算机中所有的信息组成都是二进制数据,所有能够描述的中文文字都是经过处理后的结果;所有的语言文字都会使用编码来进行描述,例如:ASCII码
常见编码
GBK/GB2312:
- 中文的国标编码
- GBK包含有简体中文与繁体中文两种,而GB2312只包含简体中文
ISO-8859-1:
- 国际编码
- 可以描述任何的文字信息
UNICODE:
- 十六进制编码
- 任何文字信息都用十六进制表示,会导致无用数据过多
UTF-8:*
- 融合ISO8859-1和UNICODE两种编码的特点
字符乱码
本质:
- 编码与解码的字符集不统一
列出系统的所有环境变量
public class TestDemo {
public static void main(String [] args) throws IOException {
System.getProperties().list(System.out);
}
}
- 输出结果
file.encoding=UTF-8
代表系统环境默认的字符集编码为:UTF-8
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"demo.txt");
OutputStream out = new FileOutputStream(file);
out.write("华为".getBytes());// getBytes() > 无转码
out.close();
}
}
上述是以默认的系统编码方式进行输出
华为
可以看出来,利用系统默认的编码方式(不转码)编码输出,在用系统的编码方式解码,不会出现乱码现象
public class TestDemo {
public static void main(String [] args) throws IOException {
File file = new File("F:" + File.separator +
"demo" + File.separator +
"demo.txt");
OutputStream out = new FileOutputStream(file);
out.write("华为".getBytes("ISO8859-1"));// getBytes() > 无转码
out.close();
}
}
我们利用getBytes()方法将进行转码为ISO8859-1编码方式输出
??
由结果看出,系统使用GB2312进行解码,而文件是使用ISO8859-1进行编码,编码和解码的字符集不同由此导致了 乱码现象 的出现
内存操作流
- 在不产生新文件的情况下;利用内存流来实现输入与输出的操作
字节内存流:
public class ByteArrayInputStream
extends InputStream
public class ByteArrayOutputStream
extends OutputStream
ByteArrayInputStream
- 构造方法
public ByteArrayInputStream(byte [] buf)
将要操作的数据设置到内存输入流
ByteArrayOutputStream
- 构造方法
public ByteArrayOutputStream()
内存输出流(输出数据 )
toByteArray()*
public byte [] toByteArray()
- 将所有保存在内存中的字节数据变为字节数组存在
- 将两个文件利用 toByteArray() 进行合并输出*
public class TestDemo {
public static void main(String [] args) throws IOException {
File fileA = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
File fileB = new File("F:" + File.separator + "demo" + File.separator + "data.txt");
InputStream inA = new FileInputStream(fileA);
InputStream inB = new FileInputStream(fileB);
ByteArrayOutputStream output = new ByteArrayOutputStream();
int temp = 0 ;
while((temp = inA.read()) != -1) { //读取A数据
output.write(temp);
}
while((temp = inB.read()) != -1) { //读取B数据
output.write(temp);
}
// 读取A,B文件结束后,将内存中的所有字节数据转为字节数组
byte [] data = output.toByteArray();
inA.close();
inB.close();
output.close();
System.out.println(new String(data));
}
}
实例
public class TestDemo {
public static void main(String [] args) throws IOException {
String str = "Hello,World!";
InputStream in = new ByteArrayInputStream(str.getBytes());
// 将所有要读取的数据设置大内存输入流中
OutputStream out = new ByteArrayOutputStream();
// 内存输出流
int temp = 0 ;// 读取到的每一个字节数据
while ((temp = in.read()) != -1) { // 每次读取一个字节数据
out.write(Character.toUpperCase(temp));//字节输出流
// temp数据转大写并输出到内存输出流当中
}
System.out.println(out);
in.close();
out.close();
}
}
字符内存流:
public class CharArrayReader
extends Reader
public class CharArrayWriter
extends Writer
打印流
接触打印流
如果使用OutputStream,输出String字符串数据,就需要将String变为字节数组输出getBytes(),同理boolean也需要变为Byte数据输出……
package helloworld;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
class PrintUtil {
private OutputStream out; // 输出依靠 OutputSteam类
public PrintUtil(OutputStream out) {
this.out = out ; //确定OutputStream的对象是File……或者ByteArray……
}
public void print(int x) throws IOException {
this.print(String.valueOf(x));//将x转为String型
}
public void print(String x) throws IOException {
this.out.write(x.getBytes());
}
public void print(double x) throws IOException {
this.print(String.valueOf(x));//将x转为String型
}
public void println(int x) throws IOException {
this.println(String.valueOf(x));
}
public void println(String x) throws IOException {
this.print(x.concat("\r\n"));
//在String字符串结尾添加字符[concat()]
}
public void println(double x) throws IOException {
this.println(String.valueOf(x));
}
public void close() throws IOException {//关闭输出流
this.out.close();
}
}
public class TestDemo {
public static void main(String [] args) throws IOException {
// 调用PrintUtil类的构造方法,实例化对象
PrintUtil pu = new PrintUtil(
new FileOutputStream(
new File("F:"
+ File.separator + "demo"
+ File.separator + "demo.txt")));
pu.print("Hello,");
pu.println("World!");
pu.println(1+1);
pu.println(1.1+1.1);
pu.close();
}
}
PrintUtil类,则是为了方便打印而设计的一个工具类,在类中,我们通过调用print方法,可以将当前的数据转为String后在转为Byte型数据,可以方便我们的数据输出;避免我们在代码编写过程中浪费时间来设计数据类型转换为Byte字节输出。
打印流
- 为了解决上述的数据输出时的功能不足问题,java.io包提供了一套专门用于输出数据的类:PrintStream(打印字节流) 和 PrintWriter(打印字符流)
PrintStream:字节打印流
- 继承结构
java.lang.Object
java.io.OutputStream
java.io.FileOutputStream
java.io.PrintStream
- 构造方法
PrintStream(OutputStream out)
在PrintStream类中提供了一系列和上述 PrintUtil 类相似的print()、println()方法;这些方法都可支持各种数据类型的输出,同理:使用了PrintStream,那么就可以不用去使用write()字节流输出方法了。
PrintStream类的实现本质上是基于OutputStream类实现的;这类的设计在Java中称为 装饰设计模式 相当于将一个功能不足的操作类,通过某些类的包装实现成功能健全的更好的操作类。
- 实现 PrintStream
public class TestDemo {
public static void main(String [] args) throws IOException {
// 调用PrintStream类的构造方法,实例化对象
PrintStream pu = new PrintStream(
new FileOutputStream(
new File("F:"
+ File.separator + "demo"
+ File.separator + "demo.txt")));
pu.print("Hello,");
pu.println("World!");
pu.println(1+1);
pu.println(1.1+1.1);
pu.close();
}
}
将PrintUtil类删除,使用PrintStream类代替,可以看出操作方法如出一辙。
PrintWrite:字符打印流
Java - IO 内存流和打印流的更多相关文章
- Java IO(Properties/对象序列化/打印流/commons-io)
Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...
- JAVA的IO流:打印流
打印流: 打印流是输出信息最方便的类,注意包含字节打印流PrintStream和字符打印流:PrintWriter.打印流提供了非常方便的打印功能, 可以打印任何类型的数据信息,例如:小数,整数,字符 ...
- java 21 - 12 IO流的打印流
打印流 字节流打印流 PrintStream 字符打印流 PrintWriter打印流的特点: A:只有写数据的,没有读取数据.只能操作目的地,不能操作数据源.(只能写入数据到文件中,而不能从文件中提 ...
- java ->IO流_打印流
打印流的概述 打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式. 打印流根据流的分类: 永远不会抛出IO异常 l 字节打印流 PrintStream l 字符打印流 Print ...
- IO流(03)--序列化流、打印流
序列化流 Java提供了一种对象序列化的机制,用一个字节序列可以表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等信息.字节序列写入到文件中后,就相当于在文件中保存了一个对象信息 ...
- 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】
[缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...
- IO流14 --- 打印流的使用 --- 技术搬运工(尚硅谷)
PrintStream 字节打印流PrintWriter 字符打印流 @Test public void test9() throws Exception { FileOutputStream fos ...
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...
- Java学习笔记43(打印流、IO流工具类简单介绍)
打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...
随机推荐
- injected stylesheet 谷歌扩展插件,造成样式异常
今天在开发的时候,遇到一个问题,就是我们我在写发送广告的功能,然后我用了一个textare文本框,这个时候,发现了一个问题.这个文本框凭空消失了.不见了,我以为是自己的那个样式不小心把这个隐藏掉了后来 ...
- Cortex-A7 MPCore 简介与处理器运行模型
Cortex-A7 MPcore 处理器支持 1~4 核,通常是和 Cortex-A15 组成 big.LITTLE 架构的,Cortex-A15 作为大核负责高性能运算,比如玩游戏啥的,Cortex ...
- android6.0系统Healthd深入分析
概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatteryService用以计算电池电量相关状态信 ...
- 用Python在25行以下代码实现人脸识别
在本文中,我们将看到一种使用Python和开放源码库开始人脸识别的非常简单的方法. OpenCV OpenCV是最流行的计算机视觉库.最初是用C/C++编写的,现在它提供了Python的API. Op ...
- 【STM32-V5】STM32F407开发板开源, 丰富软件资源, 强劲硬件配置, 配套500实例, 10套手册带视频教程2019-12-12
淘宝购买地址:购买地址链接 从2013年5月份发布至今,开发板硬件更新过6个版本,软件资料更新过85次.当前标准库最新版本V8.8,HAL库最新版本V1.1 安富莱微信公共平台,欢迎大家关注(打造高质 ...
- 周末DHU友谊赛(半日游)感想
DHU的校园挺好的啊,感觉教学楼啊,整体环境啊比咱学校好上一些,和大家一起出来有些春(冬)游的意味,食堂也是十分的宽敞,座位好多! 吐槽shu的食堂座位到饭点明显太少,食堂品类好多,shu的吃多了感觉 ...
- HUE Oozie : error=2, No such file or directory采坑记录
HUE Oozie : error=2, No such file or directory采坑记录 1.错误详情 一直都是同一种方式在hue上定义workflow,不知为啥 今天定义的就是不行... ...
- LinuxProbe小结
1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...
- 理解MVVM在react、vue中的使用
理解MVVM在react.vue中的使用 一:什么是MVC.为什么不用MVC 1:MVC的含义: M(modal):是应用程序中处理数据逻辑的部分. V (view) :是应用程序中数据显示的部分. ...
- 阿里巴巴 Kubernetes 能力再获 CNCF 认可 | 云原生生态周报 Vol. 32
作者 | 丁海洋 陈有坤 李鹏 孙健波 业界要闻 阿里巴巴 Kubernetes 技术能力再获 CNCF 认可 CNCF 官网发布博文<Demystifying Kubernetes as ...