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流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: 二:字符字节 ...
随机推荐
- sql server 中取前n行字段最大值问题
例子 取前三行最大ID ID from Students)AS A 这样写得到的却是整个表的最大ID值,并不是我们需要的值 要在句中加入order by ID ID from Students ord ...
- [個人紀錄] postgre dump出table 再用psql還原
--dump tablepg_dump --host #server --port 5432 --username #username --format plain --ignore-version ...
- Python - 基本数据类型 - 第二天
Python3 基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型& ...
- Asp.net core 简单介绍
Asp.net core 是一个开源和跨平台的框架,用于构建如WEB应用,物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序.asp.net core 应用可运行.net和.net ...
- PIE创建带压缩的栅格数据集
这段时间我一直在研究如何用PIE创建带压缩的栅格数据集,由于我在比赛中使用的原始影像大小普遍都在300M以上,软件加载较慢,因此希望能对原始影像进行压缩,加快加载时间. 首先,该方法的关键是修改Dat ...
- asp.net+jquery 制作text editor
利用jquery制作的文本编辑器,直接给源码吧,相信大家都能看懂.点此下载
- 微信小程序-获取当前位置和城市名
微信小程序-获取当前城市位置 1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数) ...
- phpstorm分别在Mac和Windows下启动命令行,并启用ssh
Mac:在terminal下运行 sudo -i 输入密码 就可以用ssh IP:端口 命令行登录了 DAssist是一个命令行开发辅助,可直接在系统命令行工具中使用,Linux和MacOS等自带 ...
- elastalert docker安装
基于对elasticsearch中数据监控需要,我尝试了sentinl和elastalert两款工具.虽然elastalert是纯文本,但易配置管理.elk自带的watch需要付费才可使用. 6.2x ...
- 跳过__wakeup()魔法函数
__wakeup():将在序列化之后立即被调用. 漏洞原理:当反序列化字符串中,表示属性个数的值大于其真实值,则跳过__wakeup()执行. 参考题目:xctf-unserialize3 h ...