1.
Java IO
主要分为字节流(byte stream)
字符流 (characterstream)
实现这两种流的输入流与输出流分别是 InputStream OutputStream
、Reader Write。这四个类都是抽象类,所以只能被继承使用。
2.
与文件打交道肯定是要用到输入和输出流的,所以Java专门提供了读取文件数据的类FileInputStream,它继承了InputSteam属于字节流
要牢记其中的几个重要的方法:
读取文件的数据:
有三个read方法,其中最常用的是
int read(byte[] b,int off, int length)
其中 byte[] 用来存放文件中的数据信息,所以要有byte型数组;
int off 表示从那个字节开始读取数据;一般都从零开始;
int length 表示每次读取的长度,长度不能大于byte数组的长度;
另外,字节是不能被输出的,String类中提供了构造方法:
String (byte[] b, int off, int length ),就是将字节转换为字符;
看下面的程序:
当对一个流进行操作时,必须要有一下四部:
1. 打开流
2. Boolean类型的语句 判断流中的信息还有没有
3. 对流进行读入或写出
4. 关闭流;
packagecom.jianjian.IO;
importjava.io.FileInputStream;
importjava.io.IOException;
public classFileTest9
{
public static void main(String[] args)throws IOException
{
FileInputStream file = new FileInputStream("F:/永建/个人数据/永建.txt");
byte[] b = new byte[100];
int length;
while (-1 != (length =file.read(b,0,100)))
{
String s = newString(b,0,length);
System.out.println(s);
}
file.close();
}
}
这个程序是很典型的,以后会用到很多,所以一定要牢记!
2.
Java中将集合转换为数组的方法 :
toArray(new array [length]);
将数组转换为集合的方法
asList(array) 返回list 列表;
3.
记得以前说过String类型是final类型的是不可变的类型,Java中存在可变的字符串类型 StringBuffer类型
4.
字节流中的两个重要的分支: 节点流、过滤流(filterInputStream);
字节流总是与源头打交道;
5.
输出流,OutputStream:
可以创建文件,并向文件中追加内容(FileOutputStream);
与输出流反过来的是,用户输入的是字符串,要转换成字节;String类中同样提供了方法String.byte(String[] b);
看下面的程序:
创建一个txt文件并将“helloworld !”写入文件:输出流
将文字从内部传到外部;不要混淆!
package com.jianjian.IO;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStream
{
public static void main(String[] args)throws IOException
{
FileOutputStream file = new FileOutputStream("c:/test.txt");//创建一个新文件
String s = "helloworld!!";
byte[] b = s.getBytes();//将字符串转换成字节
file.write(b);//将字节写入文件;
file.close();//关闭流;
}
}
6.
BufferOutputStream: 缓冲区输出流
缓冲器为暂时置放输出或输入资料的内存。
缓冲器内资料自储存设备(如硬盘)来,放置在缓冲器中,须待机送至CPU或其他运算设备。
缓冲区(buffer)这个中文译意源自当计算机的高速部件与低速部件通讯时,必须将高速部件的输出暂存到某处,以保证高速部件与低速部件相吻合. 后来这个意思被扩展了,成为"临时存贮区"的意思。
与缓冲打交道的其实就是计算机的内存了,BufferdeOutputStream的作用其实就是包装 一个输出流类型的对象,它的构造方法是
BufferedOutputStream(OutputSteams)
那么这个类的作用到底是什么呢?
比如说如果像上面那样,只让单纯的输出字节,程序每次只能将一个字节读入到文件中去,如果有一百个字节,就要读一百次。如果加上缓存包装,就可以先将字节存储在内存中,待需要时一次性传入到文件或硬盘中,极大的提高了效率!!
看下面的程序:
好处在与大量数据交互时会得到体现
package com.jianjian.IO;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
public class FileTest10
{
public static void main(String[] args)throws Exception
{
FileOutputStream file = new FileOutputStream("c:/jianjian.text");
BufferedOutputStream bz = new BufferedOutputStream(file);
bz.write("www.jianjian.com".getBytes());
bz.close();
}
}
7.
字节占八位
Int型占32位
8.
晕了:在输入流中的read方法返回的竟然是 字符!!!!
public int read();可是方法上明明写的是一个整型!!
是这样的,Java中的字符使用是用整型来表示的,只取后面的八位
package com.jianjian.IO;
public class FileTest11
{
public static void main(String[] args)
{
char a ='a';
int b = (int)a;
System.out.println(b);
}
}
打印出 97;
package com.jianjian.IO;
public class FileTest11
{
public static void main(String[] args)
{
char a= 'a';
System.out.println((int)a);
}
}
打印出97
package com.jianjian.IO;
public class FileTest11
{
public static void main(String[] args)
{
int a = 97;
System.out.println((char)a);
}
}
打印出a;
下面的程序将会非常有用:因为它会显示出各种字符所代表的整型值
package com.jianjian.IO;
public class FileTest11
{
public static void main(String[] args)
{
int a= 65;
System.out.println((char)a);
}
}
大写的A 65;
小写的a 97;
9.
下面讲 字节数组输出流 ByteArrayIntputSteam 类似于FileIntputStream 它是从字节数组中读取数据的;
它的构造方法接收一个字节型数组,表示操作的对象:
/*
* 将输入的字节数组中的字母,按大小写的形式,各输出一遍
*/
package com.jianjian.IO;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class FileeTest12
{
public static void main(String[] args)throws IOException
{
String s = "abcdefg";
byte[] b = s.getBytes();
ByteArrayInputStream array = new ByteArrayInputStream(b);
for(int i = 0 ; i < 2; i++)
{
if(i == 0)
{
for(int j = 0 ;j < s.length(); j ++)
{
System.out.println((char)(array.read()));
}
}
else
{
for(int k = 0 ; k < s.length(); k ++)
{
System.out.println(Character.toUpperCase((char)array.read()));//利用字符包装类来将字符变为大写
}
}
/*
* 我们也看到了read方法每执行一次都会指向下一个字节,要想实现我们的目标必须要将指针重新指向首字节!
* 不指向的话就是返回 -1,转换成字节后就是?????,开发人员果然很聪明!
* reset方法的作用就是使指针指向mark标记处,这里没有用到mark方法,表示从零开始!
*/
array.reset();
}
System.out.println();
array.close();
}
}
10.
当然也有所谓的字节数组输出流,即从内部将数据写入到字节数组当中!
ByteArrayOutputStream;
并且字节数组输出流中有一个方法
writeTo(OutputStream s)即将字节数组输出流中的字节数组直接写入到其他的输入流中,比如说文件输出流!
package com.jianjian.IO;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileTest13
{
public static void main(String[] args)throws IOException
{
String s = "hello worldwelcome";
byte[] b = s.getBytes();
ByteArrayOutputStream array = new ByteArrayOutputStream();
array.write(b);//到这里就将字节存储到字节数组输出流当中,再将其拿出来即可
byte[] bb = array.toByteArray();//该方法返回字节数组
for(int i = 0 ; i <bb.length; i ++)
{
System.out.println((char)bb[i]);
}
FileOutputStream file = new FileOutputStream("c:/really.txt");
array.writeTo(file);//将字节写入到文件中;
array.close();
file.close();
}
}