Java-IO流
一、IO流概述
I 就是input的首字母:输入。
把硬盘中的数据,读取到内存使用。
o就是output的首字母:输出。
把内存中的数据,写入到硬盘中保存。
内存的概念:临时储存数据
这里主要记住内存是中心,进内存就是输入,出内存就是输出。
二、流们!(不要加氓)
字节流 | 字符流 | |
---|---|---|
输入流 | 字节输入流 InputStream | 字符输入流 Reader |
输出流 | 字节输出流 OutputStream | 字符输出流 Writer |
节点流 | 处理流 |
---|---|
流的一端是程序,另一端是节点 | 以其他已经存在的流作为一个端点的流 |
构造方法的参数是节点 | 构造方法总有一个其他流对象作为参数 |
前提知识
字节:计算机中一切皆字节(视频,图片和文本),本质就是二进制码。
字符:是指计算机中使用的文字和符号,比如1、2、A、B、~!*#¥%等等。
字节流
1.字节输入流
先在D盘下创建一个hello.txt
里面内容写上hello baby
步骤:
1> 定义一个文件流
2>定义一个字节数组
3>将输入流的数据读入到字节数组中
4>通过UTF-8编码表将字节转换为字符
代码实践:
public class InputStream {
public static void main(String[] args) throws IOException{
File file=new File("D://hello.txt");//显示具体路径
FileInputStream fs =new FileInputStream(file);//定义一个文件流
byte[] b=new byte[1024];//定义一个字节数组
fs.read(b);//将输入流的数据读入到字节数组中
String str=new String(b,"UTF-8");//通过UTF-8编码表将字节转换为字符
System.out.println(str); //输出到控制台
}
}
温馨提示:需要导包,Eclipse会提示,左键点击左边的那个丑陋的小灯泡,按下回车键就哦了
注意:如果在那个txt文件里,输入的是中文:我好帅。控制台显示的是???
不是它质疑你的帅气,而是不支持中文,编码过不去。
2.字节输出流
步骤:
1> 创建一个输出流
2>将字符转换成字节
3>字节写出文件
4>保存文件
代码实践:
public class OutputStream {
public static void main(String[] args) throws IOException {
String file="D://test.txt";
FileOutputStream out=new FileOutputStream(file);//创建输出流
String str="hello baby";
byte[] b=str.getBytes();//字符转换为字节
out.write(b);//字节写出到文件
out.flush();//保存文件
温馨提示:需要导包,Eclipse会提示,左键点击左边的那个丑陋的小灯泡,按下回车键就哦了
这段代码执行后,你会发现D盘创建一个test.txt文件,里面写着hello baby
字符流
字符流和字节流步骤相似,不再累述!
1.字符输入流
先在D盘下创建一个hello.txt
里面内容写上hello baby
代码实践:
public class Reader {
public static void main(String[] args)throws IOException
String file="D://hello.txt";//显示具体路径
FileReader fr =new FileReader(file);//定义一个文件流
byte[] b=new byte[1024];//定义一个字节数组
fr.read(b);//将输入流中的数据读入到字节数组中
System.out.println("b")//输出到控制台
fr.close();//关闭输入流
当你执行完这段代码后发现,输出hello baby的同时,还有1014个空格
为了解决打印多余空格问题,查阅API帮助文档,reader方法是将字符流中的数据读入到字符数组中,如果读取到文件末尾则返回-1,否则返回读取到的长度,所以只要遇到-1就终止好了。
String file = "D://hello.txt";
FileReader fr = new FileReader(file);//定义一个文件流
char[] cbuf = new char[1024];//定义一个字节数组
int len = 0; // 每次读取的长度
StringBuilder builder = new StringBuilder();
while ((len = fr.read(cbuf)) != -1) {
//将数据读入到cbuf中并返回读取到的数据长度,不等于-1就继续
builder.append(cbuf,0,len);}
//将cbuf 0 到len长度的数据添加到builder
System.out.println(builder.toString());//输出到控制台
2.字符输出流
代码实践:
public class Writer {
public static void main(String[] args)throws IOException
File file=new File("D://hello.txt");
FileWriter fw=new FileWriter(file);//定义一个文件流
fw.write("hello baby");//写出到文件
fw.close();//关闭流
这段代码执行后,你会发现D盘创建一个test.txt文件,里面写着hello baby