JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
来源:互联网 发布:linux实时守护进程 编辑:程序博客网 时间:2024/04/29 06:30
字节流:
OutputStream:字节流写入基类。
字节流并不需要刷新操作,因为字符流底层是将传入的字节先存放在一个数组中,然后去查表得到字符,所以需要刷新。而字节流是直接将数据传送到目标位置。
FileOutputStream 文件字节写入操作类
import java.io.*;class FileOutputStreamDemo{ public static void main(String[]args)throws IOException { FileOutputStream fos=new FileOutputStream("basketball.txt"); byte[]bt={'c','d','e','f'}; fos.write((byte)'a'); fos.write((byte)'b'); fos.write(bt); fos.close(); }}
FileInputStream 文件字节读出类
available()方法,可以读取文件的字节数。
import java.io.*;class FileInputStreamDemo{ public static void main(String []args)throws IOException { FileInputStream fis=new FileInputStream("basketball.txt"); int b=0; while ((b=fis.read())!=-1) { System.out.println((char)b); } fis.close(); }}
字节流缓冲区 进行复制文件
import java.io.*;class CopyStreamDemo{ public static void main(String[]args)throws IOException { FileInputStream fis=new FileInputStream("basketball.jpeg"); FileOutputStream fos=new FileOutputStream("d:\\copy.jpeg"); BufferedInputStream bis=new BufferedInputStream(fis); BufferedOutputStream bos=new BufferedOutputStream(fos); int num=0; System.out.println(fis.available()); while ((num=bis.read())!=-1) { bos.write((char)num); } fis.close(); fos.close(); }}
自己实现BufferedInputStream:将数据读入缓冲区
这个程序的难点在于:
因为读取的是byte字节,所以数据中很可能会出现8个1,即-1的情况,这时候程序会直接结束,为了避免这种情况,我们返回值设置成了int类型,即4个字节,然后&上 255,就变成了00000000 00000000 00000000 1111111.就不会再出现未达到文件结尾而出现-1的情况,而写的时候,write方法会自动将int数据变为字节数据进行写入,即只写后八位。
import java.io.*;class MyBufferedInputStream{ private FileInputStream fis; private byte[]buf=new byte[1024]; private int count=0,pos=0;//定义一个计数器,一个指针,计数器取得每次读取的数据,然后每读取一次就递减,指针用来读取数组中的元素,每读取一个就递增。 MyBufferedInputStream(FileInputStream fis) { this.fis=fis; } public int myRead()throws IOException { if(count==0)//当count为0时,就从文件中向数组读取数据 { count=fis.read(buf); if(count<0) return -1; pos=0; byte b=buf[pos]; count--; pos++; return b&0xff;//因为读取的是byte字节,所以数据中很可能会出现8个1,即-1的情况,这时候程序会直接结束,为了避免这种情况,我们返回值设置成了int类型,即4个字节,然后&上 255,就变成了00000000 00000000 00000000 1111111.就不会再出现未达到文件结尾而出现-1的情况 } else if(count>0)//当count不为0时,就直接从数组取就行 { byte b=buf[pos]; count--; pos++; return b&0xff; } return -1; } public void myClose()throws IOException { fis.close(); }}class MyBufferedInputStreamDemo{ public static void main(String[]args)throws IOException { FileInputStream fis=new FileInputStream("1.mp3"); FileOutputStream fos=new FileOutputStream("2.mp3"); MyBufferedInputStream mbis=new MyBufferedInputStream(fis); BufferedOutputStream bos=new BufferedOutputStream(fos); int num=0; long start=System.currentTimeMillis(); while((num=mbis.myRead())!=-1) { bos.write(num); } long end=System.currentTimeMillis(); System.out.println((end-start)); mbis.myClose(); bos.close(); }}
键盘录入,当输入over时停止程序
import java.io.*;class ReadIn{ public static void main(String[]args)throws IOException { InputStream in=System.in; byte []c=new byte[1024]; int num=in.read(c); String s=new String(c,0,num); if(s.equals("over\r\n"))//因为输入中有个空格,所以要加\r\n,也可以用StringBuilder容器来实现 System.exit(0); else System.out.println(s); }}
转换流:字符和字节之间转换的桥梁。通常涉及到字符编码转换时,可以使用转换流类的构造方法来指定字符编码表,这时候使用转换流。
读取转换流:InputStreamReader: 将字节流转换为字符流,将输入的字节变为字符,可以用字符流的方法。
import java.io.*;class InputStreamReaderDemo{ public static void main(String[]args)throws IOException { InputStream in=System.in; InputStreamReader isr=new InputStreamReader(in);//接收一个字节流,转换为字符流 BufferedReader br=new BufferedReader(isr);//字符流缓冲区就可以接收被转换的字节流 String s=null; while(!(s=br.readLine()).equals("over")) { System.out.println(s); } br.close(); }}
写入转换流:OutputStreamWriter:将字符流变成字节流进行写入操作
import java.io.*;class InputStreamReaderDemo{ public static void main(String[]args)throws IOException { InputStream in=System.in; InputStreamReader isr=new InputStreamReader(in); BufferedReader br=new BufferedReader(isr); //简写 //BufferedReader br= //new BufferedReader(new InputStreamReader(System.out)); OutputStream out=System.out;//可以直接用write方法写到屏幕上 OutputStreamWriter osw=new OutputStreamWriter(out); BufferedWriter bw=new BufferedWriter(osw); String s=null; while(!(s=br.readLine()).equals("over")) { bw.write(s); bw.newLine(); bw.flush(); } br.close(); }}
编程:键盘输入的数据写入到文件中
import java.io.*;class TransDemo{ public static void main(String[]args)throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("trans.txt"))); String s=null; while(!(s=br.readLine()).equals("over")) { bw.write(s); } br.close(); bw.close(); }}
IO流操作的基本规律:
1.明确源和目的
源是用来读取的:InputStream,Reader
目的是用来写入的:OutputStream,Writer
2.操作的是不是纯文本
是:字符流
否:字节流
3.明确使用的对象
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
改变标准输入输出设备
System类里的setIn和setOut方法可以改变标准的输入输出设备。
(标准的输入设备是键盘,输出设备是控制台)
编码:将系统信息打印到文本文件中
import java.io.*;import java.util.*;class SysInfoDemo{ public static void main(String []args)throws IOException { Properties p=System.getProperties(); p.list(new PrintStream("sysinfo.txt")); }}
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- 黑马程序员--Java基础学习之IO流之字节流、字符流、读取写入文件、Copy文件、键盘输入输出、流操作的基本规律
- JAVA 的IO操作(二) 字节输出流和输入流:OutputStream和InputStream
- IO流-3.【字节流】【字节流缓冲区】【键盘录入】【转换流】【流操作作规律】【输入输出重定向】
- IO流 基本的字符流 字节流 输出流 输入流 转换流
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)
- JAVA IO流(改变设备标准输入输出位置) 及 流操作规律
- java--IO流-LineNumberReader,读取键盘录入,字符字节流转换,改变标准输入输出设备,异常的日志信息,系统信息
- IO流--字节流缓冲区(BufferedOutputStream,BufferedInputStream)
- IO流小结之三:流应用的规律、转换流和编码、改变标准输入输出流的方法
- 字节输入流BufferedInputStream和字节输出流BufferedOutputStream
- JAVA IO流实现字节数组与任何基本类型和引用类型的相互转换
- 输入输出流(IO)—文件字节流(FileInputStream & FileOutputStream)的基本操作及运用
- IO流自定义字节流的缓冲区
- 输入字节流(FileInputStream)和输出字节流(FileInputStream)的用法
- Java IO字节输出流的总结
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
- 黑马程序员——IO(缓冲区、字节流、转换流、流操作规律)
- nova image-list 和 glance image-list 有什么区别
- 入门Webpack,看这篇就够了
- 算法 - RSA大数分解
- RabbitMQ :VHost,Exchanges, Queues,Bindings and Channels
- 微信公众号之刷卡支付
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- IF TRUE FALSE
- mysql死锁问题分析
- 解决ScrollView起始位置不是最顶部问题的3套方案
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 怎样把你的MySQL完全中文化
- Android textView设置下划线
- 自己写的链表模板类
- CUDA 学习(一)、超级计算机介绍