字节流读取流
字节流基类
InputStream
OutputStream
/*
写入文件
*/
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test{
public static void main(String...args)throws IOException{
OutputStream os = newFileOutputStream("1111.Java");
os.write("戒风".getBytes());
os.close();
System.out.println("ok!!!!");
}
}
/*
第一种读取文件的方法。
对于操作文本文件不支持使用此做法。
*/
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Test{
public static void main(String...args) throws IOException{
InputStream is =new FileInputStream("1111.java");
for(int by = 0;(by=is.read())!=-1;){
System.out.print(by);
}
is.close();
System.out.println("ok!!!!");
}
}
/*
第二种读取文件的方法。对于操作文本文件支持使用此做法。
*/
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Test{
public static void main(String...args) throws IOException{
InputStream is = newFileInputStream("C:\\1.Java");
byte [] buf = new byte[1024];
for(int len = 0;(len=is.read(buf))!=-1;){
System.out.print(new String(buf,0,len));
}
is.close();
System.out.println("ok!!!!");
}
}
InputStream
int | available() |
/*
第三种方式,如果内存太大会报错。
*/
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Test{
public static void main(String...args) throws IOException{
InputStream is =new FileInputStream("C:\\1.Java");
byte[] buf =new byte[is.available()];
is.read(buf);
System.out.println(new String(buf));
is.close();
}
}
IO流(拷贝图片)
/*
思路:
1、用字节读取流对象和图片关联
2、用字节写入流对象创建一个图片文件。用于存储获取到的图片数据
3、通过循环读写,完成数据的存储
4、关闭资源
*/
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test{
public static void main(String...args){
InputStream is =null;
OutputStream os =null;
try{
is =new FileInputStream("C:\\1.jpg");
os =new FileOutputStream("D:\\1.jpg");
byte []buf =new byte[1024];
for(int len=0;(len=is.read(buf))!=-1;){
os.write(buf,0,len);
}
}
catch(IOException e){
System.out.println("读写错误");
}
finally{
try{
if(is!=null)
is.close();
}
catch(IOException e){
System.out.println("读取流关闭失败");
}
finally{
try{
if(os!=null)
os.close();
}
catch(IOException e){
System.out.println("写入流关闭失败");
}
}
System.out.println("ok!!!");
}
}
}
字节流缓冲区
BufferedInputStream
BufferedOutputStream
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test{
public static void main(String...args)throws IOException{
BufferedInputStream is = newBufferedInputStream
(new FileInputStream("C:\\1.mp3"));
BufferedOutputStream os = newBufferedOutputStream
(new FileOutputStream("D:\\1.mp3"));
for(int by = 0;(by=is.read())!=-1;){
os.write(by);
}
is.close();
os.close();
System.out.println("ok!!!");
}
}
IO流(自定义字节流的缓冲区-read和write的特点)
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
class MyBufferedInputStream{
private InputStream in;
private byte[] buf =new byte[1024];
private int pos;
private int count;
MyBufferedInputStream(InputStream in){
this.in=in;
}
public int myRead()throws IOException{
if(count==0){
count=in.read(buf);
if(count<0)
return -1;
pos=0;
byte b = buf[pos];
pos++;
count--;
return b&255;
}
else if(count>0){
byte b = buf[pos];
pos++;
count--;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException{
in.close();
}
}
public class Test{
public static void main(String...args) throws IOException{
long start = System.currentTimeMillis();
copy();
long end = System.currentTimeMillis();
System.out.println(end-start);
}
public static void copy()throws IOException{
MyBufferedInputStream bufis = newMyBufferedInputStream
(new FileInputStream("C:\\1.avi"));
BufferedOutputStream bufos = newBufferedOutputStream
(new FileOutputStream("C:\\2.avi"));
for(int len=0;(len=bufis.myRead())!=-1;){
bufos.write(len);
}
bufis.myClose();
bufos.close();
}
}
字节流键盘读取
IO流(读取键盘录入)
System.out:对应的是标准输出设备:控制台
System.in:对应的是标准输入设备 :键盘
/*
需求,通过键盘录入数据。
当录入一行数据后,就将改行数据进行打印,如果录入数据是over,那么停止录入
*/
import java.io.IOException;
import java.io.InputStream;
public class Test{
public static void main(String...agrs)throws IOException{
InputStream in =System.in;
StringBuilder sb = newStringBuilder();
while(true){
int ch =in.read();
if(ch=='\r')
continue;
if(ch=='\n'){
String s=sb.toString();
if("over".equals(s))
break;
System.out.println(s);
sb.delete(0,sb.length());
}
else{
sb.append((char)ch);
}
}
}
}
IO流(读取转换流)
通过键盘录入一行数据,并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法来完成键盘录入的一行数据的读取呢?
/*
需求,通过键盘录入数据。
当录入一行数据后,就将该行数据进行打印,如果录入数据是over,那么停止录入
*/
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Test{
public static void main(String...args)throws IOException{
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in)) ;
for(String line =null;(line=bufr.readLine())!=null;) {
if("over".equals(line))
break;
System.out.println(line);
}
bufr.close();
}
}
IO流(写入转换流)
/*
需求,通过键盘录入数据。
当录入一行数据后,就将该行数据进行打印,如果录入数据是over,那么停止录入
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Test{
public static void main(String...args)throws IOException{
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out));
for(String line = null;(line=bufr.readLine())!=null;){
if("over".equals(line))
break;
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}
}
IO流(流操作规律)
1、 源:键盘
目的:控制台
/*
需求,通过键盘录入数据。
如果录入数据是over,那么停止录入,否则就打印*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Test{
public static void main(String...args)throws IOException{
BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = newBufferedWriter(new OutputStreamWriter(System.out));
for(String line = null;(line=bufr.readLine())!=null;){
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}
}
2、 源:键盘
目的:文件
/*
需求:将键盘录入的数据输出到一个文本文件中,
如果录入数据是over,那么停止录入,否则就输入到文件中
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.io.FileOutputStream;
public class Test{
public static void main(String...args)throws IOException{
BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\1.Java")));
for(String line = null;(line=bufr.readLine())!=null;){
if("over".equals(line))
break;
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}
}
3、 源:文件
目的:控制台
/*
需求:想要讲一个文件的数据打印在控制而台上
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.FileInputStream;
public class Test{
public static void main(String...args)throws IOException{
BufferedReader bufr =new BufferedReader(new InputStreamReader
(new FileInputStream("C:\\1.Java")));
BufferedWriter bufw =new BufferedWriter
(new OutputStreamWriter(System.out));
for(String line =null;(line=bufr.readLine())!=null;){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}
}
面向对象IO简单总结下
流操作的基本规律:最痛苦的就是流对象有很多,不知道该用那一个。
通过明确来完成。
(1)、明确源和目的
源:输入流 InputStream ,Reader
目的:输出流OutputStream ,Writer
(2)、操作的数据是否是纯文本
是:字符流 Reader,Writer
不是:字节流 InputStream , OutputStream
(3)、当体系明确后,再明确要使用那个具体的对象
通过设备来进行区分:
源设备:内存 硬盘 键盘
目的设备:内存 硬盘 控制台
/*
需求:将一个文本文件中数据存储到另一个文件中。复制文件
*/
源:因为是源,所以使用读取流。InputStreamReader
是否是纯文本文件:是,所以使用 Reader。
接下来明确要使用该体系中的那个对象:
明确设备,硬盘,一个文件。
Reader体系中可以操作文件的是,FileReader。
是否需要提高效率?
BufferedReader
目的:因为是目的,所以使用写入流。OutputStream Writer
是否是纯文本文件:是,所以使用 Writer。
接下来明确要使用该体系中的那个对象:
明确目的,硬盘,一个文件。
Writer 体系中可以操作文件的是,FileWriter。
是否需要提高效率?需要。BufferedWriter
/*
需求:将键盘录入的数据保存到一个文件中
这个需求中有源和目的都存在,那么分别分析
*/
源:因为是源,所以使用读取流。InputStreamReader
是否是纯文本文件:是,所以使用 Reader。
接下来明确要使用该体系中的那个对象:
明确设备,键盘。对应的对象是System.in。
不是选择Reader吗?System.in 对应的不是字节流吗?
为了操作键盘的文字数据方便,字节流可以转换成字符流,按照字符串操作最方便。
既然明确了Reader 就将 System.in 转换成Reader
用到了Reader 体系中的转换流,InputSteamReader
需要提高效率吗?需要,BufferedReader
目的:因为是目的,所以使用写入流。OutputStreamWriter
是否是纯文本文件:是,所以使用 Writer。
接下来明确要使用该体系中的那个对象:
明确目的,硬盘,一个文件。
Writer体系中可以操作文件的是,FileWriter。
是否需要提高效率?需要。BufferedWriter
扩展
想要把录入的数据按照指定的编码表(UTF-8),将数据存到文件中,使用转换流,里面可以指定编码。
目的:OutputStream Writer
是否是纯文本?是,Writer
接下来明确要使用该体系中的那个对象:
明确目的,硬盘,一个文件。
Writer体系中可以操作文件的是,FileWriter。
但是存储时,需要加入指定的编码表,而指定的编码表,只有转换流可以指定。
所以要使用的对象是OutputStreamWriter.
而该转换流对象要接收一个字节输出流。
而且还可以操作文件的字节输出流,FileOutputStream
是否需要提高效率?需要。BufferedWriter
所以,记住,转化流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。
IO流(改变标准输入输出设备)
System
static void | setIn(InputStream in) |
static void | setOut(PrintStream out) |
IO流(异常的日志信息)
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.PrintStream;
import java.io.IOException;
public class Test{
public static void main(String...args) {
try{
int arr[] = new int[2];
System.out.println(arr[3]);
}catch(Exception e){
try{
Date d = new Date();
SimpleDateFormat sdf = newSimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
String date = sdf.format(d);
PrintStream ps = new PrintStream("c:\\execption.txt");
ps.println(date);
System.setOut(ps);
}
catch(IOException ex){
throw new RuntimeException("日志文件创建失败");
}
e.printStackTrace(System.out);
}
}
}
IO流(系统信息)
import java.util.Properties;
import java.io.PrintStream;
import java.io.IOException;
public class Test{
public static void main(String...args) throws IOException{
Properties popr = System.getProperties();
popr.list(new PrintStream("C:\\1.properties"));
}
}