一、字符与字节
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。字符是电子计算机或无线电通信中字母、数字、符号的统称,其是数据结构中最小的数据存取单位,通常由8个二进制位(一个字节)来表示一个字符。 [1] 字符是计算机中经常用到的二进制编码形式,也是计算机中最常用到的信息形式。
---百度百科
字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。
---百度百科
不同的编码字符与字节的数量对应不同(这里指的是英文字符之外的文字,比如汉字),例如GB2312编码或者GBK编码中一个汉字符需要2个字节,而UTF-8编码中需要3-4个字节
import java.io.UnsupportedEncodingException;
public class CharBig {
public static void main(String[] args) {
String eString="测试";
byte[] bytes = null;
try {
bytes = eString.getBytes("UTf-8");//使用UTF-8进行解码
System.out.println("字节的长度"+bytes.length);
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
bytes=eString.getBytes("GBK");//使用GBK进行解码
System.out.println("字节的长度"+bytes.length);
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
实现结果:
二、IO流
IO流分为字节流和字符流,输入流和输出流是相对于程序而言的,就好比你的电脑上被插上了一根水管,那么输入流相当于水管子里面流出水,输出流相当于你的电脑往水管子里流水(有点不恰当哈)
四大步 1、 File file =new File(文件路径) ---接一头
2 InpuStream inputStream=new FileInputStream(file);---接好另一头
3 read(数组)--放水
4 close()----拔管子
目录
一、字节流(通常后面带着Stream)
一、InputStream
InputStream为抽象的基类,
read(byte[] b):从流中读取b的长度字节的数据存储到b中,返回的结果为实际读取的字节的个数,如果返回的为-1,那么代表到了结尾。
read(byte[] b,int off,int len): 在off位置开始,从流中读取长度为Len个字节的数据存储到b中,返回的结果为实际读取到的字节的个数,如果返回-1,那么代表到了结尾。
close():代表了关闭流资源(就是把水管拔掉)
skip(n):跳过和丢弃n个字节(不会回头的)
一、FileInputStream
一看名字就是知道主要使用了操作文件的,它实现了基类InputStream中的
read()函数:从流中读取一个字节,返回的结果为int,如果编码是一个一个字节的,可以尝试的强转为char来查看。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class CharBig {
public static void main(String[] args) throws IOException {
InputStream inputStream=new FileInputStream(new File("e:/test.txt"));
int data;
//一个一个字符读
while( (data=inputStream.read())!=-1)
{
System.out.print((char)data);
}
System.out.println();
inputStream.close();//关闭资源流 ,拔掉水管
byte[] b=new byte[5];
inputStream=new FileInputStream(new File("e:/test.txt"));
int len;
//读取数据到byte数组中
while((len=inputStream.read(b))!=-1)
{
System.out.println(new String(b,0,len));
}
inputStream.close();//关闭资源流 ,拔掉水管
}
}
实现结果:
二、BufferedInputStream
BufferedInputStream相当于先将流中的数据缓冲到内存中,然后再取数据,这样的比从硬盘中取数据效率要高出许多(Buffered 是缓冲的意思),那么它需要一个流一般是FileInputStream流。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class CharBig {
public static void main(String[] args) throws IOException {
InputStream inputStream=new BufferedInputStream(new FileInputStream("e:/test.txt"));
byte[] b=new byte[10];
int len=0;
while((len=inputStream.read(b))!=-1)
{
System.out.println(new String(b,0,len) );
}
inputStream.close();
}
}
二、OutputStream
OutputStream是将字节流写到文件中去的父类,它定义的函数有
write(byte[] b):将b的长度个字节数据写到输出流中。
write(byte[] b,int off,int len):从b的off位置开始,获取len个字节数据,写到输出流中
flush():刷新输出流,把数据马上写到输出流中
close():关闭流,释放系统资源
一、FileOutputStream
实现了write(int b)将b转化为一个字节数据写到文件中去
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class CharBig {
public static void main(String[] args) throws IOException {
File file=new File("e:/test.txt");
OutputStream outputStream=new FileOutputStream(file);
//这里表示不追加写,直接覆盖,如果想要在原来的文件上追加数据的话,那么就再加个true
String cString="hello world";
outputStream.write(cString.getBytes());
outputStream.close();
}
}
二、BufferedOutputStream
同样的将数据存储到内存中,然后流出
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class CharBig {
public static void main(String[] args) throws IOException {
File file=new File("e:/test.txt");
OutputStream outputStream=new FileOutputStream(file,true);
BufferedOutputStream bufferedInputStream=new BufferedOutputStream(outputStream);
String cString="hello world";
bufferedInputStream.write(cString.getBytes());
//这里表示不追加写,直接覆盖,如果想要在原来的文件上追加数据的话,那么就write(cString.getBytes(),true);
bufferedInputStream.close();
outputStream.close();
}
}
二、字符流(通常后面带着Reader或者writer)
一、Reader
Reader是字符类输入流的抽象类,它定义了如下函数(主要)
reader():读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1
read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
close() :关闭流,释放占用的系统资源。
一、InputStreamReader
可以将InputStream按照其编码方式的字节流转化为字符流,此外它还实现reader(char[] c int offset, int length):
从offset开始,读取length个字符到数组c中
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(new File(pathname))));
//字节流转化为字符流,使用了 InputStreamReader作为中间的桥梁,一边是BufferedReader(字符) 另一边是FileInputStream(字节流)
//同样的可以设置编码格式
二、FileReader
可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流
三、BufferedReader
reader(char [] c int offset, int length): 从offset开始,读取length个字符到数组c中
readLine() :读取文本行,以行结束符作为末尾,返回的是字符串,如果已经到达流的末尾,则返回null
import java.awt.TexturePaint;
import java.awt.event.MouseWheelEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
public class CharBig {
public static void main(String[] args) throws IOException {
// classLoader=this.getClass().getClassLoader();
// filepath=classLoader.getResource("").getPath();
//可以使用相对路径
InputStreamReader inputStreamReader=new InputStreamReader(new FileInputStream("e:/test.txt"));
int ch;
while((ch=inputStreamReader.read())!=-1)
{
System.out.print((char)ch);//汉字也可以哦,因为它是按照一个一个字符读取的,也就是一个字一个字读取的
}
inputStreamReader.close();
//向文件中追加内容
FileOutputStream fileOutputStream=new FileOutputStream(new File("e:/test.txt"));
String cString="张弟弟";
byte []b=cString.getBytes();
fileOutputStream.write(b);
fileOutputStream.close();
//使用BuffereReader
BufferedReader bufferedReader=new BufferedReader(new FileReader(new File("e:/test.txt"))) ;
String data=new String();
while((data=bufferedReader.readLine())!=null)
{System.err.println(data);
data="";
}
bufferedReader.close();
}
}
从键盘输入流中读取数据
//获取键盘输入流
BufferedReader bufferedReader2=new BufferedReader(new InputStreamReader(System.in));
//获取键盘输入流 推荐使用它
Scanner sc = new Scanner(System.in);
int c=sc.nextInt();
String b1=sc.next();
二、Writer()
同样是抽象类,字符流,主要定义了如下方法
write(char [] c):往输出流中写入一个字符数组
write(int c):往输出流中写入一个数字
write(String c):往输出流中写入一个字符串
write(String c,int off,int len):往输出流中写入字符串的一部分,起始处为off,长度为len
close():关闭流
flush():立马写入流中,甭管长度够不够
一、OutputStreamWriter
OutputStreamWriter流的作用就是利用字节流作为底层输出流然后构建字符输出流,字符输出流输出字符到流中,然后通过指定的字符集把流中的字符编码成字节输出到字节流中,其作用就是一个桥梁,使得双方链接起来。
(将字节转化为字符,将字符转化为字节)
OutputStreamWriter需要一个输入流对象作为实例化参数 ,一般选用FileOutPutStream
二、FileWriter
此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter (我哭了) ----百度百科
三、BufferedWriter
bufferedWriter需要一个输入流对象作为实例化参数,一般选用FileWriter
newLine() :写入一个换行符
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class CharBig {
public static void main(String[] args) throws IOException {
File file=new File("E:/test.txt");
OutputStreamWriter outputStream=new OutputStreamWriter(new FileOutputStream(file));
outputStream.write("hello world");
outputStream.flush();
outputStream.close();
FileWriter fileWriter=new FileWriter(file,true);
BufferedWriter fBufferedWriter=new BufferedWriter(fileWriter);
fBufferedWriter.write("张弟弟");
fBufferedWriter.flush();
fBufferedWriter.close();
fileWriter.close();
//读取数据
BufferedReader fileReader=new BufferedReader(new FileReader(file));
char[] b=new char[10];
int leng;
while((leng=fileReader.read(b))!=-1)
{
System.out.println(new String(b,0,leng));
}
}
}
(先写这么多,眼都扛不住了)