输出:程序到文件
输入:文件到程序
字节输出流:OutputStream类
作用:在java程序中写文件
这个类是抽象类,必须使用它的子类
方法:
写入:
package demo;import java.io.FileOutputStream;
import java.io.IOException;public class OutputStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("d:\\java.txt");
fos.write(100);// 写入d byte[] bytes = { 65, 66, 67, 68 };
fos.write(bytes);// 写入ABCD
fos.write(bytes, 1, 2);// 写入BC //写字符串,需要String类的方法
fos.write("java".getBytes());//写入java fos.close();
}
}
// 如果文件不存在,自动创建一个文件
// 如果存在则覆盖,因此使用时候有风险
续写:
package demo;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
File file = new File("d:\\java.txt");
FileOutputStream fos = new FileOutputStream(file, true);
fos.write("hello\r\n".getBytes());// 写hello后换行
fos.write("world".getBytes());
fos.close();
}
}
// 这里每次打开运行,如果文件存在,不会覆盖,而是新的内容追加到后面
异常处理(实际开发中需要):
package demo;import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo3 {
public static void main(String[] args) {
//try 外面声明变量,try 里面建立对象
FileOutputStream fos = null;
try{
fos = new FileOutputStream("d:\\a.txt");
fos.write(100);
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件写入失败,重试");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("关闭资源失败");
}
}
}
}
输入流:InputStream类:
读取文件:
package demo;import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamDemo {
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("c:\\a.txt");
//读取一个字节,调用方法read 返回int
//使用循环方式,读取文件, 循环结束的条件 read()方法返回-1
int len = 0;//接受read方法的返回值 while( (len = fis.read()) != -1){
System.out.print((char)len);
}
//关闭资源
fis.close();
}
}
读取字节数组:
package demo;import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\a.txt");
//创建字节数组,通常是1024
byte[] b = new byte[1024]; int len = 0 ;
while( (len = fis.read(b)) !=-1){
System.out.print(new String(b,0,len));
}
fis.close();
}
}
简单的文件复制:
用InputStream读取,OutputStream写
第一种(核心代码很简单,不过加上了异常处理显得复杂):
package demo;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class Copy {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("d:\\java.txt");
fos = new FileOutputStream("e:\\a.txt");
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
} catch (IOException ex) {
System.out.println(ex);
throw new RuntimeException("文件复制失败");
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException ex) {
throw new RuntimeException("释放资源失败");
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ex) {
throw new RuntimeException("释放资源失败");
}
}
}
}
}
可以复制所有文件,不过运行速度相对慢,如果复制大文件,循环次数多耗时长
采用数组缓冲提高效率:
package demo;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class Copy1 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//复制一部较大的视频
fis = new FileInputStream("f:\\AV.ev4");
fos = new FileOutputStream("d:\\study.ev4");
//定义一个字节数组,缓冲
byte[] bytes = new byte[1024*10];
int len = 0;
while((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
} catch (IOException ex) {
System.out.println(ex);
throw new RuntimeException("文件复制失败");
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException ex) {
throw new RuntimeException("释放资源失败");
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ex) {
throw new RuntimeException("释放资源失败");
}
}
}
}
}//发现很快的速度视频就复制好了
可以发现效率提高很大