一、OutputStream
- 此抽象类是表示输出字节流的所有类的超类。
- 输出流接受输出字节并将这些字节发送到某个接收器。
- 需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。
- 直接已知子类:
- ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
public abstract class OutputStream implements Closeable, Flushable
{
/**
*关闭此输出流并释放与此流有关的所有系统资源。
*close 的常规协定是:该方法将关闭输出流。
*关闭的流不能执行输出操作,也不能重新打开。
*/
public void close()
throws IOException{}
//刷新此输出流并强制写出所有缓冲的输出字节,OutputStream 的 flush 方法不执行任何操作
public void flush()
throws IOException{}
//将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同
//不用刷新,就直接写入数据了,和字符流不一样
public void write(byte[] b)
throws IOException{}
//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void write(byte[] b,
int off,
int len)
throws IOException{}
//将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
public abstract void write(int b)
throws IOException;
}
二、FileOutputStream
- 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
- 文件是否可用或能否可以被创建取决于基础平台。
- 特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。
- 在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
- FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter
public class FileOutputStream extends OutputStream
{
//创建一个向指定 File 对象表示的文件中写入数据的文件输出流
public FileOutputStream(File file)
throws FileNotFoundException{}
//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处
public FileOutputStream(File file,
boolean append)
throws FileNotFoundException{}
//File file 可以换成 String name
}
三、InputStream
- 此抽象类是表示字节输入流的所有类的超类。
- 需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。
- 直接已知子类
- InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
- AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream,
public abstract class InputStream implements Closeable
{
/**
*返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
*下一个调用可能是同一个线程,也可能是另一个线程。
*一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。
*注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。
*试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的
*/
public int available()
throws IOException{}
/**
*从输入流中读取数据的下一个字节。
*返回 0 到 255 范围内的 int 字节值。
*如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
*在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
*/
public abstract int read()
throws IOException;
//从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
public int read(byte[] b)
throws IOException{}
//将输入流中最多 len 个数据字节读入 byte 数组。
public int read(byte[] b,
int off,
int len)
throws IOException{}
//跳过和丢弃此输入流中数据的 n 个字节
public long skip(long n)
throws IOException{}
}
四、FileInputStream
- FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。
- FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
public class FileInputStream extends InputStream
{
//通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
public FileInputStream(File file)
throws FileNotFoundException{}
//通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
public FileInputStream(String name)
throws FileNotFoundException{}
}
五、示例
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
* 需求:拷贝任意文件
*
*/
public class InputStreamTest {
public static void main(String[] args) throws IOException {
String resName = "E:/m.jpg";
String desName = "c:/m.jpg";
copy(resName,desName);
}
public static void copy(String resName,String desName) throws IOException
{
FileInputStream fis = new FileInputStream(resName);
FileOutputStream fos = new FileOutputStream(desName);
byte[] buf = new byte[1024];
int num = 0;
while((num=fis.read(buf))!=-1)
{
fos.write(buf);
}
fis.close();
fos.close();
System.out.println("复制成功");
}
}
六、缓冲区字节流
/**
*该类实现缓冲的输出流。
*通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
*/
public class BufferedOutputStream extends FilterOutputStream
{
//创建一个新的缓冲输出流,以将数据写入指定的底层输出流
public BufferedOutputStream(OutputStream out){}
//创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
public BufferedOutputStream(OutputStream out,
int size){}
}
/**
*BufferedInputStream 为另一个输入流添加一些功能,
*即缓冲输入以及支持 mark 和 reset 方法的能力。
*在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
*在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
*/
public class BufferedInputStream extends FilterInputStream
{
//创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个内部缓冲区数组并将其存储在 buf 中。
public BufferedInputStream(InputStream in){}
//创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个长度为 size 的内部缓冲区数组并将其存储在 buf 中
public BufferedInputStream(InputStream in,
int size){}
}
七、示例
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=br.readLine())!=null)
{
if(line.equals("over"))
break;
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
八、PrintStream
- PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
- 它还提供其他两项功能。
- 与其他输出流不同,PrintStream 永远不会抛出 IOException;
- 而是,异常情况仅设置可通过 checkError 方法测试的内部标志。
- 另外,为了自动刷新,可以创建一个 PrintStream;
- 这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 ('\n')。
- PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
public class PrintStream extends FilterOutputStream implements Appendable, Closeable
{
//创建具有指定文件且不带自动行刷新的新打印流
public PrintStream(File file)
throws FileNotFoundException{}
//创建具有指定文件名称和字符集且不带自动行刷新的新打印流
public PrintStream(File file,
String csn)
throws FileNotFoundException,
UnsupportedEncodingException{}
//创建新的打印流。此流将不会自动刷新
public PrintStream(OutputStream out){}
//创建新的打印流
public PrintStream(OutputStream out,
boolean autoFlush){}
//创建新的打印流
public PrintStream(OutputStream out,
boolean autoFlush,
String encoding)
throws UnsupportedEncodingException{}
//创建具有指定文件名称且不带自动行刷新的新打印流
public PrintStream(String fileName)
throws FileNotFoundException{}
//创建具有指定文件名称和字符集且不带自动行刷新的新打印流
public PrintStream(String fileName,
String csn)
throws FileNotFoundException,
UnsupportedEncodingException{}
//打印 boolean,char,double,float,int,long,char[] s,Ojbect obj,String s 值
public void print(boolean b){}
public void print(boolean b){}//打印,然后终止该行
}
九、示例
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
public class PrintStreamTest {
public static void main(String[] args) throws IOException{
//设置标准输入
System.setIn(new FileInputStream("E:/m.txt"));
//设置标准输出
System.setOut(new PrintStream("C:/m.txt"));
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=br.readLine())!=null)
{
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* 将异常信息存入异常文件
*
*/
public class PrintStreamTest {
public static void main(String[] args) throws FileNotFoundException{
try{
int[] arr = new int[2];
System.out.println(arr[2]);
} catch(Exception e){
System.setOut(new PrintStream("E:/exception.txt"));
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String time = sdf.format(d);
System.out.println(time);
e.printStackTrace(System.out);
}
}
}
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Properties;
/**
*
* 将系统信息存入文件
*
*/
public class PrintStreamTest {
public static void main(String[] args) throws FileNotFoundException{
Properties pro = System.getProperties();
pro.list(new PrintStream("E:/properties.txt"));
}
}