JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
2016-10-21 17:19
951 查看
字节流:
OutputStream:字节流写入基类。
字节流并不需要刷新操作,因为字符流底层是将传入的字节先存放在一个数组中,然后去查表得到字符,所以需要刷新。而字节流是直接将数据传送到目标位置。
FileOutputStream 文件字节写入操作类
FileInputStream 文件字节读出类
available()方法,可以读取文件的字节数。
字节流缓冲区 进行复制文件
自己实现BufferedInputStream:将数据读入缓冲区
这个程序的难点在于:
因为读取的是byte字节,所以数据中很可能会出现8个1,即-1的情况,这时候程序会直接结束,为了避免这种情况,我们返回值设置成了int类型,即4个字节,然后&上 255,就变成了00000000 00000000 00000000 1111111.就不会再出现未达到文件结尾而出现-1的情况,而写的时候,write方法会自动将int数据变为字节数据进行写入,即只写后八位。
键盘录入,当输入over时停止程序
转换流:字符和字节之间转换的桥梁。通常涉及到字符编码转换时,可以使用转换流类的构造方法来指定字符编码表,这时候使用转换流。
读取转换流:InputStreamReader: 将字节流转换为字符流,将输入的字节变为字符,可以用字符流的方法。
写入转换流:OutputStreamWriter:将字符流变成字节流进行写入操作
编程:键盘输入的数据写入到文件中
IO流操作的基本规律:
1.明确源和目的
源是用来读取的:InputStream,Reader
目的是用来写入的:OutputStream,Writer
2.操作的是不是纯文本
是:字符流
否:字节流
3.明确使用的对象
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
改变标准输入输出设备
System类里的setIn和setOut方法可以改变标准的输入输出设备。
(标准的输入设备是键盘,输出设备是控制台)
编码:将系统信息打印到文本文件中
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--IO流-LineNumberReader,读取键盘录入,字符字节流转换,改变标准输入输出设备,异常的日志信息,系统信息
- 黑马程序员--Java基础学习之IO流之字节流、字符流、读取写入文件、Copy文件、键盘输入输出、流操作的基本规律
- 黑马程序员_Java基础_IO流_字节流,字节流操作文件,缓冲区字节流,流的使用规律,异常记录原理
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
- IO流-3.【字节流】【字节流缓冲区】【键盘录入】【转换流】【流操作作规律】【输入输出重定向】
- java基础之IO流中实现对键盘和控制台的输入和输出以及写到文本文件
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
- 黑马程序员——Java基础——字节流文件操作、键盘录入、转换流、流操作规律、异常日志等
- 黑马程序员—字节流+字符流缓冲区(装饰设计)+转换流+IO流操作规律+异常日志+系统信息列表输出
- Java基础---IO流---IO流概述、字符流、字节流、流操作规律
- java—IO流——读取键盘输入的字母并转换成大写字母输出在控制台上
- 黑马程序员——Java基础IO流概述、字符流、字节流、流操作规律、File类、Properties类、打印流、序列流
- Java基础知识强化之IO流笔记57:数据输入输出流(操作基本数据类型)
- Java基础之IO流,打印系统信息至标准输出设备或文件中Properties.list()
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
- Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律 (黑马程序员)
- Java基础之IO流,通过字节流缓冲区进行媒体文件的复制操作
- 黑马程序员——Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律