一、I/O操作(缓存流,数据流,对象流)
一、缓存流
以介质是硬盘为例子说明,字节流和字符流的缺点:
每次读写的时候,都会访问硬盘,如果读写频率比较高的时候,性能不佳。为了解决问题,采用缓存流。
缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中区读取。
缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区达到一定的量,才把这些数据,一起写入到硬盘中去,按照这种方式,就不会像字节流,字符流那样每次写一个字节都访问硬盘,减少了I/O操作。
1、使用缓存流读取数据
BufferedReader缓存字符输入流,可以一次读取一行数据
package stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; public class TestStream{
public static void main(String[] args){
File f=new File("d/source/LOL.exe");
try(FileReader fr=new FileReader(f);BufferedReader br=new BufferedReader(fr);){
while(true){
String line=br.readLine();//一次读一行。
if(line==null)break;
System.out.println(line);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
2、使用缓存流写入数据
PrintWriter缓存字符输出流,可以一次写出一行数据
package stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; public class TestStream{
public static void main(String[] args){
File f=new File("d/source/LOL.exe");
try(FileWriter fw=new FileWriter(f);PrintWriter pw=new PrintWriter(fw);){
{
pw.println("hello world");
pw.println("hello kitty");
}
}catch(IOException e){
e.printStackTrace();
}
}
}
3、使用flush
有时候,需要立即把数据写入到硬盘,而不是等缓存满了才写进去,这时候就要用flush。
package stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream{
public static void main(String[] args){
File f=new file("d/source/LOL.exe");
//创建文件字符流
//缓存流必须建立在一个存在的流的基础上
try(FileWriter fr=new FileWriter(f);PrintWriter pw=new PrintWriter(fr);){
//向文件LOL.exe中写入三行语句。
pw.println("hello world");
//强制把缓存中的数据写入硬盘,无论缓存是否已满
pw.flush();
pw.println("I love play lol");
pw.flush();
pw.println("I love play dota");
pw.flush();
}catch(IOException e){
e.printStackTrace();
}
}
}
二、数据流
数据输入流:DataInputStream
数据输出流:DataOutputStream
数据流的方法:writeUTF(),readUTF()可以进行数据的格式化顺序读写
要用DataInputStream读取一个文件,这个文件必须由DataOutStream写出的,不然会抛出EOFException异常。也就是说这两个是成对出现的
package stream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestStream{
public static void main(String[] args){
write();//先写入
read();//在读取
}
private static void read(){
File f=new File("d:/source/LOL.exe");
try(
FileInputStream fis=new FileInputStream(f);
DataInputStream dis=new DataInputStream(fis);
){
//然后在读取刚才写入到lol.exe文件里的东西。
boolean b=dis.readBoolean();
int i=dis.readInt();
String str=dis.readUTF();
System.out.println("读取到布尔值:"+b);
System.out.println("读取到整数:"+i);
System.out.println("读取到字符串"+str);
}catch(IOException e){
e.printStackTrace();
}
}
private static void write(){
File f=new File("d:/source/LOL.exe");
try(
FileOutStream fos=new FileOutputStream(f);
DataOutStream dos=new DataOutStream(fos);
){
//把布尔型,整型,字符型这三个写到lol.exe文件里去
dos.writeBoolean(true);
dos.writeInt(300);
dos.writeUTF("hello world");
}catch(IOException e){
e.printStackTrace();
}
}
}
三、对象流
可以直接把一个对象以流的形式传输给其他的介质,比如硬盘,一个对象以流的形式进行传输,叫做序列化。
该对象所对应的类,必须是实现Serializable接口
首先序列化一个实体类Hero
package stream;
import java.io.Serializable;
public class Hero implements Serializable{
//表示这个类当前的版本,如果有了变化,比如添加了新的属性,就要修改这个版本号
private static final long serialVersionUID=1L;
private String name;
private float hp;
}
如果要把Hero对象直接保存在文件上,必须让Hero类实现Serializable接口
首先要创建对象输出流,也就是写入对象到流,首先创建一个文件写入流FileOutputStream对象,然后在创建一个对象写入流ObjectOutputStream对象,把文件写入流传到对象写入流中。写入操作,利用ObjectOutputStream的writeObject()方法进行写入。同样读取操作,还是要先创建文件读取流FileInputStream对象,然后在创建一个对象读取流ObjectInputStream对象,把文件读取流对象传到对象读取流中。然后执行对象读取流的readObject()方法进行读取。
package stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class TestStream{
public static void main(String[] args){
//创建一个Hero对象
//然后把Hero对象直接保存在文件上,必须Hero类实现Serializable接口
Hero h=new Hero();
h.name="Teemo";
h.hp=90.0; //准备一个文件用于保存新创建的Hero对象
File f=new File("d:/Teemo.lol"); try(
//创建对象输出流(也就是写入)
FileOutputStream fos=new FileOutputStream(f);
ObjectOutputStream oos=new ObjectOutputStream(fos);
//创建对象输入流(也就是读取)
FileInputStream fis=new FileInputStream(f);
ObjectInputStream ois=new ObjectInputStream(fis);
){
oos.writeObject(h);
Hero h2=(Hero)ois.readObject();
System.out.println(h2.name);
System.out.println(h2.hp);
}catch(IOException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}
四、控制台的输入输出
控制台输出数据:System.out
控制台输入数据:System.in
利用System.in进行控制台写入。
package stream;
import java.io.IOException;
import java.io.InputStream;
publc class TestStream{
public static void main(String[] args){
//控制台输入
try(InputStream is=System.in;){
while(true){
int i=is.read();
System.out.println(i);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
利用Scanner进行逐行读取
package stream;
import java.util.Scanner;
public class TestStream{
public class void main(String[] args){
//使用Scanner进行逐行读取。
Scanner s=new Scanner(System.in);
while(true){
String strLine=s.nextLine();
System.out.pirntln(strLine);
}
}
}
一、I/O操作(缓存流,数据流,对象流)的更多相关文章
- 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)
一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- Java IO5:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...
- Java文件与io——打印流和对象流
打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...
- io流(对象流总结)
对象流 对象流就是对引用数据类型进行操作 序列化:将对象的状态信息转换为可以存储或传输的形式的过程,因此类需要序列化后才可以存储到文件中 对象输出流: 很简单,就三句话,将把一个对象导入指定文件中,要 ...
- Java IO流之对象流
对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...
- 34 io流-- 打印流和对象流
概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...
- Java基础(八)——IO流3_对象流
一.对象流 1.序列化与反序列化 序列化:将内存中的Java对象保存到磁盘中或通过网络传输出去. 反序列化:将磁盘文件中的对象还原为内存中的一个Java对象. 用途: (1)将对象保存到物理硬盘:比如 ...
- IO流17 --- 对象流操作自定义对象 --- 技术搬运工(尚硅谷)
序列化 @Test public void test14() throws IOException { ObjectOutputStream oos = new ObjectOutputStream( ...
随机推荐
- js运算符的一些特殊应用
作者: 小文 来源: http://www.cnblogs.com/daysme/ 时间: 2017/3/2 17:21:03 本文集合了了js运算符的一些特殊应用. js位运行符的运用. js运算符 ...
- Linux命令之rz命令与sz命令
1.rz命令 rz命令(Receive ZMODEM),使用ZMODEM协议,将本地文件批量上传到远程Linux/Unix服务器,注意不能上传文件夹. 当我们使用虚拟终端软件,如Xshell.Secu ...
- JS定时器时间日期钟表
window.onload=function(){ setTime(); setInterval('setTime()',1000); } function checkTime(n){ if(n< ...
- JavaScript的sort方法
说明 array.sort()用于对数组进行排序,返回数组,方法默认是“升序”排序,原数组会发生改变 简单点:比较函数两个参数a和b,返回a-b升序,返回b-a升序 普通数组(降序) var arr ...
- java用毫秒数做日期计算的一个踩坑记录
错误示例: Date today = new Date(); Date nextMonth = new Date(today.getTime() + 30* 1000*60*60*24); print ...
- XMind 8 Update 7 Pro 激活码
XMind Update Pro 邮箱:x@iroader 序列号: XAka34A2rVRYJ4XBIU35UZMUEEF64CMMIYZCK2FZZUQNODEKUHGJLFMSLIQMQUCUB ...
- 《剑指offer》第五十五题(二叉树的深度)
// 面试题55(一):二叉树的深度 // 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的 // 结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. //如果左右 ...
- 用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu16.04图文教程
用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu 作者:TeliuTe 来源:基础教程网 1.准备Ubuntu安装文件 1)下载带amd的64位 Ubuntu 桌面版光盘镜像文件,如 ...
- H.264开源解码器评测
转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以 ...
- 20181013xlVba导入成绩
Sub 导入成绩() Const TargetSheet = "年级_原始成绩汇总" Const DesSheet = "年级_本次成绩总表" Applicat ...