您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第12章:JAVA IO】_字节流与字符流
发布时间:2020-12-27 18:40:24编辑:雪饮阅读()
FileOutputStream类提供了字节流写入文件的解决方案
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);
String str="hello kasumi!!!";
byte b[]=str.getBytes();
out.write(b);
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
FileOutputStream类提供的write字节流写入操作不仅仅支持字节数组,还支持单个字节写入
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
OutputStream out=new FileOutputStream(f);
String str="hello kasumi!!!";
byte b[]=str.getBytes();
for(byte x:b){
out.write(x);
}
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
在FileOutputStream类进行实例化的时候构造参数若传递两个并且第二个参数是布尔值的true则表示接下来对字节流的写入是以追加的形式。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
OutputStream out=new FileOutputStream(f,true);
String str="hello kasumi!!!";
byte b[]=str.getBytes();
for(byte x:b){
out.write(x);
}
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
“\r\n”是在C-S架构中C端中常用的一种换行符号,那么在这里也是可以使用的。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
OutputStream out=new FileOutputStream(f,true);
String str="hello\r\nkasumi!!!";
byte b[]=str.getBytes();
for(byte x:b){
out.write(x);
}
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
FileInputStream类提供了对输入流的一些解决方案
比如这里以读取一个文件的内容为例。这里实现的思路就是创建一个字节数组,因为我们读入进来的是字节,然后我们把字节数组填充满了之后再向下转型为String类即可完成输入流的读取。这是大致的逻辑,还有更细节的东西,具体我们来看看实现如:
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
InputStream input=new FileInputStream(f);
byte b[]=new byte[1024];
input.read(b);
input.close();
System.out.println("内容为:"+new String(b));
}
}
D:\>javac TestJava.java
D:\>java TestJava
内容为:hello kasumi!!!hello kasumi!!!hello kasumi!!!
hello
kasumi!!!
这里看得不是很清楚,但是你在命令行中会发现有好多空行,是因为我们不知道被读入的文件的字节数是多少,所以我们就写死为1024的长度,但是因为实际文件内容字节数小于1024,所以导致这个字节数组被填充过后还剩余有好多空白的未填充的数组元素位。
输入流读入数据长度的获取
FileInputStream类的实例提供的read方法接收一个字节数组,一般都是空的,那么该方法除了将读入的数据填充到字节数组中之外同时还返回一个int型值,该值是被读入的输入流的总长度(有效长度)即字节数。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
InputStream input=new FileInputStream(f);
byte b[]=new byte[1024];
int len=input.read(b);
input.close();
System.out.println("读入数据长度:"+len);
System.out.println("内容为:"+new String(b));
}
}
D:\>javac TestJava.java
D:\>java TestJava
读入数据长度:63
内容为:hello kasumi!!!hello kasumi!!!hello kasumi!!!
hello
kasumi!!!
FileInputStream实例length方法
FileInputStream实例的length方法可以返回输入流的总字节长度,而这个长度区别于上面input.read方法获取的长度,后者获取的长度是再输入流读取结束之后才能拿到,那么length则是可以在输入流没有读取的情况下直接拿到,那么显然第一种的应用场景会更丰富些。同样可以利用这个length方法解决上面我们定死字节数组长度的问题。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
InputStream input=new FileInputStream(f);
byte b[]=new byte[(int)f.length()];
int len=input.read(b);
input.close();
System.out.println("读入数据长度:"+len);
System.out.println("内容为:"+new String(b));
}
}
D:\>javac TestJava.java
D:\>java TestJava
读入数据长度:63
内容为:hello kasumi!!!hello kasumi!!!hello kasumi!!!
hello
kasumi!!!
FileInputStream的read方法也可以接收单字节的形式进行读入输入流
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
InputStream input=new FileInputStream(f);
byte b[]=new byte[(int)f.length()];
for(int i=0;i<b.length;i++){
b[i]=(byte)input.read();
}
input.close();
System.out.println("内容为:"+new String(b));
}
}
D:\>javac TestJava.java
D:\>java TestJava
内容为:hello kasumi!!!hello kasumi!!!hello kasumi!!!
hello
kasumi!!!
FileInputStream提供的read方法还可以用于判断读取的输入流是否到达输入流的尾部
可以利用此特性则也可以解决上面字节数组定义过大导致的空白问题。(结合String实例化时支持字节数组局部转为String的特性)
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
InputStream input=new FileInputStream(f);
byte b[]=new byte[1024];
int len=0;
int temp=0;
while((temp=input.read())!=-1){
b[len]=(byte)temp;
len++;
}
input.close();
System.out.println("内容为:"+new String(b,0,len));
}
}
D:\>javac TestJava.java
D:\>java TestJava
内容为:hello kasumi!!!hello kasumi!!!hello kasumi!!!
hello
kasumi!!!
FileWriter类提供write方法可以直接将字符串写入到文件中,不用像上面操作流一样那么麻烦。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Writer out=new FileWriter(f);
String str="kasumi 万岁";
out.write(str);
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
那么FileWriter也和上面流操作写入的时候一样,也支持追加的形式
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Writer out=new FileWriter(f,true);
String str="kasumi 万岁";
out.write(str);
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
那么换行也同样是支持的
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Writer out=new FileWriter(f,true);
String str="kasumi \r\n万岁";
out.write(str);
out.close();
}
}
D:\>javac TestJava.java
D:\>java TestJava
FileReader类提供了可以像上面对输入流读取的操作,只是FileReader是基于字符数组来进行读取的。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Reader input=new FileReader(f);
char c[]=new char[1024];
int len=input.read(c);
input.close();
System.out.println("内容为:"+new String(c,0,len));
}
}
D:\>javac TestJava.java
D:\>java TestJava
内容为:kasumi 万岁kasumi 万岁kasumi
万岁
同样也是支持按单个字符进行读取的
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Reader input=new FileReader(f);
char c[]=new char[1024];
int temp=0;
int len=0;
while((temp=input.read())!=-1){
c[len]=(char)temp;
len++;
}
input.close();
System.out.println("内容为:"+new String(c,0,len));
}
}
D:\>javac TestJava.java
D:\>java TestJava
内容为:kasumi 万岁kasumi 万岁kasumi
万岁
OutputStream的write方法可以在输出流不关闭的情况下也能写入输出流到文件中
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
OutputStream out=new FileOutputStream(f);
String str="hello ayane";
byte b[]=str.getBytes();
out.write(b);
}
}
FileWriter的write方法如果在输出流不关闭的情况下则虽然程序执行成功,但实际上输出流并没有成功写入到文件中
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Writer out=new FileWriter(f);
String str="hello ayane";
out.write(str);
}
}
虽然说FileWriter不关闭输出流情况下无法成功将输入流写入到文件,但是FileWriter提供了flush方法,若执行该方法也可以强制刷新输出流,则也就成功写入到文件了。
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
public class TestJava{
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
Writer out=new FileWriter(f);
String str="hello ayane";
out.write(str);
out.flush();
}
}
综合演练
经过上面字节流与字符流的一系列操作,我们大致上对字节流和字符流的操作了解的差不多了,接下来我们来进行一项综合的应用,比如写一个文件拷贝的功能,如
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.io.FileWriter;
import java.io.Reader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestJava{
public static void main(String args[]) throws Exception{
if(args.length!=2){ // 判断是否是两个参数
System.out.println("输入的参数不正确。") ;
System.out.println("例:java 源文件路径 目标文件路径") ;
System.exit(1) ; // 系统退出
}
File f1 = new File(args[0]) ; // 源文件的File对象
File f2 = new File(args[1]) ; // 目标文件的File对象
if(!f1.exists()){
System.out.println("源文件不存在!") ;
System.exit(1) ;
}
try{
// 准备好输入流对象,读取源文件
InputStream input = new FileInputStream(f1) ;
// 准备好输出流对象,写入目标文件
OutputStream out = new FileOutputStream(f2) ;
if(input!=null && out!=null){ // 判断输入或输出是否准备好
int temp = 0 ;
while((temp=input.read())!=-1){ // 开始拷贝
out.write(temp) ; // 边读边写
}
System.out.println("拷贝完成!") ;
input.close() ; // 关闭
out.close() ; // 关闭
}
}catch(FileNotFoundException e){
e.printStackTrace() ;
}
catch(IOException e){
e.printStackTrace() ;
System.out.println("拷贝失败!") ;
}
}
}
D:\>javac TestJava.java
D:\>java TestJava
输入的参数不正确。
例:java 源文件路径 目标文件路径
D:\>java TestJava d:\test.txt d:\demo.txt
拷贝完成!
关键字词:java,字节,字符,输入,输出