Java中的字节流和字符流
2016-03-04 22:32
330 查看
在整个IO包中,流的操作就分为两种:
字节流:字节输出流OutputStream、字节输入流InputStream
字符流(一个字符=两个字节):字符输出流Writer、字符输入流是Reader
IO操作的基本步骤:
在java中使用IO操作必须按照以下的步骤完成:
1、使用File找到一个文件
2、使用字节流或字符流的子类为OutputStream、InputStream、Writer、Reader进行实例化操作
3、进行读或写的操作
4、关闭:close()
1、字节输出流:OutputStream
在java.io包中OutputStream是字节输出流的最大父类:
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
需要定义
此类是一个抽象类,所以使用时需要依靠子类进行实例化操作。如果此时要完成文件的输出操作,则使用FileOutputStream为OutputStream进行实例化操作。
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class OutputStreamDemo01 {public static void main(String[] args) throws IOException
{File file = new File("d:"+File.separator+"demo.txt");OutputStream out = null;
out = new FileOutputStream(file);String str = "hello world";
byte b[] = str.getBytes();out.write(b);
out.close();}}
以上的操作是将全部的字节数组内容输出,当然,也可以通过循环一个个的输出:
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class OutputStreamDemo2 {public static void main(String[] args) throws Exception {File
file = new File("d:"+File.separator+"demo.txt");OutputStream out = null;
out = new FileOutputStream(file);String str = "hello world!";
byte b[] = str.getBytes();for(int i=0;i<b.length;i++){
out.write(b[i]);}
out.close();}}
但是,以上执行的时候可以发现存在一些问题,每次执行完,所有的内容将会被新的内容替换。如果希望追加内容,则需要观察FileOutputStream类的构造方法:
如果将append的内容设置为true,则表示增加内容。
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class AppendOutputStreamDemo {public static void main(String[] args) throws Exception {File
file = new File("d:"+File.separator+"demo.txt");OutputStream out = new FileOutputStream(file,true);String str = "kdjfskdjks";
byte b[] = str.getBytes();out.write(b);
out.close();}}
2、字节输入流:InputStream
使用InputStream可以读取输入流的内容,那么此类的定义如下:
此类也属于一个抽象类,那么如果想要使用的话,则肯定还是依靠其子类,如果现在是文件操作则使用的是FileInputStream,FileInputStream类的构造方法:
实例化之后就可以通知如下的方法取得数据:
将内容读到字节数组中:public int read(byte[] b) throws IOException
每次读一个数据:public abstract int read() throws IOException
范例:将文件的内容读取进来:
package org.mole.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo1 {
public static void main(String args[]) throws Exception{
File file = new File("d:"+File.separator+"demo.txt");
InputStream in = new FileInputStream(file);
byte b[] = new byte[1024];//开辟空间接收读取的内容
int len = in.read(b);
System.out.println(new String(b,0,len));
in.close();
}
}
以上是一种比较常见的读取形式,但是以上的代码有一个缺点,会受到开辟空间的限制。如果现在想动态的开辟数组空间,则可以根据文件的大小来决定。采用read()方法一个个的读取数据
package org.mole.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo1 {
public static void main(String args[]) throws Exception{
File file = new File("d:"+File.separator+"demo.txt");
InputStream in = new FileInputStream(file);
byte b[] = new byte[(int)file.length()];//开辟空间接收读取的内容
for(int i=0;i<b.length;i++){
b[i] = (byte)in.read();//一个个的读取数据
}
System.out.println(new String(b));
in.close();
}
}
3、字符输出流:Writer
Writer类是在io包中操作字符的最大父类,主要功能是完成字符流的输出。Writer类的定义格式:
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
与OutputStream一样,都属于抽象类,如果要进行文件中的保存,则使用FileWriter。
写入操作:public void write(String str)throws IOException,不用再转换
package org.mole.io;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class WriterDemo1 {public static void main(String[] args) throws Exception {File file
= new File("d:"+File.separator+"demo.txt");Writer out = null;
out = new FileWriter(file);String str = "hello world(writer)";
out.write(str);out.close();
}}
程序也可以进行内容的追加:public FileWriter(File file,boolean append) throws IOException
package org.mole.io;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;public class AppendWriterDemo1 {public static void main(String[] args) throws IOException {File
file = new File("d:"+File.separator+"demo.txt");Writer w =new FileWriter(file,true);
String str ="hello world writer \r\n";
w.write(str);w.close();
}}
4、字符输入流:Reader
字符输入流与字节输入流不同的地方在,使用的是char数组。Reader类的定义:
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
是一个抽象类,要是现在进行文件的读取使用FileReader
读取的方法:
读取一组字符:public int read(char[] cbuf) throws IOException
读取一个个字符:public int read() throws IOException
package org.mole.io;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderDemo01 {
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator+"demo.txt");
Reader r = new FileReader(file);
char c[] =new char[1024];
int len = r.read(c);
System.out.println(new String(c,0,len));
r.close();
}
}
以上完成了一个字符的输入流,那么当然也可以通过循环的方式,一个个的进行读取的操作。
package org.mole.io;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderDemo02 {
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator+"demo.txt");
Reader r = new FileReader(file);
char c[] = new char[(int)file.length()];
for(int i=0;i<file.length();i++){
c[i] = (char)r.read();
}
System.out.println(new String(c));
r.close();
}
}
5、字节流与字符流的区别
字节流在操作的时候是直接与文件本身关联,不使用缓冲区;字符流在操作的时候是通过缓冲区与文件操作。综合比较来讲,在传输或者在硬盘上保存的内容都是以字节的形式存在的,所以字节流的操作较多,但是在操作中文的时候字符流比较好使。
本文的内容来自魔乐科技的教学视频,代码都经过了自己的测试。
字节流:字节输出流OutputStream、字节输入流InputStream
字符流(一个字符=两个字节):字符输出流Writer、字符输入流是Reader
IO操作的基本步骤:
在java中使用IO操作必须按照以下的步骤完成:
1、使用File找到一个文件
2、使用字节流或字符流的子类为OutputStream、InputStream、Writer、Reader进行实例化操作
3、进行读或写的操作
4、关闭:close()
1、字节输出流:OutputStream
在java.io包中OutputStream是字节输出流的最大父类:
public abstract class OutputStreamextends Objectimplements Closeable, Flushable
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。
需要定义
OutputStream子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。
此类是一个抽象类,所以使用时需要依靠子类进行实例化操作。如果此时要完成文件的输出操作,则使用FileOutputStream为OutputStream进行实例化操作。
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class OutputStreamDemo01 {public static void main(String[] args) throws IOException
{File file = new File("d:"+File.separator+"demo.txt");OutputStream out = null;
out = new FileOutputStream(file);String str = "hello world";
byte b[] = str.getBytes();out.write(b);
out.close();}}
以上的操作是将全部的字节数组内容输出,当然,也可以通过循环一个个的输出:
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class OutputStreamDemo2 {public static void main(String[] args) throws Exception {File
file = new File("d:"+File.separator+"demo.txt");OutputStream out = null;
out = new FileOutputStream(file);String str = "hello world!";
byte b[] = str.getBytes();for(int i=0;i<b.length;i++){
out.write(b[i]);}
out.close();}}
但是,以上执行的时候可以发现存在一些问题,每次执行完,所有的内容将会被新的内容替换。如果希望追加内容,则需要观察FileOutputStream类的构造方法:
FileOutputStream(File file, boolean append)创建一个向指定
File对象表示的文件中写入数据的文件输出流。
如果将append的内容设置为true,则表示增加内容。
package org.mole.io;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class AppendOutputStreamDemo {public static void main(String[] args) throws Exception {File
file = new File("d:"+File.separator+"demo.txt");OutputStream out = new FileOutputStream(file,true);String str = "kdjfskdjks";
byte b[] = str.getBytes();out.write(b);
out.close();}}
2、字节输入流:InputStream
使用InputStream可以读取输入流的内容,那么此类的定义如下:
public abstract class IntputStreamextends Objectimplements Closeable
此类也属于一个抽象类,那么如果想要使用的话,则肯定还是依靠其子类,如果现在是文件操作则使用的是FileInputStream,FileInputStream类的构造方法:
public class FileInputStreamextends InputStream
实例化之后就可以通知如下的方法取得数据:
将内容读到字节数组中:public int read(byte[] b) throws IOException
每次读一个数据:public abstract int read() throws IOException
范例:将文件的内容读取进来:
package org.mole.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo1 {
public static void main(String args[]) throws Exception{
File file = new File("d:"+File.separator+"demo.txt");
InputStream in = new FileInputStream(file);
byte b[] = new byte[1024];//开辟空间接收读取的内容
int len = in.read(b);
System.out.println(new String(b,0,len));
in.close();
}
}
以上是一种比较常见的读取形式,但是以上的代码有一个缺点,会受到开辟空间的限制。如果现在想动态的开辟数组空间,则可以根据文件的大小来决定。采用read()方法一个个的读取数据
package org.mole.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo1 {
public static void main(String args[]) throws Exception{
File file = new File("d:"+File.separator+"demo.txt");
InputStream in = new FileInputStream(file);
byte b[] = new byte[(int)file.length()];//开辟空间接收读取的内容
for(int i=0;i<b.length;i++){
b[i] = (byte)in.read();//一个个的读取数据
}
System.out.println(new String(b));
in.close();
}
}
3、字符输出流:Writer
Writer类是在io包中操作字符的最大父类,主要功能是完成字符流的输出。Writer类的定义格式:
public abstract class Writerextends Objectimplements Appendable, Closeable, Flushable
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
与OutputStream一样,都属于抽象类,如果要进行文件中的保存,则使用FileWriter。
写入操作:public void write(String str)throws IOException,不用再转换
package org.mole.io;import java.io.File;import java.io.FileWriter;import java.io.Writer;public class WriterDemo1 {public static void main(String[] args) throws Exception {File file
= new File("d:"+File.separator+"demo.txt");Writer out = null;
out = new FileWriter(file);String str = "hello world(writer)";
out.write(str);out.close();
}}
程序也可以进行内容的追加:public FileWriter(File file,boolean append) throws IOException
package org.mole.io;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;public class AppendWriterDemo1 {public static void main(String[] args) throws IOException {File
file = new File("d:"+File.separator+"demo.txt");Writer w =new FileWriter(file,true);
String str ="hello world writer \r\n";
w.write(str);w.close();
}}
4、字符输入流:Reader
字符输入流与字节输入流不同的地方在,使用的是char数组。Reader类的定义:
public abstract class Readerextends Objectimplements Readable, Closeable
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
是一个抽象类,要是现在进行文件的读取使用FileReader
读取的方法:
读取一组字符:public int read(char[] cbuf) throws IOException
读取一个个字符:public int read() throws IOException
package org.mole.io;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderDemo01 {
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator+"demo.txt");
Reader r = new FileReader(file);
char c[] =new char[1024];
int len = r.read(c);
System.out.println(new String(c,0,len));
r.close();
}
}
以上完成了一个字符的输入流,那么当然也可以通过循环的方式,一个个的进行读取的操作。
package org.mole.io;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderDemo02 {
public static void main(String[] args) throws IOException {
File file = new File("d:"+File.separator+"demo.txt");
Reader r = new FileReader(file);
char c[] = new char[(int)file.length()];
for(int i=0;i<file.length();i++){
c[i] = (char)r.read();
}
System.out.println(new String(c));
r.close();
}
}
5、字节流与字符流的区别
字节流在操作的时候是直接与文件本身关联,不使用缓冲区;字符流在操作的时候是通过缓冲区与文件操作。综合比较来讲,在传输或者在硬盘上保存的内容都是以字节的形式存在的,所以字节流的操作较多,但是在操作中文的时候字符流比较好使。
本文的内容来自魔乐科技的教学视频,代码都经过了自己的测试。
相关文章推荐
- SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-003- SPRING的GENERAL TAG LIBRARY简介及用<s:message>和ReloadableResourceBundleMessageSource实现国际化
- 重新认识java-Vector
- java中ArrayList和class简介
- Java直接内存与非直接内存性能测试
- JAVA【类】析构器、重载与继承、方法的重写、自动转型、多态、方法与类的分类、接口继承
- java中的方法和数组
- java设计模式——创建型之工厂三兄弟(3)
- java----会动的方块
- spring 配置文件中dbcp连接池,jdbc连接池 引入 配置文件properties,但是不能用$符号引用里面的变量问题
- java关键字之我见
- java第一章 JAVA语言概述知识点
- IT十八掌作业_java基础第八天_多线程
- 如何终止java线程
- Java输入输出(二)——具体操作
- java观察者模式(一)
- 20145328 《Java程序设计》第0周学习总结
- 【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
- 在Eclipse中做SVN代码回退操作
- java.lang.NoClassDefFoundError 怎么解决
- 快速地搜索手机文件引擎(JavaIO的应用)