黑马程序员——Java IO流 2——字节流
来源:互联网 发布:微星网络协议栈开吗 编辑:程序博客网 时间:2024/04/29 22:50
------- android培训、java培训、期待与您交流! ----------
字节流是独立于字符流的另一种输入输出方式,类层次结构如下:
InputStream(System.in)
|--FIleInputStream
|--BufferedInputStream
OuputStream
|--FileOutputStream
|--BufferedOuputStream
|--PrintStream(System.out)
字节流是一个字节一个字节传输数据的方式
FileStream
文件字节流对象是专门用于读写文件的字节流对象,它主要包括FileInputStream、FileOutputStream。
FileInputStreamFileInputStream(File file)
构造函数,创建一个FileInputStream对象。
file:为了读取而打开的文件。
FileNotFoundException:文件不存在,或不是文件,则抛此异常
FileInputStream(String name)构造函数,创建一个FileInputStream对象。
name:文件名
FileNotFoundException:文件不存在,或不是文件,则抛此异常
int read()从流中读取一个字节
返回值:下一个数据字节;如果已到达文件末尾,则返回-1。
int read(byte[] b)从流中读取b.length个字节
b:存储读取数据的缓冲区
返回:读入缓冲区的字节总数,如果到达末尾则返回-1
获取可以从输入流读取的剩余字节数。
FileOutputStreamFileOutputStream(File file)构造函数,创建一个FileOutputStream对象。
file:为了写入而打开的文件。如果文件不存在则创建
FileNotFoundException:如果file对象指向的是目录,则抛此异常
构造函数,创建一个FileOutputStream对象。
name:文件名。如果文件不存在则创建
FileNotFoundException:如果name指向的是目录,则抛此异常
void write(byte[] b)将b.length个字节从b中写入到文件输出流
b:数据
下面举例说明用法:
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class FileStream {public static void main(String[] args) {writeFile();readFile1();readFile2();readFile3();}//用write方法向程序外写出数据private static void writeFile(){FileOutputStream fos=null;try {fos=new FileOutputStream("test.txt");fos.write("write string by byteStream\n".getBytes());} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (fos!= null)fos.close();} catch (IOException e) {throw new RuntimeException(e);}}}//用read()方法向程序内写入数据private static void readFile1() {FileInputStream fis=null;try {fis=new FileInputStream("test.txt");int ch=0;while((ch=fis.read())!=-1){System.out.print((char)ch);}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (fis != null)fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}//用read(byte[])方法向程序内写入数据private static void readFile2() {FileInputStream fis=null;try {fis=new FileInputStream("test.txt");byte[] buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){System.out.print(new String(buf,0,len));}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (fis != null)fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}//用read(byte[])方法配合available()方法向程序内写入数据//这方法不好,因为如果文件过大,会造成内存溢出private static void readFile3() {FileInputStream fis=null;try {fis=new FileInputStream("test.txt");byte[] buf=new byte[fis.available()];fis.read(buf);System.out.println(new String(buf));} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (fis != null)fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}}上面的三种读取方式中,第二种方式最好,因为性能最好,且不容易出bug
复制图片
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class CopyImage {public static void main(String[] args) {FileOutputStream fos=null;FileInputStream fis=null;try {fis=new FileInputStream("Image1.png");fos=new FileOutputStream("Image2.png");byte[] buf=new byte[1024];int len=0;while((len=fis.read(buf))!=-1){fos.write(buf,0,len);}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (fis != null)fis.close();if (fos != null)fos.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
字节流缓冲区
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class CopyMp3 {public static void main(String[] args) {BufferedInputStream bis=null;BufferedOutputStream bos=null;try {bis=new BufferedInputStream(new FileInputStream("喜欢你.mp3"));bos=new BufferedOutputStream(new FileOutputStream("喜欢.mp3"));int len=0;while((len=bis.read())!=-1){bos.write(len);}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (bis != null)bis.close();if (bos != null)bos.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
自定义字节流缓冲区
import java.io.IOException;import java.io.InputStream;public class MyBufferedInputStream {InputStream in;byte[] buf=new byte[8192];int pos=0;//指示当前读到哪个位置int count=0;//指示当前还剩多少字节没读public boolean isEnd=false;//指示文件是否读完MyBufferedInputStream(InputStream in){this.in=in;}public Byte read() throws IOException {if (pos<count) {return buf[pos++];}else {count=in.read(buf);if (count==-1) {isEnd=true;//此处添加结束标志是为了防止把数据-1和结束标志-1搞混淆return -1;}pos=0;return buf[pos++];}}public void close()throws IOException{in.close();}}写一个测试方法测下性能:
import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class CopyMp3InMyBuffer {public static void main(String[] args) {long start=System.currentTimeMillis();MyBufferedInputStream bis=null;BufferedOutputStream bos=null;try {bis=new MyBufferedInputStream(new FileInputStream("喜欢你.mp3"));bos=new BufferedOutputStream(new FileOutputStream("喜欢2.mp3"));while(!bis.isEnd){bos.write(bis.read());}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (bis != null)bis.close();if (bos != null)bos.close();} catch (IOException e) {throw new RuntimeException(e);}}long end=System.currentTimeMillis();System.out.println((end-start)+"毫秒");}}这段代码在本机跑出了113毫秒的成绩,这比用jdk的BufferedInputStream足足快了一倍多,是不是很神奇!视频中讲了read方法返回int(之所以要转成int仅仅是为了多一个-1来判断文件结束,但是把1个字节转换为4个字节太浪费性能,所以此处没有照搬视频),但我觉得把byte转换成int很浪费性能,所以就自己加了个结束标志。
读取键盘录入
import java.io.IOException;import java.io.InputStream;public class keyboardInput {public static void main(String[] args) {InputStream in=System.in;//StringBuffer用于多线程,StringBuilder用于单线程StringBuilder sb=new StringBuilder();int ch=0;try {while(true){ch=in.read();if (ch=='\r') {continue;}if (ch=='\n') {String s=sb.toString();if ("over".equals(s)) {break;}System.out.println(s.toUpperCase());sb.delete(0, sb.length());}else {sb.append((char)ch);}}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (in != null)in.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
读取转换流
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TransStreamDemo {public static void main(String[] args) {InputStream iStream=System.in;InputStreamReader isr=new InputStreamReader(iStream);BufferedReader bReader=null;try {bReader=new BufferedReader(isr);String line=null;while((line=bReader.readLine())!=null){if ("over".equals(line)) {break;}System.out.println(line.toUpperCase());}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (bReader != null)bReader.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
写入转换流
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class TransStreamDemo {public static void main(String[] args) {BufferedReader br=null;BufferedWriter bw=null;try {br=new BufferedReader(new InputStreamReader(System.in));bw=new BufferedWriter(new OutputStreamWriter(System.out));String line=null;while((line=br.readLine())!=null){if ("over".equals(line)) {break;}bw.write(line.toUpperCase());bw.newLine();bw.flush();}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (br != null)br.close();if (bw!=null) {bw.close();}} catch (IOException e) {throw new RuntimeException(e);}}}}注意,上面的代码使用了创建对象的简写形式。上面的代码是键盘输入输出的最常见写法。
流操作规律
字符流与编码
改变标准输入输出设备*
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintStream;public class TransStreamDemo {public static void main(String[] args) {BufferedReader br=null;BufferedWriter bw=null;try {System.setIn(new FileInputStream("AutoBoxing.java"));System.setOut(new PrintStream("test1.txt"));br=new BufferedReader(new InputStreamReader(System.in));bw=new BufferedWriter(new OutputStreamWriter(System.out));String line=null;while((line=br.readLine())!=null){if ("over".equals(line)) {break;}bw.write(line.toUpperCase());bw.newLine();bw.flush();}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (br != null)br.close();if (bw!=null) {bw.close();}} catch (IOException e) {throw new RuntimeException(e);}}}}
异常日志信息
import java.io.IOException;import java.io.PrintStream;import java.util.*;import java.text.*;public class ExceptionInfo{public static void main(String[] args) {try{//制造一个数组角标越界int[] arr=new int[2];System.out.println(arr[3]);}catch(Exception e){try {Date date=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String s=sdf.format(date);PrintStream ps=new PrintStream("excetion.log");ps.println(s.toString());System.setOut(ps);} catch (IOException ex) {throw new RuntimeException("创建异常日志失败");}e.printStackTrace(System.out);}}}这里使用了Date类和SimpleDateFormat类。Date类是java.util包中的Date类不是java.sql包中的Date类,java.sql.Date类没有无参构造函数,java.util.Date类有无参构造函数。SimpleDateFormat类的构造函数参数的格式如下:
G
Era 标志符TextAD
y
年Year1996
; 96
M
年中的月份MonthJuly
; Jul
; 07
w
年中的周数Number27
W
月份中的周数Number2
D
年中的天数Number189
d
月份中的天数Number10
F
月份中的星期Number2
E
星期中的天数TextTuesday
; Tue
a
Am/pm 标记TextPM
H
一天中的小时数(0-23)Number0
k
一天中的小时数(1-24)Number24
K
am/pm 中的小时数(0-11)Number0
h
am/pm 中的小时数(1-12)Number12
m
小时中的分钟数Number30
s
分钟中的秒数Number55
S
毫秒数Number978
z
时区General time zonePacific Standard Time
; PST
; GMT-08:00
Z
时区RFC 822 time zone-0800
系统信息
import java.io.IOException;import java.io.PrintStream;import java.util.Properties;public class SystemInfo {public static void main(String[] args) {Properties pro=System.getProperties();PrintStream ps=null;try {ps=new PrintStream("systemInfo.txt");pro.list(ps);} catch (IOException e) {throw new RuntimeException(e);} finally {if (ps != null)ps.close();}}}注意PrintStream对象的close方法并不抛出异常
-- listing properties --java.runtime.name=Java(TM) SE Runtime Environmentsun.boot.library.path=C:\Users\boss big\AppData\Local\MyEcl...java.vm.version=24.45-b08java.vm.vendor=Oracle Corporationjava.vendor.url=http://java.oracle.com/path.separator=;java.vm.name=Java HotSpot(TM) 64-Bit Server VMfile.encoding.pkg=sun.iouser.script=user.country=CNsun.java.launcher=SUN_STANDARDsun.os.patch.level=java.vm.specification.name=Java Virtual Machine Specificationuser.dir=D:\Code\Java\javaenhancejava.runtime.version=1.7.0_45-b18java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs=C:\Users\boss big\AppData\Local\MyEcl...os.arch=amd64java.io.tmpdir=C:\Users\BOSSBI~1\AppData\Local\Temp\line.separator=java.vm.specification.vendor=Oracle Corporationuser.variant=os.name=Windows 8sun.jnu.encoding=GBKjava.library.path=C:\Users\boss big\AppData\Local\MyEcl...java.specification.name=Java Platform API Specificationjava.class.version=51.0sun.management.compiler=HotSpot 64-Bit Tiered Compilersos.version=6.2user.home=C:\Users\boss biguser.timezone=java.awt.printerjob=sun.awt.windows.WPrinterJobfile.encoding=GBKjava.specification.version=1.7user.name=boss bigjava.class.path=D:\Code\Java\javaenhance\bin;D:\Code\...java.vm.specification.version=1.7sun.arch.data.model=64java.home=C:\Users\boss big\AppData\Local\MyEcl...sun.java.command=IOByteStream.SystemInfojava.specification.vendor=Oracle Corporationuser.language=zhawt.toolkit=sun.awt.windows.WToolkitjava.vm.info=mixed modejava.version=1.7.0_45java.ext.dirs=C:\Users\boss big\AppData\Local\MyEcl...sun.boot.class.path=C:\Users\boss big\AppData\Local\MyEcl...java.vendor=Oracle Corporationfile.separator=\java.vendor.url.bug=http://bugreport.sun.com/bugreport/sun.cpu.endian=littlesun.io.unicode.encoding=UnicodeLittlesun.desktop=windowssun.cpu.isalist=amd64
注意上面的file.encoding=GBK就是系统默认的字符编码
- 黑马程序员——IO字节流
- 黑马程序员——io字节流
- 黑马程序员——【Java】IO——字节流
- 黑马程序员——Java基础---IO流(字节流)
- 黑马程序员——Java IO—字节流
- 黑马程序员——java基础 io 字节流
- 黑马程序员——Java基础---IO---字节流
- 黑马程序员——Java IO流 2——字节流
- 黑马程序员——Java基础----IO(字节流、操作规律等)(2)
- 黑马程序员——IO流-字节流、字符流
- 黑马程序员——IO字符流与字节流
- 黑马程序员——IO流-字节流
- 黑马程序员——io流(二)字节流
- 黑马程序员——IO流字节流
- 黑马程序员——IO流3:字节流
- 黑马程序员——IO流(字节流)
- 黑马程序员—IO流(字符流与字节流)
- 黑马程序员—IO流(字节流)
- Java中的String与常量池
- 电脑蓝屏的原因及解决办法
- 深入剖析H.264帧内预测(I宏块)
- Unity导入NGUI遇到的问题
- 旧走遍美国
- 黑马程序员——Java IO流 2——字节流
- JavaScript权威指南_13_第3章_类型/值/变量_3.10-变量作用域
- HDU 4326 Game 概率DP 高斯消元
- Git详解之一:Git起步
- const 、static、extern的用法总结
- 网线连接,掐线顺序
- IDL常用函数集锦
- SQL error 1403 mapping to
- iOS 导航控制器上添加\删除子视图