Java中使用IO(输入输出)来读取和写入,读写设备上的数据、硬盘文件、内存键盘。根据数据的走向分为输入流和输出流,这个走向以内存为基准,往内存中读取为输入流,从内存中读出为输出流。
Java IO可以分为两类,字节流操作类(inputstream/outputstream)和字符流操作类(reader/writer)
字节流以8位作为一个数据单元(1byte,8bit)
字符流以16位作为一个数据单元(2byte,16bit)
1.字节流可以处理所有数据类型的数据,在java中以Stream结尾。
2.字符流处理文本数据,在java中以Reader和Writer结尾,由于一个汉字占两个字节,所以产生了字符流
常用流类:
以上四个基类提供的部分通用的读和写方法如下:
int read()-返回的是单个字节数据(字节数据可以直接专程int类型)
int read(byte[] buf)-返回的是读取到的字节数,真正的数据保存在buf中
void write(int c)- c既可以是政府,也可以是字节
void write(byte[] buf 或者 char[] buf)
void write(String str) - Writer专用
基于字节流的操作
基于字符流的操作
基于字符流的操作代码转自:https://www.cnblogs.com/dreamyu/p/6551137.html
1.对文件的操作(创建文件,查看文件)
//创建一个文件路径
File file = newFile("D:\\testData.txt");
if(file.exists()){
//得到文件路径
System.out.println(file.getAbsolutePath());
//得到文件大小
System.out.println("文件大小:"+file.length());
}
//创建文件和创建文件夹
File file1 = newFile("d:\\iotest.txt");
if(!file1.exists())
{
try{
file1.createNewFile();
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("文件已存在");
}
//创建文件夹
File file2 = newFile("d:\\testIO");
if(file2.isDirectory())
{
System.out.println("文件夹存在");
}else{
file2.mkdir();
}
//列出一个文件夹下的所有文件
File f = newFile("d:\\testIO");
if(f.isDirectory())
{
File lists[] = f.listFiles();
for(inti=0;i<lists.length;i++)
{
System.out.println(lists[i].getName());
}
}
常用字节流FileInputStream和FileOutputStream
FileInputStream:(从文件中读取内容到控制台与Reader对应)
FileInputStream fis = null;
try{
fis = newFileInputStream("D:\\testData.txt");
bytebytes[]=newbyte[1024];
intn=0;
while((n=fis.read(bytes))!= -1){
String str = newString(bytes,0,n);
System.out.print(str);
}
} catch(Exception e) {
e.printStackTrace();
} finally{
try{
fis.close();
} catch(IOException e) {
e.printStackTrace();
}
}
FileOutputStream:(向文件写内容相当于Writer)
FileOutputStream fos = null;
try{
fos = newFileOutputStream("D:\\testData.txt");
//倘若是续写文件加一个true参数 fos = newFileOutputStream("D:\\testData.txt",ture);
String str = "报效国家,舍生忘死";
bytebytes[] = str.getBytes();
fos.write(bytes);
} catch(Exception e) {
e.printStackTrace();
} finally{
try{
fos.close();
} catch(Exception e2) {
e2.printStackTrace();
}
}
字符流FileReader和FileWriter:
//字符流
//文件写出 输入流
FileReader freader = null;
//写入到文件 输出流
FileWriter fwriter = null;
try{
//创建输入对象
freader = newFileReader("d:\\testData.txt");
//创建输出对象
File f1 = newFile("e:\\testData.txt");
if(!f1.exists()){
f1.createNewFile();
}
fwriter = newFileWriter(f1);
//读入到内存
charchars[] = newchar[1024];
intn=0;
while((n=freader.read(chars))!= -1)
{
fwriter.write(chars);
//System.out.println(chars);
}
} catch(Exception e) {
e.printStackTrace();
// TODO: handle exception
}finally{
try{
freader.close();
fwriter.close();
}catch(Exception e){
e.printStackTrace();
}
}
下面介绍一下其他流:
字符串流:StringReader/StringWriter
这两个操作的是专门操作String字符串的流,其中StringReader能从String中方便地读取数据并保存到char数组,而StringWriter则将字符串类型的数据写入到StringBuffer中(因为String不可写)。
转换流:InputStreamReader/OutputStreamReader
这两个类可以将字节流转换成字符流,被称为字节流与字符流之间的桥梁。我们经常在读取键盘输入(System.in)或网络通信的时候,需要使用这两个类
缓冲流:
BufferedReader/BufferedWriter BufferedInputStream/BufferedOutputStream
没有经过Buffer(缓冲区)处理的IO,每一次读写窦卉由OS底层直接处理,导致效率低下。
经过Buffered处理过的输入流将会从一个buffer内存区域读取数据,本地API只在buffer空了后才会被调用。
经过Buffered处理过的输出流将会把书库写入到buffer中,本地API只会在buffer满了后才会被调用。
BufferedReader/BufferedWriter可以将字符流(Reader)包装成缓冲流,这是最常见用的做法。
BufferedReader提供一个readLine()可以方便地读取一行,而FileInputStream和FileReader只能读取一个字节或者一个字符。
//缓冲字符流 BufferedReader BufferedWriter
BufferedReader bfreader = null;
try{
FileReader freader = newFileReader("d:\\testData.txt");
bfreader = newBufferedReader(freader);//将字符流包装成缓冲流
//循环读取
String s ="";
while((s=bfreader.readLine())!= null)
{
System.out.println(s);
}
} catch(Exception e) {
// TODO: handle exception
}
部分转自:https://www.cnblogs.com/fysola/p/6123947.html
网友评论