Java 字节流InputStream、OutputStream、FileInputStream、FileOutputStream


InputStream  OutputStream

第一种方式:使用字节输出流建立一个文件并存储一些数据

FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcdsjfl".getBytes());  //getBytes()将字符串转化成字节存储到byte数组中
fos.close();  // 关闭资源
InputStream :
FileInputStream fis = new FileInputStream("fos.txt");
        byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
	System.out.println(new String(buf,0,len));
}


第二种方式:

FileInputStream fis = new FileInputStream("fos.txt");
int by = 0;
while((by=fis.read())!=-1){
	System.out.println((char)by);
}

第三中方式:

FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[fis.available()];//文件体积过大,会内存溢出。
fis.read(buf);
//复制图片
FileInputStream fis = new FileInputStream("d:\\java32\\day17\\ma.JPG");
FileOutputStream fos = new FileOutputStream("d:\\ma.bmp");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
	fos.write(buf,0,len);
}
fos.close();
fis.close();


字节流缓冲区:        

FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int temp = 0;
while((temp=bufis.read())!=-1)
{
bufos.write(temp);
}
bufos.close();
bufis.close();

字节流缓冲区原理注意事项:

read方法读取了一个字节是连续的81。正好是-1.那么循环就停止了。

为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?

那是因为,在读取一个字节数据时,容易出现连续81的情况,连续81-1.

正好符合了流结束标记。所以为了避免,流操作数据是提前结束,将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.&255.避免-1的情况。

输出流的write方法虽然接收是一个整数,四个字节,但是write只将最后一个字节写出。其他字节抛弃。


转换流:字节流和字符流之间的桥梁

InputStreamReader  字节转成字符的桥梁

比如:

InputStream in = System.in;//键盘录入
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);

匿名对象简写:

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));


读取键盘录入数据 并将数据每一行以大写形式打印在控制台上,如果录入的数据是over,该程序结束 

InputStream in = System.in;
InputStreamReader isr = new InputStreamReader(in);
BufferedReader bufr = new BufferedReader(isr);
String line = null;
while ((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
bufr.close();


OutputStreamWriter  字符转成字节的桥梁

比如:

OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);


匿名对象简写:

BufferedWriter bufw = new BufferedWriter(new OutpurStreamWriter(System.out));

转换流其实就是字节流+字符编码,没有指定编码,默认本机编码,GBK

其实流的操作就是对源和目的的操作。流其实就是在富足和目的设备上的数据传输

因为流的对象有很多,什么情况下,要使用什么对象


流的操作规律:

1  明确源和目的

源:读取InputStream  Reader

目的: 写入   OutputStream  Writer


2  明确操作的数据内容

数据是否是存文本数据:

是:源  Reader    

         目的  Writer

否 :源   InputStream

         目的   OutputStream

明确设备

 源设备: 硬盘(带File的流对象),键盘(System.in),内存(带数组的流对象)

目的设备:硬盘(带File的流对象),控制台(System.out),内存(带数组的流对象)


4  明确是否需要高效和一些具体功能

是:使用Buffer

否:不使用Buffer

具体功能:

是一些具体的特殊的对象。

可以操作基本数据类型的流对象 ,或者操作对象的流对象等


Writer

|-----OutputStreamWriter:该流中加入了编码表

|-----FileWriter  :操作文件的字符流对象,该对象中使用默认的编码表GBK

所以子类FileWriter只能操作GBK编码表,而父类可以操作指定的编码表,在实际应用中,如果数据是GBK的,不涉及其他编码表,可以使用FileWriter来完成,如果涉及其他编码表,就必须用父类OutputStreamWriter来完成


Reader

|-----IntputStreamReader:

|-----FileReader  和上面一样


File 

用来将文件或者文件夹封装成对象,方便于对文件与文件夹的属性信息进行操作,File对象可以作文产生传递给流的构造函数

File类的常见方法。

1,创建。

boolean createNewFile():创建文件。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级目录。

2,删除。

boolean delete():

deleteOnExit();


3,判断。

isAbsolute():是否是绝对路径。

exists():是否存在。

isDirectory():是否是文件夹。

isFile():是否为文件。


4,获取。

long length():文件大小。

getName() :文件名

getParent()   父目录, 如果封装File对象时,不指定路径, 返回 null

getPath() 路径  封装什么路径就是什么路径

getAbsolutePath() 绝对路径。 无论封装什么路径,获取的都是绝对路径。

String[] list():获取指定目录下当前的文件夹和文件名称。

File[] listFiles():获取指定目录下当前的文件夹和文件对象。

static File[] listRoots():获取本机有效盘符。

String[] list(FilenameFilter ):获取指定过滤器过滤后的文件或者文件夹名称

File[] listFiles(FileFilter ):获取指定过滤器过滤后的文件或者文件夹对象

5renameTo:对文件进行改名。还可以剪切。

6compareTo():File实现了Compareable接口。 文件可以排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值