java IO
InputStream:输入流
OutputStream:输出流
java中的流分为 :
低级流 :数据有明确来源和去向.
高级流(过滤流,处理流):不能独立存在,必须依托于另一个流.使用高级流是为了简化读写操作.
根据读写的数据单位通常分为字节流和字符流
字节流:以字节为单位读写数据
字符流:以字符为单位读写数据
文件字节输入输出流:
FileInputStream:文件输入流 (从文件中读取)
FileOutPutStream:文件输出流(向文件中写)
FileOutputStream:写方法
write(int d):一次写一个字节,写int的低8位
write(byte[]d):一次将字节数组中所有字节写出
write(byte[] d,int offset,int len):一次将字节数组中从offset开始连续写len个字节
用法与RandomAccessFile的写方法一样
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 文件输出流
* FileOutputStream是一个节点流.数据有明确的来源
* 来自文件 且他是一个字节流,以字节为单位写出数据
* @author Administrator
*
*/
public class FileOutPutStreamDemo {
public static void main(String[] args) throws IOException {
File file=new File("output.dat");//创建File实例
if(!file.exists()){file.createNewFile();}//不存在就创建一个
//创建一个用于写文件的输出流
//java.io.FileOutputStream
FileOutputStream fos=new FileOutputStream(file);//FileOutputStream 实例
//写入一个字符a
//write(int d):一次写一个字节,写的是int的低8位
fos.write('a');//写入基本与RandomAccessFile无二致
fos.close();
}
}
将String转为byte[]并且写入文件
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用输出流写字符串到文件中
* @author Administrator
*
*/
public class FileOutputStreamWriteString {
public static void main(String[] args) throws IOException {
File file=new File("output.dat");
if(!file.exists()){file.createNewFile();}
/**
* 重载的构造方法
* 第二个参数为一个boolean值
* true:允许从文件末尾追加行内容
* false:每次从文件开始写(清空上一次的内容)
*/
FileOutputStream fos=new FileOutputStream(file,true);//重载方法
String str="我爱!";
//将字符串转换为字节数组
byte[] data=str.getBytes("UTF-8");
//将字节数组中所有字节一次性写出
fos.write(data);
fos.close();
}
}
事实上,并不需要让File实例化,但是!!
要确保给出的是一个文件以及有可以创建文件的权限!!!
不能是目录以及无创建文件的权限.
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutPutStreamDemo2 {
public static void main(String[] args) throws IOException {
//可以根据字符串指定路径,对该文件进行操作
FileOutputStream fos=new FileOutputStream("outDemo.txt",true);
fos.write('A');
fos.write('B');
fos.close();
}
}
FileIntputStream 文件输入流 以字节为单位读取数据
intread():一次读取一个字节,返回的int值只有低八位有效,若返回的值为-1说明EOF
int read(byte[] d): 一次读取一个byte[] ,返回值是读取了多少个byte值.
int read(byte[] d,int offset,intlen):尝试读取len个字节,存入给定数组,存入位置从offset开始,返回值为实际读取的字节数.
例如:
文件中的内容{0,1,2,3,4,5,6,7,8,9}
byte[] b=new byte[10];
int sum=fis.red(b,1,8); 返回的sum是8
b= ==>{0,0,1,2,3,4,5,6,7,0}
FileInputStream
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* FileInputScream读取文件内容
* @author Administrator
*
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
File file=new File("output.txt");
FileInputStream fis=new FileInputStream(file);
// for(int d=-1;;){
// if((d=fis.read())!=-1){
// System.out.print(Integer.toHexString(d)+" ");
// }else{break;}
// }
// byte[] buf=new byte[102];
// int sum=fis.read(buf);
// //字符串重载构造方法
// //String(byte[] data,int offset,int len,String charset)
// String str=new String(buf,0,sum,"UTF-8");
//根据操作的文件对象,获取文件大小并创建字节数组
byte[] buf=new byte[(int)file.length()];
fis.read(buf);
String str=new String(buf,"utf-8");
System.out.println(str);
fis.close();
}
}
FileInputStream也有一个重载方法
import java.io.FileInputStream;
import java.io.IOException;
/**
* FileInputStream的重载构造方法
* FileInputStream(String filename)
* 根据字符串描述的文件路径,读取该文件
* @author Administrator
*
*/
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
//文件不存在直接报错
FileInputStream fis=new FileInputStream("output.txt");
/**
* FileInputStream的方法
* int available():返回当前输入流允许读取的总字节量
* 这里就相当于是文件的大小
* 注意,该方法是InputStream中定义的,就是说所有的输入流都有该方法.但是实现上有细微差别,
* 不建议使用该方法将字节数组的长度定为返回值
*/
byte[] buf=new byte[fis.available()];
fis.read(buf);
String str=new String(buf,"UTF-8");
System.out.println(str);
fis.close();
}
}
使用文件输入输出流复制文件
>import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("o.jar");
FileOutputStream fos=new FileOutputStream("o1.jar");
byte[] buf=new byte[1024*10];
for(int i=0;;){
if((i=fis.read(buf))>0){
fos.write(buf,0,i);
}else{break;}
}
fis.close();
fos.close();
}
}