IO流的总结
1.前言
首先IO流分为字节流和字符流。
要搞清楚以下要点:
- 如何创建一个文件
- 如何创建一个文件夹
2.File 类
2.1.如何创建创建一个文件对象
File f1 =new File(“绝对路径”);
那么绝对路径相信大家应该都清楚,不清楚的,可以搜索一下。
例如:
File f1 = new File("E:\\itcast\\java.text");
这样我们就创建了一个File 对象
但是,并不能生成文件,还需要以下操作
2.2.如何创建一个文件,一个文件夹,文件夹中还有文件夹
1、创建一个文件
接着上面的File对象
File f1 = new File("E:\\itcast\\java.text");
f1.createNewFile();//不出意外,你可以在“E:\\itcast”这个路径下,找到java.text这样一个文件
2、创建一个文件夹
File f2 = new File("E:\\itcast\\java");
f2.mkdir();//不出意外,你可以在“E:\\itcast”这个路径下,找到java这样一个文件夹
//注意:即使写成这样File f2 = new File("E:\\itcast\\java.txt"); mkdir()创建的仍然是一个文件夹而不是txt文件
3、创建多级目录
File f3 = new File("D:\\itcast\\JavaWEB\\HTML");
f3.mkdirs();//不多赘述你懂的
3.字节流
那么我就简单的写一下
3.1.输出流
那么何为输出流?
那就是,可以在文件中写东西。
那么三步走,走起来:
- 首先创建一个文件
- 然后再文件里写东西
- 然后释放资源
上代码!
FileOutputStream fos =new FileOutputStream("D:\\itcast\\sb.txt");
/*这一句话很强大,做三件事
但我认为最重要的一个件事就是,创建了文件。*/
fos.write(97);//写文件,这里的97代表着ASCII码,也就是字母“a”
fos.close();//关闭文件,释放资源,完美结束。
3.2 写数据的三种方式
write( );
这个括号里面可以放三种数据:
1、上代码
fos.write(97);//跟之前的一样,不多赘述
2、上代码
byte [] bys = {97,98,99,100};
fos.write(bys);//显而易见,文件中会显示,abcd
3、上代码!
byte [] bys = {97,98,99,100};
fos.write(bys,1,3)//1,3代表什么呢?就是数组下标,从bys第1个元素开始写一直到第3个元素,那么输出为bcd
那么问题来了,我还能抱着ASCII码,来写数据么?
3.3 获取字符串的ASCII码
上代码!
byte[]bys1 = "abcd".getBytes();
fos.write(bys1);//通俗易懂的操作,你应该懂我
3.4 那么写数据如何换行?
很简单看我的操作
fos.write("abcd".getBytes());
fos.write("\n".getBytes());
fos.write("abcd".getBytes());//这不就换行了
3.5. 那么一个文件写完,下次再想写,怎么接着往后写?
FileOutputStream f1 =new FileOutputStream("D:\\itcast\\sb.txt",true);
//加一个true完美解决,再写文件就可以接着上次的写了,
//如果不加true ,会从头开始写,会覆盖掉上次写的。
3.6 输出流(一次读取一个字符,一次读很多个字符)
那么直接上代码吧!
1、一次读一个字符
FileInputStream fis =new FileInputStream("D:\\itcast\\fos2.txt");
//这句话就是简单的创建一个输出流对象,如果文件不存在还会报错
int by = fis.read();
System.out.println((char)by);//可以看出read()返回的是字符的ACII码;
//那么将整个文件读取下来,如何做?
int by;
while((by = fis.read())!=-1) {
System.out.print((char)by);
}
fis.close();//不要忘记关闭资源
2、一次读很多个字符
byte[ ] bys = new byte[1024];//存储1024个字节的编码
int len;//读取的字节长度
//也就是说,读取的字节码存储在了bys中,而不是len,len仅仅是字节码的长度,也就是bys中元素的个数
while((len=fis.read(bys))!=-1) {
System.out.println(new String(bys,0,len));//转换一下输出出去
}
3.7 字节缓冲流
由名字可以看出,就是用来缓冲的,其实并没有这么简单。
但是我们只需要会用即可,想要了解其中的原理,看其他的文章
2.7.1 输出流
上代码!
BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream("D:\\itcast\\fos.txt"));//很通俗易懂。
//把这个“字节输出流” 传进 “字节缓冲输出流”后,其他操作跟字节输出流一样
//那我们就假装写点东西进去
bos.write("hello\n".getBytes());
bos.close();//操作一毛一样
2.7.2 输入流
直接上代码!
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\itcast\\fos.txt"));
//一次读一个字节数据
int by;
while((by = bis.read())!=-1) {
System.out.print((char)by);
}
//一次读好多个字节数据
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
bis.close();//完美,很简单,没有任何区别
4.字符流
4.1 字符流输出的5种方式
我们要用到的函数
write( ) flush( ) close( )
我们看到了一个新函数flush( ),其实这个是刷新流,就是用来刷新的,后面再说
那么上代码!
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\itcast\\wo1.txt"));//跟缓冲流一个道理,就是把这字节输出流传进去,然后操作都一样
//第一种输出
osw.write(97);
osw.flush();//哎!我们就用到这个刷新流了,不刷新这个字符就不显示在文件里,刷新后就显示了
//第二种输出
char [] chs ={'a','b','c'};
osw.write(chs);//通俗易懂
//第三种输出
osw.write(chs,0,2);//0和2代表着chs的数组下标
//第四种输出
osw.write("abcdef");
//第五种输出
osw.write("abcdef",0,3);//这个0和3不用我解释了吧
//最后!!!!!!很重要!!!!!!!!!刷新一下,一定要刷新
osw.close();//这个函数又可以刷新又可以关闭文件,非常棒!完美!
4.2 字符流读数据的2种方式
上代码!
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\itcast\\wo1.txt"));
//一次读一个字符数据
int ch;
while((ch = isr.read())!=-1) {
System.out .print((char)ch);
}
//一次读很多个字符数据
char[] chs = new char[1024];
int len;
while((len = isr.read(chs))!=-1) {
System.out.print(new String(chs, 0,len));
}
//一毛一样的操作,不再赘述
isr.close();
4.3 字符缓冲流的读数据,写数据
1、写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\itcast\\fos.txt")));
//是不是感觉非常的麻烦这样写
//那么就简化一下
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\fos.txt"));
//其实FileWriter就是OuterputStreamWriter的子类
//写起数据来!!
bw.write("hello\n");
bw.write("hahahha");
bw.close();
2、读数据
BufferedReader br = new BufferedReader(new FileReader("D:\\itcast\\fos.txt"));
//正常操作
//一次读一个字符数据
int ch;
while((ch = br.read())!=-1) {
System.out .print((char)ch);
}
//一次读很多个字符数据
char[] chs = new char[1024];
int len;
while((len = br.read(chs))!=-1) {
System.out.print(new String(chs, 0,len));
}
//一毛一样的操作,不再赘述
isr.close();
4.4.字符缓冲流特有功能
1、写数据的换行操作newLine( )
上代码!
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\fos.txt"));
for(int i = 0;i<10;i++) {
bw.write("hello"+i);
//bw.write("\n");
bw.newLine();//这个操作跟bw.write("\n");这个操作一样
bw.flush();
}
2、读数据,一次读一行操作readLine( )
BufferedReader br = new BufferedReader (new FileReader("D:\\itcast\\fos.txt"));
String line;
while((line = br.readLine())!=null) {
System.out.println(line);
}
br.close();