这两个字节派生类 主要针对于文件操作:
FileOutputStream:
//往文件中写入一个数据
public static void main(String[] args) {
try {
FileOutputStream file = new FileOutputStream("D://a.txt");//会出现编译时异常,必须现在处理
//如果a.txt不存在 则会被创建,如果存在 ,则不创建
/*
* 创建字节输出流对象做了几件事情:
* A:调用系统功能去创建文件
* B:创建file对象
* C:把file对象指向这个文件
*/
String s="你好我是";
//方法用byte 写入 所以将文字先转成byte
byte [] b = s.getBytes();
file.write(b);
file.close();
//一定要close()
//1,释放资源,让流对象变成垃圾,这样就可以被垃圾回收了
//通知系统,这个变成垃圾了,然后释放与该文件相关的资源
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileOutputStream 三个写入方法:
public static void test2(){
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("D:/a.txt");
//第一中
fileOut.write(97);//系统会根据编码表自动转查找成字符 a
//第二种
byte b =97;
fileOut.write(b);//系统会根据编码表自动转查找成字符 a
//第三种
byte [] b1 ={12,123,34};
fileOut.write(b1);//系统会根据编码表自动转查找成字符 a
//第四种 Byte数组 隔断写
byte [] b2 ={12,123,34};
fileOut.write(b2,1,2);//系统会根据编码表自动转查找成字符 a
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
文本换行:
public static void test4(){
try {
FileOutputStream file4 = new FileOutputStream("D:/a.txt");
//开始写数据
/*
* windows : \r\n
* linux:\n
* mac:\r
* 而一些高级文本软件 都可以识别
*/
for(int i=0;i<10;i++){
file4.write(("hello world"+i).getBytes());
file4.write("\r\n".getBytes());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
追加
只要是FileOutputStream 的构造方法里面有 boolean 这个参数的构造方法,写成 true 就可以追加
FileOutputStream file4 = new FileOutputStream("D:/a.txt",true);//加入一个true 这个文件可以追加
public static void test4(){
FileOutputStream file4=null;
try {
file4 = new FileOutputStream("D:/a.txt",false);
//开始写数据
/*
* windows : \r\n
* linux:\n
* mac:\r
* 而一些高级文本软件 都可以识别
*/
for(int i=0;i<10;i++){
file4.write(("hello world"+i).getBytes());
file4.write("\r\n".getBytes());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//如果file4不为空再进行close();
if(file4!=null){
try {
file4.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
读取英文或者符号没有问题的代码(中文不行)
public static void test5(){
try {
FileInputStream fileInt = new FileInputStream("D:/a.txt");
int x=0;
while((x=fileInt.read())!=-1){
System.out.print((char)x);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
字节流读取汉字:
计算机是如何识别该把两个字节转换为一个中文的?
在计算机中中文的存储分为两个字节:
--第一个绝对是负数。
--第二个常见的是负数,可能有正数,但是没影响的。
简单的复制文件(可复制 图片 视频):
//复制文件
public static void test6() throws IOException{
FileInputStream fileInt=null;
FileOutputStream fileOout=null;
try {
//创建流指向对象
fileInt = new FileInputStream("D:/a.txt");
//创建流指向要存储的文件
fileOout = new FileOutputStream("D:/b.txt");
int index =0;
while((index=fileInt.read())!=-1){
fileOout.write(index);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
fileInt.close();
fileOout.close();
}
}
上面方法读取效率比较低:
--用第二种方法: read(Byte [] b) //一定要注意 这个读取必须要有终点
fileInt = new FileInputStream("D:/a.txt");
byte[] b = new byte[1024]; //一次读多少由这个决定
int index =0;
while((index=fileInt.read(b))!=-1){
System.out.println(new String(b,0,index));//读了多少个就转换多少出来
}