您的位置:首页 > 职场人生

黑马程序员——IO流(上)

2015-09-12 17:18 633 查看
——- android培训java培训、期待与您交流! ———-

IO(Input Output)流概述

*IO流用于处理设备之间数据传输
*JAVA对数据操作通过流的方式
*JAVA用于处理的对象都在IO包中
*流按照操作数据分为两种:字节流与字符流
(字节流就是我们常用指种种文件如:视频,图片等
[由二进制数构构成]字符流就是我们常常用到的文本)
*流按照流向分为输入流输出流


IO流常用基类

*字节流的抽象基类
1.InputStream(输入流) 2.OutputStream(输出流)
*字符流的抽象基类
1.Reader(读) 2.Writer(写)
*注:
由于这四个类派生出来的子类名称都是以其父类名作为子类名后缀
*如InputStream的子类FileInputStream
*如Reader的子类FileReader


下面我们通过一些例子来掌握IO流的四种基本用法

要求:在硬盘上创建一个文件并写入文字数据

分析:想要在硬盘上创建数据那就用到输出流,而且写入的是文本,所以我们用到一个专门用于Writer的子类,FileWriter。注意: 后缀名父类,前缀名是功能。

我们用到的构造方法摘要:

FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。


我们用到的写入方法:

void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
void flush()
刷新该流的缓冲 (因为是字符流每次写最好都要刷新一次,否则数据写不到硬盘中)


代码:

import java.io.FileWriter;
import java.io.IOException;

public class WriteDemo {

/**
*在硬盘上创建一个文件并写入文字数据
*/
private void writeFile(){
try {
//创建对象,还有个对象可以往里面添加数据,FileWriter(String fileName, boolean append)
FileWriter fos = new FileWriter("c:\\puke\\woshiku.txt");
//写入文件
fos.write("ni hao wo shi");
//刷新一下内存中的数据写入硬盘
fos.flush();
//关闭流
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
new WriteDemo().writeFile();
}

}




要求:我们在硬盘上读取写入的文本

上面是写入下面我们来讲一下如何得到写入的文本

分析:想要获得文本那就用Reader方法,所以我们用到一个专门用于Reader的子类,FileReader。注意: 后缀名父类,前缀名是功能。

我们要用到的构造方法摘要 :

FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。


我们用到的读取方法:

int read() 读取单个字符。
int read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。


方法一:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadDemo {

/**
* 我们在硬盘上读取写入的文本,打印在控制台上
*/
private void readFile(){
try {
//建立对象
FileReader fis = new FileReader("c:\\puke\\woshiku.txt");
StringBuilder sb = new StringBuilder();
int c;
try {
//读取单个字符
while((c=fis.read())!=-1){
//缓存字符
sb.append((char)c);
}
//打印数据
System.out.println(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ReadDemo().readFile();
}

}


方法二:(定义数组来读取)
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadDemo {

/**
* 我们在硬盘上读取写入的文本,打印在控制台上
*/
private void readFile(){
try {
//建立对象
FileReader fis = new FileReader("c:\\puke\\woshiku.txt");
char []buf = new char[1024];
//用于存储读入的字符数
int len;
try {
//读取文件,返回读取的字符数量,如果读完,则会返回-1
while((len=fis.read(buf))!=-1){
//打印读取的文字
System.out.println(new String(buf,0,len));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ReadDemo().readFile();
}

}




无论是写字符串还是读取文件,都太不方便,对与文字,可不可以按行读取,按行写数据呢!答案是可以的,下面我们学习一下缓存一下我们读到的数据!

BufferedReader类:

功能:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。


我们用到的构造方法摘要

BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。


我们用到的方法:

String readLine() 读取一个文本行。


代码:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/*读取文本文件并打印在控制台上
*/
public class ReadLineDemo {
private void readDemo(){
try {
//创建缓存流对象
BufferedReader fis = new BufferedReader(new FileReader("c:\\puke\\test.txt"));
//用于获取文本
String line = null;
try {
//读行行,如果返回null
while((line=fis.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//读完关闭流
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ReadLineDemo().readDemo();
}

}




既然有读行那么有写入行吗?答案是有的。

下面我们来介绍一下PrintWriter

我们要用到的构造方法:

PrintWriter(Writer out)
创建不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush)
创建新 PrintWriter。


我们要求用到的方法:

void print(boolean b)
打印 boolean 值。
void print(char c)
打印字符。
void print(char[] s)
打印字符数组。
void print(double d)
打印 double 精度浮点数。
void print(float f)
打印一个浮点数。
void print(int i)
打印整数。
void print(long l)
打印 long 整数。
void print(Object obj)
打印对象。
void print(String s)
打印字符串。
void println(String x)
打印 String,然后终止该行。
void  flush();


代码:

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/*
打印文本到硬盘上
*/
public class WriteLineDemo {
private void writeDemo(){
try {
//创建对象并指定输出路径
PrintWriter fos = new PrintWriter(new FileWriter("c:\\puke\\copy test.txt"));
fos.println("woshiku haha");
fos.println("woshiku1 haha");
fos.println("woshiku2 haha");
fos.println("woshiku3 haha");
fos.println("woshiku4 haha");
fos.println("woshiku5 haha");
fos.flush();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new WriteLineDemo().writeDemo();
}

}




——- android培训java培训、期待与您交流! ———-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: