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中国小明