IO流—其他流
内存操作流
这个流不关联任何文件,只能在内存中数据,自己在内存中维护着一个缓冲区,我们可以往他维护的缓冲区不断的写入数据,也可以从缓冲区中取出我们写入的数据
ByteArrayOutputStream
ByteArrayInputStream:此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray () 和 toString () 获取数据。内存操作流无需关闭
案例演示:
public class MyTest2 {
public static void main(String[] args) throws IOException {
//ByteArrayOutputStream()
//创建一个新的 byte 数组输出流。
//创建出内存操作流 他维护着一个字节数组来充当缓冲区
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write("好好学习".getBytes());
bos.write("天天向上".getBytes());
bos.write("爱生活".getBytes());
bos.write("爱Java".getBytes());
byte[] bytes = bos.toByteArray();
read(bytes);
}
private static void read(byte[] bytes) throws IOException {
/* ByteArrayInputStream( byte[] buf)
创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。*/
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
byte[] bytes1 = new byte[1024];
int len = bis.read(bytes1);
String s = new String(bytes1, 0, len);
System.out.println(s);
}
}
操作字符数组
CharArrayWrite:此类实现一个可用作字符输入流的字符缓冲区。
CharArrayReader:此类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。
案例演示:
public class MyTest3 {
public static void main(String[] args) throws IOException {
CharArrayWriter charArrayWriter = new CharArrayWriter();
charArrayWriter.write("abc");
charArrayWriter.write("abc");
String s = charArrayWriter.toString();//调用toString()来获取字符数组
System.out.println(s);
char[] chars = charArrayWriter.toCharArray();//调用toCharArray()来获取字符数组
System.out.println(chars);
}
}
操作字符串
StringReader:其源为一个字符串的字符流
StringWriter:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。关闭 StringWriter 无效。此类中的方法在关闭该流后仍可被调用,而不会产生任何IO异常
public class MyTest4 {
public static void main(String[] args) {
StringWriter stringWriter = new StringWriter();
stringWriter.write("abc");
stringWriter.write("abc");
stringWriter.write("abc");
stringWriter.write("abc");
stringWriter.write("abc");
String s = stringWriter.toString();
}
}
ByteArrayOutputStream/ ByteArrayInputStream
ByteArrayInputStream: 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read
方法要提供的下一个字节。关闭 ByteArrayInputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IO异常。
ByteArrayOutputStream:此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和toString() 获取数据。关闭ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
案例演示:将多个mp3文件,拼接成一个mp3文件
public class MyTest {
public static void main(String[] args) throws IOException {
FileInputStream in1 = new FileInputStream("许巍 - 曾经的你.mp3");
FileInputStream in2 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("C:\\Users\\jjh\\Desktop\\歌曲大连唱.mp3");
ArrayList<FileInputStream> list = new ArrayList<>();//创建集合
list.add(in1);
list.add(in2);//把两手哥存入集合
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len=0;
byte[] bytes = new byte[1024 * 8];
//读取两首歌的字节数据,一块先缓存到内存操作流所维护的字节数组中
for (FileInputStream in : list) {
while ((len = in.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
in.close();
}
//取出两首歌的字节数据
byte[] allBytes = bos.toByteArray();
//读取两首歌的字节数据,往硬盘上写
ByteArrayInputStream bis = new ByteArrayInputStream(allBytes);
int len2 = 0;
byte[] bytes2 = new byte[1024 * 8];
while ((len2=bis.read(bytes2))!=-1){
out.write(bytes2,0,len2);
out.flush();
}
out.close();
System.out.println("合并完成");
}
}
打印流
他只关联目的地,不关联源文件。它只能输出,不能读取。
字节打印流
PrintStream(File file) : 创建具有指定文件且不带自动行刷新的新打印流
PrintStream(String fileName) :创建具有指定文件名称且不带自动行刷新的新打印流
案例演示:
public class MyTest {
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream(new File("b.txt"));
//通过创建得来的字节打印流,关联的是文件,那么你是往文件中打印数据
printStream.write("曾梦想仗剑走天涯,看一看世界的繁华".getBytes());
printStream.write("\r\n".getBytes());
printStream.println("曾梦想仗剑走天涯,看一看世界的繁华");
printStream.close();
//System.out 获取出的这个字节打印流,关联的设备是屏幕
PrintStream out = System.out; //关联屏幕 out标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器
out.write("abc".getBytes());
out.print(20000);
out.println(300000);
System.out.println();
out.close();
}
}
字符打印流
PrintWriter 字符打印流
PrintWriter(OutputStream out, boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter。如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作。参数2是是否要开启自动刷新
案例演示1:
public class MyTest2 {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter printWriter = new PrintWriter("c.txt");
printWriter.write("abc");
printWriter.print(100);
printWriter.flush();
printWriter.close();
}
}
案例演示2:
public class MyTest3 {
public static void main(String[] args) throws FileNotFoundException {
// PrintWriter(OutputStream out, boolean autoFlush)
// 通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter printWriter = new PrintWriter(new FileOutputStream("d.txt"), true);
//printWriter.write("abc");//因为没有调上面说的三种方法,不手动刷新的话就不显示
printWriter.println("abc");
printWriter.flush();
printWriter.close();
}
}
案例演示3:打印流复制文本文件
public class MyTest4 {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new FileReader("MyTest.java"));
PrintWriter printWriter = new PrintWriter(newFileOutputStream("MyTest222.java"),true);
String line=null;
while ((line=bfr.readLine())!=null){
printWriter.println(line);//调用了println所以我们不需要手动刷新
}
bfr.close();
printWriter.close();
}
}
随机访问流
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek方法设置。
RandomAccessFile(File file, String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定
mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
"r":以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw":打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws":打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd": 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
案例1:把一首歌用随机访问流复制三份
public class MyTest3 {
public static void main(String[] args) throws IOException {
RandomAccessFile in = new RandomAccessFile("许巍 - 曾经的你.mp3", "rw");
RandomAccessFile out = null;
byte[] bytes = new byte[1024];
int len = 0;
for (int i = 0; i < 3; i++) {
out = new RandomAccessFile((i + 10) + "许巍 - 曾经的你.mp3", "rw");
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
in.seek(0);//把文件指针置于文件的开头
out.close();
}
in.close();
}
}
案例2:歌曲的断点复制
public class MyTest4 {
public static void main(String[] args) throws IOException {
RandomAccessFile in = new RandomAccessFile("许巍 - 蓝莲花.mp3", "rw");
File mbFile = new File("C:\\Users\jjh\\Desktop\\许巍 - 蓝莲花22222.mp3");
RandomAccessFile out = new RandomAccessFile(mbFile, "rw");
//第二次来复制了
String s = new BufferedReader(new FileReader("ls.txt")).readLine();
//读取临时文件
long len2 = Long.parseLong(s);//获取临时文件的长度(向下转型)
if(mbFile.exists()&&mbFile.length()==len2){
//如果临时文件存在而且目标文件的长度和临时文件相等的话继续执行
in.seek(len2);//把指针位置置于len2这样就可以断点下载
out.seek(len2);
}else{
in.seek(0);//设置文件指针的位置
out.seek(0);
}
int len=0;
byte[] bytes = new byte[1024];
int i=1;
try {
while ((len = in.read(bytes)) != -1) {
//i++;
out.write(bytes, 0, len);
/* if(i>=2500){
System.out.println(1/0);
}*/ //这是自己制造的异常情况让复制终止
}
}catch (Exception e){
long filePointer = in.getFilePointer(); //获取文件指针的位置
System.out.println(filePointer);
PrintWriter printWriter = new PrintWriter(new File("ls.txt"));
//创建一个临时文件来记录文件复制的字节数
printWriter.println(filePointer);
printWriter.flush();
printWriter.close();
}
in.close();
out.close();
}
}
其他输入流的串联(顺序流)
SequenceInputStream: 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止
SequenceInputStream(InputStream s1, InputStream s2):通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从SequenceInputStream 读取的字节
案例演示:用顺序流把三首歌拼成一首歌
public class MyTest {
public static void main(String[] args) throws IOException {
FileInputStream in1 = new FileInputStream("许巍 - 曾经的你.mp3");
FileInputStream in2 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileInputStream in3 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("gequ.mp3");//输出
SequenceInputStream sequenceInputStream = new SequenceInputStream(in1, in2);
SequenceInputStream sequenceInputStream1 = new SequenceInputStream(sequenceInputStream, in3);
int len=0;
byte[] bytes = new byte[1024 * 8];
while ((len=sequenceInputStream1.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
out.close();
sequenceInputStream1.close();
}
}
Properties
Properties 继承Hashtable 是一个双列集合,规定键值都是字符串类型
案例演示1:
public class MyTest {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("username", "张三");
properties.setProperty("password", "123456");
String username = properties.getProperty("username");
//当这个键对应的值得没找到,可以返回这个备用值,参数2 可以指定一个备用的值
String pwd = properties.getProperty("password","654321");
System.out.println(username);
System.out.println(pwd);
}
}
案例演示2:把属性集合中的键值对数据写入配置文件中保存 (store())
public class MyTest2 {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.setProperty("username", "张三");
properties.setProperty("password", "123456");
//参数2:是注释 一般给个null 写个默认注释
properties.store(new FileOutputStream("user.properties"),"hehehe");
案例演示3:把配置文件中的键值对数据,再次都会属性集合中
public class MyTest3 {
public static void main(String[] args) throws IOException {
//Properties 读取配置文件,对文件有要求,1.键值对,是 = 拼接 2.属性集合读取到的这个文件的后缀名是以.properties
Properties properties = new Properties();
//读取配置文件
properties.load(new FileInputStream("user.properties"));
System.out.println(properties);
}
}
案例演示4:
public class MyTest04 {
/*我有一个文本文件file.txt,我知道数据是键值对形式的,但是不知道内容是什么。
请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其实为"100"
file.txt文件内容如下:
zhangsan = 90
lisi = 80
wangwu = 85*/
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.load(new FileInputStream("file.txt"));
//先读写这个文件
Set<String> names = properties.stringPropertyNames();
//stringPropertyNames()
//返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。其键或值不是 String 类型的属性被忽略
if (names.contains("lisi")){
properties.setProperty("lisi","100");
properties.store(new FileOutputStream("d.txt"),null);
//最后写入保存
System.out.println(properties);
}
IO流—其他流的更多相关文章
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- IO流03_流的分类和概述
[概述] Java的IO流是实现输入/输出的基础,它可以方便的实现数据的输入/输出操作. Java中把不同的输入/输出源(键盘.文件.网络连接)抽象表述为"流"(Stream). ...
- Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)
1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 ...
- Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01
1. 字符流缓冲流之复制文本文件案例 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 -- 字符转换流 -- InputStreamRe ...
- Java基础知识强化之IO流笔记38:字符流缓冲流之BufferedWriter / BufferedReader使用
1. 字符流缓冲流: 字符流为了高效读写,也提供了对应的字符缓冲流. BufferedWriter:字符缓冲输出流 BufferedReader:字符缓冲输入流 2. BufferedWriter使用 ...
- Java IO 文件与流基础
Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...
- -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...
- IO流--序列化流与反序列化流
IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): ...
- Java 基础 IO流(转换流,缓冲)
一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...
- IO流(字节流,字符流,缓冲流)
一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: 二:字符字节 ...
随机推荐
- C# vb .NET读取多个识别条形码线性条码
有时候,我们不确定数据源图片中到底有多少个条码,这些条码有可能是同一个类型的,也可能是不同类型的,如何在C#,vb等.NET平台语言里实现快速准确读取呢?答案是使用SharpBarcode! Shar ...
- PIE SDK剔除栅格块算法
1.算法功能简介 剔除栅格块即剔除栅格小斑块功能.一幅影像图层某一区域存在碎小斑块,需要对其按照一定的条件进行剔除. PIE支持剔除栅格快算法功能的执行,下面对该算法功能进行介绍. 2.算法功能实现说 ...
- 软件开发的生产力vs质量
在<人月神话>里看到引用的一篇论文,<没有银弹:软件工程的本质性与附属性工作>(英语:No Silver Bullet-Essence and Accidents of Sof ...
- IOS—— strong weak retain assign 学习
转自:http://wenzongliang.iteye.com/blog/1746604 简单讲strong等同retain weak比assign多了一个功能,当对象消失后自动把指针变成nil,好 ...
- Java面经入口(持续更新...)
大数据面经 https://zhuanlan.zhihu.com/go-for-it Java 基础知识复习 您可能不知道Java基础40道常见面试题及详细答案 hashcode详解 Java St ...
- ASP.NET Core MVC 502 bad gateway 超时如何处理
在网页程序运行需要较长时间运行的时候,ASP.NET Core MVC会出现502 bad gateway请求超时情况.一般默认的超时时间都比较短,我们需要在 web.config 中配置一下.其中 ...
- 查看LINUX系统的配置
# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...
- BeyondCompare4完美"破解"
原文:https://blog.csdn.net/weixin_39298366/article/details/84390224 将以下操作保存为bat文件,然后双击运行即可. reg delete ...
- VS操作中遇到的问题及解决
1.无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 2. /ZI ...
- 201671030126 赵佳平 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于那个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 掌握软件项目评审会流程:反思 ...