JAVA IO 流
一.概括
1.IO(INPUT OUTPUT)流
1.1 IO 流用来处理设备之间的数据传输
1.2JAVA 对数据的操作是通过流的方式
1.3 JAVA 用于操作流的对象都在 IO 包中
1.4 流按操作数据分两种:字节流与字符流
2. IO 流常用基类
2.1 字节流的抽象基类
InputStream, OutputStream
2.2 字符流的抽象基类
Reader, Writer
(注: 由这四个类派生出来的子类名称都是以其父类名作为子类名
如: InputStream 的子类 FileInputStream.
Reader 的子类 FileReader
)
3. 程序书写
3.1 对 IO 异常处理
必须要捕获异常
原因:
1 捕获了异常,报告读取错误,然后由用户处理
2 程序继续读,还读不到,继续读。。。。。直到永远...
3.2在 finally 中对流进行关闭
思考:
有了垃圾回收机制为什么还要调用 close 方法关闭
答:Java有垃圾回收机制就像是我们的清洁工,每天会定时的打扫街道两三次,
但是如果路人不爱清洁;每时每刻都在制造垃圾,,那么我们的街道时时刻刻都是脏的。而清洁工的能力和工作次数是有限的,,在这种情况下就是我们的街道也就是内存会处于高负荷状态。跟没有清洁工没两样了。。
因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。
二. 字符流(纯文本文件不包括图片)
1.创建文件
public static void testFileWriter(){
FileWriter fw = null;
try {
fw = new FileWriter("/Users/zzy/Downloads/filewriter.txt");
fw.write("鲁A08Z72");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.读取文件
public static void testFileReader(){
FileReader fr = null;
try {
fr = new FileReader("/Users/zzy/Downloads/项目整合步骤.txt");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1){
System.out.println(new String(buf, 0, len ));
}
} catch (Exception e) {
System.out.println("read-exception:" + e.toString());
} finally {
if (fr != null){
try {
fr.close();
} catch (IOException e) {
System.out.println("close-exception:"+ e.toString());
}
}
}
}
3.字符流的缓冲区
BufferedWriter
BufferdReader
三. 字节流(二进制文件,十六进制文件)
public static void readFile_2()throws IOException
{
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));
}
fis.close();
}
public static void writeFile()throws IOException
{
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());
fos.close();
}
四.字节流转字符流
转换流: InputStreamReader,
OutputStreamWriter
public static void testTransformer(){
//获取键盘录入对象。
//InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流。InputStreamReader
//InputStreamReader isr = new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
//BufferedReader bufr = new BufferedReader(isr);
//键盘的最常见写法。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
// OutputStream out = System.out;
// OutputStreamWriter osw = new OutputStreamWriter(out);
// BufferedWriter bufw = new BufferedWriter(osw);
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
try {
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufw != null){
try {
bufr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}