Java基础IO流(一)
IO概念:
大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为"流",程序允许通过流的方式与输入输出设备进行数据传输。Java中的"流"都位于java.io包中,成为IO(输入输出)流。
IO分类:
IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可以分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据。在IO包中,字节流的输入输出流分别用java.io.InputStream 和 java.io.OutputStream表示,字符流的输入流分别用java.io.Reader 和 java.io.Writer表示,如图:

提示:
- 输入流:InputStream或者Reader:从文件中读到程序中;
- 输出流:OutputStream或者Writer:从程序中输出到文件中;
下面是一些InputStream的常用方法:

下面是一些OutputStream的常用方法:

入门案例中比较重要的语句:
1.FileInputStream in = new FileInputStream("test.txt");
解析1:创建一个文件字节输入流,接下来可以用in.read()来读取test.txt中的字节,输出的是整型(字节),想获得具体字符需要在输出前加上强制转换(char)后才能输出字符类型。
2.FileOutputStream out = new FileOutputStream("example.txt");
解析2:创建一个文件字节输出流(程序运行后,会在当前目录下生成一个新的文本文件example.txt),接下来可以定义字符串然后把字符串转换成字节类型就可以利用上面展示的write方法把字节写入到example.txt文件中了。
部分代码展示:
String str = "测试字符";
byte[] b = str.getBytes();
这样就做到了把要输入的字符再调用方法前转换成字节类型。
发现问题:我在按照书上的demo敲代码运行后发现,没办法续写,就是每次都是重新开始写。
解决:后来发现查询后发现,FileOutputStream的构造函数中还有另一个参数是指定是否续写的。源码如下(嘿嘿....经过一段时间的学习已经习惯有看源码的好奇心了,虽然百分之95以上看不怎么懂,但是这次的貌似能看懂一些..哈哈)

Demo(拷贝文件)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class CopyFile {
public static void main(String[] args) {
try {
//创建一个字节输入流,用于读取当前目录下的mp3文件
InputStream is = new FileInputStream("DJ Daniel Kim - Pop Danthology 2012.mp3");
//创建一个文件字节输出流,用于将读取的数据写入copy.mp3中
OutputStream os = new FileOutputStream("copy.mp3");
//定义一个int类型的变量ch,记住每个读取的一个字节
int ch;
//获取拷贝文件前的系统时间
long beginTime = System.currentTimeMillis(); //把每个读取的字节赋值给ch变量,并判断是否读到文件末尾(返回-1)
while((ch = is.read()) != -1){
os.write(ch); //将读到的字节写入文件
} //获取拷贝文件结束时的系统时间
long endTime = System.currentTimeMillis(); System.out.println("文件拷贝用了" + (endTime - beginTime) + "毫秒"); //不要忘记关闭流了(老实说,我在写的时候还是忘记了,对着书再看的时候才发现自己漏了...)
is.close();
os.close(); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

很明显,文件拷贝是相当成功了的!但是吧,换算了一下,这个拷贝时间有点长啊,10M的音乐...不过没关系,我在看书的时候发现背面就是解决这个问题的知识点-----------字节流的缓冲区
抄一下概念把...
上述的代码虽然实现了文件的拷贝,但是一个字节一个字节的读写,需要频繁的操作文件,效率非常低,这就好比从北京运送烤鸭到上海,如果有一万只烤鸭,每次运送一只,就必须运输一万次,这样的效率显然非常低。为了减少运输次数,可以先把一批烤鸭装在车厢中,这样就可以成批的运送烤鸭,这时的车厢就相当于一个临时缓冲区。当通过流的方式拷贝文件的时候,为了提高效率也可以定义一个字节数组作为缓冲区。在拷贝文件时候,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写文件...
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class CopyFileByCache { public static void main(String[] args) { try {
InputStream in = new FileInputStream("DJ Daniel Kim - Pop Danthology 2012.mp3");
OutputStream out = new FileOutputStream("copyByCahe.mp3"); //定义存储(缓存)一定大小字节的字节数组
byte[] buff = new byte[1024];
//定义一个整型len 用来记录read方法返回的读入的字节数或者读到文件末尾的时候返回的-1
int len; long beginTime = System.currentTimeMillis(); int i = 0; while((len = in.read(buff)) != -1){ //输出读入的字节数
i++;
System.out.print(len + "\t");
if (i % 8 == 0){
System.out.println();
} //从b数组中的第一个开始,取len个字节写入到文件中
out.write(buff, 0, len);
} long endTime = System.currentTimeMillis(); System.out.println();
System.out.println("文件拷贝用了" + (endTime - beginTime) + "毫秒"); //我又忘记写关闭流了,写完后对照书发现我又忘记了....
in.close();
out.close(); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

从运行效果可以看出,每次读入出了1024个字节,相对于之前我说速度是之前的1024倍应该没什么问题吧....运行确实快了很多
这里主要运用了InputStream中的read的方法,int read(byte[] b) 【刚开始我一直搞不清楚怎么回事,仔细看返回值才知道,返回的是读入的字节数而不是读入的字节的一个数组,读入的字节的字节数组已经存到了b中】
上述定义中,我定义了1024大小的字节数组,每次最多可以读入1024字节,然后再利用OutputStream中的void wirte(byte[] b,int off,int len)把b数组中的从第off个开始的len个字节写入文件中。
参考书籍:《Java基础入门》传智播客高教产品研发部 编著
Java基础IO流(一)的更多相关文章
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
随机推荐
- C#算法与数据结构之线性结构
线性结构是什么? 线性结构是一种数据结构,它有一对一的关系,就像一个长对,一个接一个,特点是,除第一个元素和最后一个元素外,其它元素前后只有一个元素. 简单示例1: static void Main( ...
- shiro授权测试
shiro-permission.ini 创建存放权限的配置文件shiro-permission.ini,如下: [users] #用户zhang的密码是1111111,此用户具有role1和role ...
- Python selenium webdriver设置js操作页面滚动条
js2 = "window.scrollTo(0,0);" #括号中为坐标 当不知道需要的滚动的坐标大小时: weizhi2 = driver.find_element_by_id ...
- 关键字提取算法TF-IDF
在文本分类的学习过程中,在“如何衡量一个关键字在文章中的重要性”的问题上,遇到了困难.在网上找了很多资料,大多数都提到了这个算法,就是今天要讲的TF-IDF. 总起 TF-IDF,理解起来相当简单,他 ...
- 《http权威指南》读书笔记17
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- [Postman]排除API请求(9)
可能存在API无法运行或出现意外行为的情况.如果您没有收到任何回复,邮递员将显示有关连接服务器时出错的消息. 有关错误可能原因的更多详细信息,请打开Postman Console.它有关于故障的详细信 ...
- Redis数据结构以及应用场景
1. Redis数据结构以及应用场景 1.1. Memcache VS Redis 1.1.1. 选Memcache理由 系统业务以KV的缓存为主,数据量.并发业务量大,memcache较为合适 me ...
- SpringBoot+logback实现日志打印
logback介绍 logback是一款开源的日志框架,内核重写了,是基于log4j基础进行改良的.其官网为logback.qos.ch.logback在性能上有很大提升,拥有更多特性. logbac ...
- Netty Decoder:ByteToMessageDecoder
1. ByteToMessageDecoder 这个类是解码器的基类,其中描述了解码器基本的工作方式和实现原理::还定义了一个解码的抽象方法decode,这个方法由业务实现,负责将一段字节数据解码为具 ...
- 【app】Hybrid?Native?不知道你就out了!
Hybrid?是个啥? 相信大家在平常生活中也会经常见到这个词,比如现在比较火的hybrid汽车(混合动力汽车) 那如果是针对于App而言呢? 那就要从App的分类说起了 目前主流应用程序大体分为三类 ...