FileOutputStream----字节输出流
常用API:
1.构造函数:
FileOutputStream(File file);//如果文件不存在则创建文件,如果文件存在则删除文件后重新创建文件。 FileOutputStream(File file, boolean append);//第二个参数如果为true的话在文件后面追加写入的内容。 FileOutputStream(String name);//和第1个一样 FileOutputStream(String name, boolean append) FileOutputStream(FileDescriptor fdObj);//通过文件描述符创建文件输出字节流
//文件描述符表示一个到文件系统中的某个实际文件的现有连接。
2.写文件方法:
void write(byte[] b);//把字节数组写入文件 void write(byte[] b, int off, int len);//把从字节数组b中的off下标开始,把字节写入文件,写入len个字节。 void write(int b);把int低八位写入文件,则写一个int(32位)要写四次: 每次右移八位.
3.其他方法:
void close() ;//关闭此文件输出流并释放与此流有关的所有系统资源。 protected void finalize();//清理到文件的连接,并确保在不再引用此文件输出流时调用此流的close方法。 FileChannel getChannel();//返回与此文件输出流有关的唯一 FileChannel 对象。 FileDescriptor getFD();//返回与此流有关的文件描述符。
4.实例:
(1) 写个文件试试:写入顺序:高八位,次高八位,次低八位,低八位。
(2) 写入的文件乱码,利用FileInputStream读取并转换成int类型。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class TestFileOutputStreamWrite { public static void main(String[] args) throws IOException { FileOutputStream fout=new FileOutputStream("testFileOutputStream.txt"); int b=99999; // write(int b):写入b的低八位 /* << :左移运算符,num << 1,相当于num乘以2 >> :右移运算符,num >> 1,相当于num除以2 >>> :无符号右移,忽略符号位,空位都以0补齐 */ writeInt(fout, b); fout.close(); FileInputStream fin=new FileInputStream("testFileOutputStream.txt"); int temp=readInt(fin); System.out.println(temp); fin.close(); } public static void writeInt(FileOutputStream fout,int b) throws IOException { fout.write(b>>24); fout.write(b>>16);//写次高八位 fout.write(b>>8); fout.write(b);//写入最低的八位 } public static int readInt(FileInputStream fin) throws IOException { int temp=-1; byte[] buf=new byte[4]; buf[0] = (byte)fin.read();//读取到的是前24位 buf[1] = (byte)fin.read(); buf[2] = (byte)fin.read(); buf[3] = (byte)fin.read();//读取到最后一个字节 temp= (int) ( ((buf[0] & 0xFF)<<24) |((buf[1] & 0xFF)<<16) |((buf[2] & 0xFF)<<8) |(buf[3] & 0xFF)); return temp; } }
运行结果:
99999
可以看到文件已经正确写入成功,而且正确读取解析成int类型
使用FileInputStream和FileOutputStream实现文件的拷贝:
代码:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { public static void copy(File srcFile,File targetFile) throws IOException { if(!srcFile.exists()) { throw new IllegalArgumentException( srcFile+"文件不存在"); } if(!srcFile.isFile()) { throw new IllegalArgumentException( srcFile+"不是文件"); } FileInputStream in=new FileInputStream(srcFile); FileOutputStream out=new FileOutputStream(targetFile); byte[] buf=new byte[2*1024]; int size=0; while((size=in.read(buf, 0, buf.length))!=-1) { out.write(buf, 0, size); out.flush();//刷新写入文件中去。 } in.close(); out.close(); } public static void main(String[] args) { try { copy(new File("test.txt"), new File("test副本.txt")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果:
test.txt:
abcd中国小明
test副本.txt:
abcd涓浗灏忔槑
这里乱码是因为test.txt是utf-8编码的,这个java工程是gbk编码的,生成test副本.txt的时候默认编码是gbk,在eclipse中把test副本.txt的编码改成utf-8编码就可以正常显示了:
test副本.txt:
abcd中国小明