IO编程
只是学习笔记,如果有错误,请在评论区指出,谢谢
一、字节流与字符流
1、File类只能够操作文件本身而不能操作文件内容
2、IO操作的核心意义在于:输入与输出操作 实际上就是一种数据流的处理形式,数据流就是字节数据
3、字节流的处理形式在java.io包里面提供有两类支持
- 字节处理流:OutputStream(输出字节流)、InputStream(输入字节流)
- 字符处理流:Writer(输出字符流)、Reader(输入字符流)
二、流操作的统一步骤
-
如果要进行的是文件的读写操作,一定要通过File类找到一个文件路径
-
通过字节流或字符流的子类为父类对象实例化
-
利用字节流或字符流中的方法实现数据的输入与输出操作
-
流的操作属于资源操作,资源操作必须进行关闭处理
三、OutputStream字节输出流
- 字节的数据是以byte类型为主实现的操作,在进行字节内容输出的时候可以使用OutputStream类完成
- OutputStream类属于一个抽象类,应该依靠他的子类来实例化对象,如果要从文件读取一定使用FileOutputStream
public abstract class OutputStream exends Object implments Closeable,Flushable
package com.yyr.OutInputText;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
//输入信息到文件里
public class OutputText {
public static void main(String[] args) throws Exception{
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
if (!file.getParentFile().exists()) {//文件不存在
file.getParentFile().mkdirs();//创建父目录
}
OutputStream output=new FileOutputStream(file);//通过子类实例化
String str="欢迎光临";
output.write(str.getBytes());//字节码输入
output.close();//关闭资源
}
}
package com.yyr.OutInputText;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
//输入信息到文件里
public class OutputText {
public static void main(String[] args) throws Exception{
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
if (!file.getParentFile().exists()) {//文件不存在
file.getParentFile().mkdirs();//创建父目录
}
OutputStream output=new FileOutputStream(file);//通过子类实例化
String str="欢迎光临";
output.write(str.getBytes());
output.close();
}
}
package com.yyr.OutInputText;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
//输入信息到文件里
public class OutputText {
public static void main(String[] args) throws Exception{
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
if (!file.getParentFile().exists()) {//文件不存在
file.getParentFile().mkdirs();//创建父目录
}
OutputStream output=new FileOutputStream(file,true);//通过子类实例化,可以追加更多数据
String str="欢迎光临\r\n";//换行
output.write(str.getBytes());//字节码输入
output.close();//关闭资源
}
}
三、OutputStream字节输出流
1.InputStream类属于一个抽象类,应该依靠他的子类来实例化对象,如果要从文件读取一定使用FileInputStream类
范例:读取数据
package com.yyr.InputText;
import java.io.*;
public class InputDemo {
public static void main(String[] args) throws IOException {
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
InputStream input=new FileInputStream(file);
byte data []=new byte[1024];//开辟一个缓冲区读取数据
int len=input.read(data);//读取数据,数据保存在字节数组中
System.out.println("["+new String(data,0,len)+"]");
input.close();
}
}
输出
[欢迎光临欢迎光临欢迎光临欢迎光临
欢迎光临
]
四、Writer字符输出流
package com.yyr.OutInputText;
import java.io.*;
public class WriterText {
public static void main(String[] args) throws IOException {
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
if (!file.getParentFile().exists()) {//文件不存在
file.getParentFile().mkdirs();//创建父目录
}
Writer out=new FileWriter(file,true);//不覆盖加true
String str="美丽的小姐们\r\n";//换行
out.write(str);
out.close();
}
}
字符处理的优势在于中文的处理
五、Reader字符输出流
1.Reader是实现字符输入流的一种类型,其本身属于一个抽象类.
package com.yyr.InputText;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderText {
public static void main(String[] args) throws IOException {
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
if (!file.getParentFile().exists()) {//文件不存在
file.getParentFile().mkdirs();//文件存在则进行读取
}
Reader re=new FileReader(file);
String str="美丽的小姐们\r\n";//换行
char data []=new char[1024];//开辟一个缓冲区读取数据
int len=read.read(data);//
System.out.println("["+new String(data,0,len)+"]");
re.close();
}
}
输出
[美丽的小姐们
美丽的小姐们
美丽的小姐们
美丽的小姐们
欢迎光临]
六、字节流和字符流的处理
1.在使用OutputStream类输出的时候如果没有使用close方法关闭输出流还可以正常使用,使用Writer的时候没有使用close方法关闭输出流,内容将无法输出,因为Writer使用到了缓冲区.当使用close方法会有强制刷新缓冲区的情况,所以会将内容输出.可以使用flush方法强制刷新缓冲区.
2.字节流在进行处理的时候并不会使用到缓冲区,二字符流会使用到缓冲区.设计到中文信息的输出一般都是使用字符流输出.
七、转换流
转换操作类:
-
InputStreamReader
-
OutputStreamWriter
八、IO操作深入
1、字符编码
2、内存操作流:
-
字节内存操作流:ByteArrayInputStream :ByteArrayOutputStream
-
字符内存操作流::ByteArrayWriter :ByteArrayReader
范例:小写字母转大写字母
package com.yyr.IO深入操作;
import java.io.*;
public class ByteArrayTest {
public static void main(String[] args) throws IOException {
String str="www.aliyun.cn";
InputStream input=new ByteArrayInputStream(str.getBytes());//将数据保存在内存流
OutputStream out=new ByteArrayOutputStream();//读取内存中的数据
int data=0;
while((data=input.read())!=-1){//每次读取一个字节
out.write(Character.toUpperCase(data));//保存数据
}
System.out.println(out);
input.close();
out.close();
}
}
输出:
WWW.ALIYUN.CN
3.管道流:实现两个线程之间的IO操作
- 字符管道流:PIpeWriter PipeReader
- 字节管道流:PipeInputStream PIpeOutputStream
package com.yyr.IO深入操作;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;
public class RandomAcessText {
public static void main(String[] args) throws IOException {
File file=new File("c:"+File.separator+"open"+File.separator+"class.txt");//指定要操作的文件的路径
RandomAccessFile raf=new RandomAccessFile(file,"rw");
String names[]=new String[]{"zhangsan","lisi ","wangwu "};
int ages[]=new int[]{30,25,38};
for (int i = 0; i < names.length; i++) {
raf.write(names[i].getBytes());
raf.write(ages[i]);
}
raf.close();
}
}
十一、BufferedReader类
键盘输入的类
package com.yyr.IO深入操作;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferdRederText {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入您的年龄");
String msg=br.readLine();
if(msg.matches("\\d{1,3}")){
int age=Integer.parseInt(msg);
System.out.println("您的年龄为:"+age);
}
else
System.out.println("请不要随意输入,请输入正确的年龄");
}
}
请输入您的年龄
56
您的年龄为:56
十二、Scanner
扫描流,为了解决输入流的访问问题,可以替代BufferedReader类