IO流
IO流分为:
输出流——写出数据
输入流——读取数据
数据类型不同,有:字节流和字符流。
字节流的抽象基类:InputStream、OutputStream
字符流的抽象基类:Reader、Writer
字节输出流OutputStream
如,写出数据到文件,是文件字节输出流FileOutputStream(输出流对象指向文件)。
字节输出流OutputStream操作步骤
1.创建字节流对象
2.写数据
3.释放资源
文件字节输出流FileOutputStream
把一个字符串写到F:\testIOStream\1.txt文件里
是字节输出流,先要把String字符串——>byte[]字节数组
如:将“hello”转换为字节数组:“hello”.getbytes()
code V1:
import java.io.FileOutputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
/*
方式一:
String path="F:\\testIOStream\\1.txt";
//File(String pathname) File的一个构造方法:构造File实例
//封装成一个File
File file= new File(path);
//创建文件输出流
//构造方法FileOutputStream(File file)
FileOutputStream fos= new FileOutputStream(file);
*/
//文件输出流指向了要操作的文件
//构造方法:FileOutputStream(String name)
FileOutputStream fos= new FileOutputStream("F:\\testIOStream\\2.txt");
/**
这一句代码创建字节输出流做了哪些事:
调用系统功能创建文件;
创建流对象;
把流对象指向这个文件。
*/
//要写出的数据
String content="public static void main(String[] args{}); 文件.";
//将字符串转换为字节数组
byte[] b= content.getBytes();
//写出到文件
fos.write(b);
//释放资源
//关闭此文件输出流并释放与此流有关的所有系统资源
fos.close();
/**
* 为什么一定要close()呢:
* 让流对象变成垃圾,可以被垃圾回收器回收;
* 通知系统去释放跟文件相关的资源
*/
}
}
public void write(byte[] b, int off, int len) 只写一部分数据
实现数据的换行
写入换行符号。如,fos.write("\n".getbytes());
注意,不同系统的换行标识符不一样:
windows: \r\n
linux: \n
Mac: \r
一些常见的高级记事本是可以识别任意换行符号的。
实现数据的追加
构造方法FileOutputStream(String name,boolean append)
+ append是true。
构造方法FileOutputStream(File file, boolean append)
append - 如果是 true ,那么字节将被写入文件的末尾,而不是开头 。
把一个字符串写到F:\testIOStream\1.txt文件里,一起做异常处理
public class FileOutputStreamDemo2 {
public static void main(String[] args){
//准备数据
String s= "我要写入数据到这个文件hhh\r\nhello, IO.";
byte[] b= s.getBytes();
FileOutputStream fos= null;
try{
//创建流对象
fos= new FileOutputStream("F:\\javalearnCode\\IOstream\\testIOStream\\1.txt");
//写入到1.txt文件
fos.write(b);
} catch( IOException e){
e.printStackTrace();
} finally{
try {
fos.close();//放到finally里,保证一定执行
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件字节输入流FileInputStream
从文件读数据
1.一次读一个字节
public int read()一次读一个字节。返回值是int类型的ASCii码值哦。 读到文件末尾,返回值为-1,所以可以拿-1做判断读完没。
public int read()一次读一个字节数据 返回值为intASCii码值,,读到文件末尾,返回值为-1,所以可以拿-1做判断
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis= null;
try{
fis= new FileInputStream("F:\\javalearnCode\\IOstream\\testIOStream\\1.txt");
int data=0;
//(data=fis.read())!=-1)读取 赋值 判断 都做了
while((data=fis.read())!=-1){ //public int read()一次读一个字节数据 返回值为int,读到文件末尾,返回值为-1,所以可以拿-1做判断
//注意:读不出中文
System.out.print((char)data);
};
}catch(IOException e){
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.一次读一个字节数组
public int read(byte[] b)
**字节数组b就是一个临时的空间,用来放每次读取的数据的。**第1次读取完数据,第2次读取的会把第一次的覆盖掉…到读完。
要定义一个字节数组,开辟一个空间。
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis= new FileInputStream("F:\\javalearnCode\\IOstream\\FileDemo.java");
//字节数组就是一个临时的空间,用来放每次读取的数据的
//字节数组的长度一般是1024或者1024的整数倍(给的每次可读取的空间的大小)
byte[] bys= new byte[1024];
int len= 0;
while((len=fis.read(bys))!=-1){//fis.read(bys) 读取到的存在了bys字节数组里。返回的是读取到的实际长度
System.out.print(new String(bys, 0, len)); //String的构造方法之用字符数组构造新的String:String(byte[] bytes)和String(byte[] bytes, int offset, int length)
}
fis.close();
}
}