JavaIO——内存操作流、打印流
我们之前所做的都是对文件进行IO处理,实则我们也可以对内存进行IO处理。我们将发生在内存中的IO处理称为内存流。
内存操作流也可分为两类:字节内存流和字符内存流。
(1)ByteArrayInputStream 和 ByteArrayOutputStream
构造函数:
public class ByteArrayOutputStream extends OutputStream
public class ByteArrayInputStream extends InputStream
(2)CharArrayInputStream 和 CharArrayOutputStream
构造函数:
public class CharArrayWriter extends Writer
public class CharArrayReader extends Reader
由此我们可以得出内存流的继承关系:
利用内存流实现大小写转换:
-
package myIO;
-
-
import java.io.ByteArrayInputStream;
-
import java.io.ByteArrayOutputStream;
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.io.OutputStream;
-
-
/*通过内存流实现大小写转换
-
* */
-
public class Test3 {
-
public static void main(String[] args) throws IOException {
-
String string = "hello world,hello lemon";
-
//实例化InputStream对象,进行实例化时应将需要操作的数据保存在内存中,读取的将是设置的内容
-
InputStream inputStream = new ByteArrayInputStream(string.getBytes());
-
//实例化OutputStream对象
-
OutputStream outputStream = new ByteArrayOutputStream();
-
int temp= 0;
-
//判断是否读完
-
while((temp = inputStream.read())!=-1) {
-
//对每个字节进行处理,处理之后存在于OutputStream类中
-
//进行大小写转换
-
outputStream.write(Character.toUpperCase(temp));
-
}
-
//直接对outputStream对象进行输出
-
System.out.println(outputStream);
-
//关闭流
-
inputStream.close();
-
outputStream.close();
-
-
}
-
}
(2)内存流的操作
内存流有个很小的功能就是实现两个文件的合并操作(对很小的文件而言)。
内存流最核心的就是:将所有OutputStream输出的程序保存在了程序中,所以可以利用这一特征来进行处理。
-
/*
-
* 实现两个文件的合并处理
-
* */
-
public class Test3{
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
//指明要合并两个文件的地址
-
File[] files = new File[] {
-
-
new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt")
-
,new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test2.txt")};
-
String[] data = new String[2];
-
for(int i = 0 ;i <files.length;i++) {
-
data[i] = readFile(files[i]);
-
}
-
StringBuffer stringBuffer = new StringBuffer();
-
String contentA [] = data[0].split(" ") ;
-
String contentB [] = data[1].split(" ") ;
-
for (int i = 0; i < contentA.length ; i++) {
-
stringBuffer.append(contentA[i]).append("(").append(contentB[i]).append(")").append(" ") ;
-
}
-
System.out.println(stringBuffer);
-
}
-
//读取文件内容,使用File对象因为其包含完整的路径信息
-
public static String readFile(File file) throws IOException {
-
if(file.exists()) {
-
InputStream inputStream = new FileInputStream(file);
-
//没有向上转型,因为后续要使用toByteArray()方法
-
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-
int temp = 0;
-
byte[] data = new byte[10];
-
while((temp = inputStream.read(data))!=-1) {
-
//将数据保存在byteArrayOutputStream
-
byteArrayOutputStream.write(data,0,temp);
-
}
-
byteArrayOutputStream.close();
-
inputStream.close();
-
return new String(byteArrayOutputStream.toByteArray());
-
}
-
return null;
-
}
-
}
2、打印流
打印流的本质是解决OutputStream的缺陷,因为若想将非二进制的数据通过程序向终端目标直接输出信息的话,OutputStream有如下缺陷:所有的数据都要转换成字节数组,若要输出int、double更是不方便。
(1)进行简单打印流的设计
-
/*
-
* 设计简单打印流
-
* */
-
class PrintDesign{
-
private OutputStream outputStream;
-
//构造函数
-
//有外部传入要输出的目的终端
-
public PrintDesign(OutputStream outputStream) {
-
super();
-
this.outputStream = outputStream;
-
}
-
//实现输出的功能(传入参数为字符串)
-
public void print(String string) throws IOException {
-
this.outputStream.write(string.getBytes());
-
}
-
//实现换行功能
-
public void println(String string) throws IOException {
-
this.print(string+"\r\n");
-
}
-
//传入参数为int
-
public void print(int data) throws IOException {
-
this.print(String.valueOf(data));
-
}
-
public void println(int data) throws IOException {
-
this.print(String.valueOf(data)+"\r\n");
-
}
-
}
-
public class Test3{
-
public static void main(String[] args) throws IOException {
-
String singal = File.separator;
-
PrintDesign printDesign = new PrintDesign(new FileOutputStream(
-
new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt")));
-
printDesign.println("姓名:");
-
printDesign.print("lemon");
-
printDesign.println("年龄:");
-
printDesign.print(20);
-
}
-
}
我们可以发现经过简单的处理使得OutputStream的功能变得更加强大了,其实我们所做的工作只不过是对OutputStream做了一个封装而已。实则java中提供有专门的打印流处理类:字节打印流rintStream、字符打印流PrintWriter.
(2)认识打印流处理类
字节打印流:public class PrintStream extends FilterOutputStream
构造函数:public PrintStream(OutputStream out)
字符打印流:public class PrintWriter extends Writer
构造函数:public PrintWriter(OutputStream out)
public PrintWriter (Writer out)
打印流的设计模式属于装饰者设计模式:核心是某个类的功能,但是为了得到更好的操作效果,让其支持的功能更多一些。
(3)打印流的使用
在后续的应用中字符打印流(PrintWriter)引用比较对,因为它可以接收Writer和OutputStream两种类型的参数;而字节打印流(PrintStream)只可接收OutputStream类型的参数。
-
/*
-
* 字符打印流的使用
-
* */
-
public class Test3{
-
public static void main(String[] args) throws FileNotFoundException {
-
String singal = File.separator;
-
PrintWriter printWriter = new PrintWriter(
-
new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt"));
-
printWriter.print("班级:");
-
printWriter.println("数学152");
-
printWriter.println("年龄:");
-
printWriter.println(20);
-
printWriter.close();
-
-
}
-
}
(4)格式化输出
我们在C语言遇到一个printf()函数,这个函数在输出的时候可以使用一些占位符,例如:字符串(%s)、数字(%d)、小数 (%f)、字符(%c)等。从JDK1.5开始,PrintStream类中也追加了此种操作。
格式化输出:public PrintStream printf(String format, Object ... args)
-
/*
-
* 格式化输出
-
* */
-
public class Test3{
-
public static void main(String[] args) throws FileNotFoundException {
-
String name = "lemon";
-
int age = 20;
-
double salary = 10.3;
-
String singal = File.separator;
-
PrintStream printStream = new PrintStream(new FileOutputStream(
-
new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test2.txt")));
-
printStream.printf("姓名:%s,年龄:%d,工资:%f",name,age,salary);
-
printStream.close();
-
}
-
}
JavaIO——内存操作流、打印流的更多相关文章
- IO流的Properties集合,序列化流与反序列化流,打印流及commons-IO
内容介绍 Properties集合 序列化流与反序列化流 打印流 commons-IO Properties类 Properties类介绍 Properties 类表示了一个持久的属性集.Proper ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)
一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...
- java 转换流 打印流 数据流
转换流 InputStreamReader 和 OutputStreamWriter处理流用于将字节流转化成字符流,字符流与字节流之间的桥梁InputStreamReader 的作用是把 InputS ...
- Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类
一.Properties 类(java.util) 概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- python3 subprocess 内存操作视频转换流格式
import subprocessout = open('./tmp/sss.mp4','rb').read()p = subprocess.Popen(["./ffmpeg",& ...
- 021.10 IO流 打印流
内容:PrintStream:字节流 PrintWriter:字符流 PrintStream public static void main(String[] args) throws IOEx ...
- 34 io流-- 打印流和对象流
概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...
随机推荐
- 非对称加密和linux上的 ssh-keygen 工具使用
rsa :创造非对称加密的三个人名.原理是两个1024到2048之间的素数,以此为乘积.等... a*b=c 一般a*b为私钥端,c为公钥端.因为 c非常难算出a和b. ssh-keygen -t ...
- Ubuntu16.04安装apache hive
0.常规配置操作可参照以下网址: 0.1 Ubuntu安装hive,并配置mysql作为元数据库http://dblab.xmu.edu.cn/blog/install-hive/ ------以下为 ...
- ELK集群之logstash(5)
Logstash工作原理 Logstash事件处理有三个阶段:inputs → filters → outputs.是一个接收,处理,转发日志的工具.支持系统日志,webserver日志,错误日志 ...
- k8s入坑之路(9)k8s网络插件详解
Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...
- Java多线程 | 02 | 线程同步机制
同步机制简介 线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ...
- sklearn之转换器和估计器
sklearn之转换器和估计器 转换器 估计器(sklearn机器学习算法的实现) 转换器 想一下之前做的特征工程的步骤? 实例化(实例化的是一个转换器类(Transformer)--特征工程的父类) ...
- mybatis中<![CDATA[]]>和转义字符
在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...
- 天冷了,任务栏养只猫吧「GitHub 热点速览 v.21.46」
作者:HelloGitHub-小鱼干 运动能带来热量,盘猫也是,RunCat_for_windows 是一只奔跑在任务栏的猫,一定能给你的电脑带来一丝冬日的温暖.当然送温暖的除了任务栏小猫咪之外,还有 ...
- dart系列之:dart类中的泛型
目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合 ...
- [luogu7116]微信步数
先判定无解,当且仅当存在一个位置使得移动$n$步后没有结束且仍在原地 暴力枚举移动的步数,记$S_{i}$为移动$i$步(后)未离开范围的点个数,则恰好移动$i$步的人数为$S_{i-1}-S_{i} ...