-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1、字节流
字符流:Writer,Reader 主要是用来操作的是文本文件
字节流:InputStream,OutputStream主要是用来操作的是媒体文件,例如:图片,音乐,电影…等。但是也可以操作文件。
如果用字符流操作媒体文件的话,复制文件的话:也能复制,只是复制后的图片不能看,因为查看的编码是不一样的,
不管是读还是写,都不需要刷新缓冲,除非用到了缓冲对象。
2、FileOutStream
操作文件,向文本文件中写入数据,其没有写入字符串耳朵方法,有字节数组的写入,所以我们要把字符串转换成数组。然后写入。
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
public classOutStreamDemo {
public static void main(String[]args) {
OutputStream out=null;
try {
out=new FileOutputStream("F:\\demo.txt");
out.write("helloworld".getBytes());//写入数据,把字符串转换为字节数组
} catch (IOException e) {
e.printStackTrace();
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、FileInputStream
读取文件,有三种方法,
第一种:一个一个字符的读取,
第二种:字节数组的读取。
第三种:使用available()方法,读取到文件的总大小,然后定义相同大小的字节数组,读取一次即可,但是加入文件过大,大于了虚拟的内存的大小,那么就会加载不进去,所以最好的办法是定义恰当合适的数组,然后循环读取。
4、单个字节读取
使用的read()方法,进行循环读取。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamDemo {
public static void main(String[] args) {
InputStream in = null;
try {
in = new FileInputStream("F:\\demo.txt");
/* 这个为一个一个的读取,使用read()方法,然后读取到的字符的ASCII码,到结尾就返回-1*/
int r = -1;
while ((r = in.read()) != -1) {//开始读取
System.out.print((char) r);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(in!=null){
try {
in.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5、字节数组读取
定义恰当的数组,然后循环读取 使用的read(byte [] b)
然后转换成字符串,返回。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamDemo {
public static void main(String[] args) {
InputStream in= null;
try {
in= new FileInputStream("F:\\demo.txt");
/* 使用字节数组读取,然后转成字符串。到结尾就返回-1*/
byte [] b=new byte[1024];
int len=-1;
while ((len = in.read(b)) != -1) {//开始读取
System.out.print(new String(b,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(in!=null){
try {
in.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
6、固定数组大小
使用的available()方法,读取到文件的大小,然后定义相应的大小的字节数组,如果文件小的话,可以这样使用,但是文件很大,超过了虚拟机的申请的内存,那么就会导致加载不进入,所以最好的方法是是哟第二种方法,定义合适的字节数组的大小。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class OutAndInputStreamDemo {
public static void main(String[] args) {
InputStream in = null;// 读取流字节流
OutputStream out = null;// 写入流字节流
try {
in = new FileInputStream("F:\\A\\1.jpg");// 与复制的图片关联起来
out = new FileOutputStream("F:\\B\\1.bmp");// 与复制到的目的关联起来,这里的图片的名称可以与原来的相同,也可以不一样
byte[] b = new byte[1024];// 定义字节数组,并指定长度
int l = -1;
while ((l = in.read(b)) != -1) {// 读取
out.write(b, 0, l);// 写入,读多少写入多少,所以用 write(b,0,len)
}
System.out.println("复制成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();// 关闭读取流
} catch (IOException e) {
System.out.println("读取流关闭失败");
}
if (out != null) {
try {
out.close();// 关闭写入流
} catch (IOException e) {
System.out.println("写入流关闭失败");
}
}
}
}
}
}
结果:
复制成功
7、复制图片
使用的InputStream和OutputStream
步骤:
1.使用读取流InputStream,与要读取的图片关联。
2.定义写入流,定义好复制到的位置和图片的名称。
3.然后一边读取一边写入,循环读取和循环写入。使用的是数组读取和写入。
4.最后关闭流。
扩展:复制后的文件名称可以改变也可以不变,格式也可以改变,jpg或者bmp.或者其他的格式都可以
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class OutAndInputStreamDemo {
public static void main(String[] args) {
InputStream in = null;// 读取流字节流
OutputStream out = null;// 写入流字节流
try {
in = new FileInputStream("F:\\A\\1.jpg");// 与复制的图片关联起来
out = new FileOutputStream("F:\\B\\1.bmp");// 与复制到的目的关联起来,这里的图片的名称可以与原来的相同,也可以不一样
byte[] b = new byte[1024];// 定义字节数组,并指定长度
int l = -1;
while ((l = in.read(b)) != -1) {// 读取
out.write(b, 0, l);// 写入,读多少写入多少,所以用 write(b,0,len)
}
System.out.println("复制成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();// 关闭读取流
} catch (IOException e) {
System.out.println("读取流关闭失败");
}
if (out != null) {
try {
out.close();// 关闭写入流
} catch (IOException e) {
System.out.println("写入流关闭失败");
}
}
}
}
}
}
结果:
复制成功
8、键盘读取
import java.io.IOException;
import java.io.InputStream;
public class ClassDemo {
public static void main(String[] args) throws IOException {
/*
* InputStream in“标准”输入流:读取的设备是键盘 PrintStream out“标准”输出流。输出到控制台
*/
/*
* 我们可以循环输入,当输入为over时候,结束输入
*/
InputStream in = System.in;
StringBuilder bu= new StringBuilder();
while (true) {
int ch = in.read();
if (ch == '\r')
continue;
if (ch == '\n') {
String s = bu.toString();
if ("over".equals(s))// 如果输入的是over,那么结束输入
break;
System.out.println("输入的内容是:" + s);
bu.delete(0,bu.length());
} else
bu.append((char) ch);
}
}
}
结果:
aa
输入的内容是:aa
bb
输入的内容是:bb
cc
输入的内容是:cc
over