如果要进行文件内容的操作那么必须依靠数据流完成,而数据流分为两种:
输入和输出是针对内存来说的:
字节流与字符流操作的本质区别只有一个:字节流是原生的操作,而字符流是经过处理后的操作。
网络数据传输
、磁盘数据
所支持的数据类型只有:字节
。字节变为字符
。字符更加适合处理中文。不管使用的是字节流还是字符流,其基本的操作流程几乎是一样的,以文件操作为例。
对于IO操作属于资源处理,所有的资源处理操作(IO操作、数据库操作、网络)最后必须要进行关闭。
字节输出流主要以操作byte数据为主,观察java.io.OutputStream类的定义结构:
public abstract class OutputStream implements Closeable, Flushable
OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:
public class Demo {
public static void main(String[] args) throws IOException {
//第一步:定义要输出的文件的File类对象
File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
//输出信息的时候文件可以不存在,但是目录必须存在
if(!file.getParentFile().exists()) {//父路径不存在
file.getParentFile().mkdirs();//创建父路径
}
//第二步:利用OutputStream的子类为父类进行实例化
OutputStream output = new FileOutputStream(file);
//第三步:输出文字信息
String msg = "富则达济天下,穷则独善其身";//字符串
//为了方便输出需要将字符串变为字节数组
byte data[] = msg.getBytes();//变为字节数组
output.write(data);//输出数据
output.close();//关闭流
}
}
InputStream可以实现数据的读取操作,在java中InputStream类的定义如下:
public abstract class InputStream implements Closeable
InputStream类中定义有三个数据的读取操作方法:
InputStream是一个抽象类,所以要进行文件的读取使用FileInputStream子类,子类定义的构造方法如下:
构造方法:public FileInputStream(File file) throws FileNotFoundException.
@SuppressWarnings("unused")
public class Demo {
public static void main(String[] args) throws IOException {
//第一步:定义要输出的文件的File类对象
File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
//第二步:实例化InputStream
InputStream input = new FileInputStream(file);
//实现数据的读取操作
byte data[] = new byte[1024];
int len = input.read(data);//将数据读取到数组之中
System.out.println("读取的内容【" +new String(data,0,len)+"】");
//第四步关闭输入流
input.close();
}
}
Writer是进行字符输出操作使用的类,这个类属于抽象类,观察定义:
public abstract class Writer implements Appendable, Closeable, Flushable
这个Writer类可以直接输出字符串:public void write(String str) throws IOException
Writer是一个抽象类,要进行文件字符流操作,其构造方法为:
@SuppressWarnings("unused")
public class Demo {
public static void main(String[] args) throws IOException {
//第一步:定义要输出的文件的File类对象
File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Writer out = new FileWriter(file);
String str = "一定要好好学习,天天向上。。。";
out.write(str);
out.close();
}
}
虽然Writer类提供有字符数组的输出操作能力,但是从本质上来讲使用Writer类就意味着要执行字符串的直接输出。
字符流最适合操作中文,但并不意味着字节流就无法操作中文。
Reader一定是一个抽象类,其定义为:
public abstract class Reader extends Object implements Readable,Closeable
在Reader类中也提供有一系列的read()方法。
范例:数据的读取
@SuppressWarnings("unused")
public class Demo {
public static void main(String[] args) throws IOException {
//第一步:定义要输出的文件的File类对象
File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
if(file.exists()) {
Reader in = new FileReader(file);
char data[] = new char[1024];
int len = in.read(data);//向字符数组保存数据,返回长度。
System.out.println(new String(data,0,len));
in.close();
}
}
}
首先必须要明确一点,通过任何终端(网络、文件)读取或者输出的数据都一定是字节,字符是经过内存处理后的数据。
字符输入:字节(磁盘)–> 自动转换为 –>字符(内存);
字符输出:字符(内存)–> 自动转换为–>字节(磁盘);
在利用字符流输出的时候,所有的内容实际上都只是输出到了缓冲区中(内存)。在使用close()方法关闭的时候会将我们缓冲区的数据进行输出,如果没有关闭,那么就将无法进行输出,此时可以利用flush()方法进行强制的输出。
字符使用到了缓冲区,而字节流没有使用到缓冲区。
如果处理中文使用字符流,其他的任何数据都使用字节流。
参与评论
手机查看
返回顶部