package IO流;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* @author 缘友一世
* date 2022/10/21-16:23
*/
public class ConvertStream {
public static void main(String[] args) {
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
try {
bufferedReader=new BufferedReader(new InputStreamReader(System.in));
bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
while (true) {
bufferedWriter.write("请输入:");
bufferedWriter.flush();
String input= bufferedReader.readLine();
if("exit".equals(input)) {
break;
}
bufferedWriter.write("你输入的是:"+input);
bufferedWriter.newLine();
bufferedWriter.flush();
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(bufferedReader!=null) {
bufferedReader.close();
}
if(bufferedWriter!=null) {
bufferedWriter.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

package IO流;
import java.io.*;
/**
* @author 缘友一世
* date 2022/10/21-17:13
*/
public class LineNumberDemo2 {
public static void main(String[] args) {
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
try {
bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("basic grammar/src/IO流/write.txt")));
//bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("basic grammar/src/IO流/")));
//BufferedReader:将字符流放到字符流缓冲区
//InputStreamReader:将字节流转化为字符流
//FileInputStream:字节流
bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("basic grammar/src/IO流/write.txt",true)));
String temp="";
int i=1;
while((temp=bufferedReader.readLine())!=null) {
bufferedWriter.write(i+":"+temp);
bufferedWriter.newLine();
i++;
}
bufferedWriter.flush();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(bufferedReader!=null) {
bufferedReader.close();
}
if(bufferedWriter!=null) {
bufferedWriter.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

package IO流;
import java.io.*;
/**
* @author 缘友一世
* date 2022/10/21-17:53
*/
//PrintWriter的使用
public class LineNumberDemo3 {
public static void main(String[] args) {
BufferedReader bufferedReader=null;
PrintWriter printWriter=null;//自带换行和刷新
try {
bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("basic grammar/src/IO流/write.txt")));
printWriter=new PrintWriter("basic grammar/src/IO流/write2.txt");
String temp="";
int lineNumber=1;
while ((temp=bufferedReader.readLine())!=null) {
printWriter.println(lineNumber+":"+temp);
lineNumber++;
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(bufferedReader!=null) {
bufferedReader.close();
}
if(printWriter!=null) {
printWriter.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

- java中的IO流k的组合是非常灵活的,输入时只考虑输入的处理过程,输出时只考虑输出的处理过程。
- 如上面的例子,输入时,采用字符流的方式处理,将文件的内容读到缓存里;输出时,采用字节流输出。
| String提供了如下方法 | 返回值 | 说明 |
|---|---|---|
| getBytes( ) | byte[ ] | 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
| getBytes(String charsetName) | byte[ ] | 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
package IO流;
import java.io.ByteArrayInputStream;
/**
* @author 缘友一世
* date 2022/10/21-21:39
*/
public class ByteArrayInputDemo {
public static void main(String[] args) {
//A ByteArrayInputStream包含一个内部缓冲区,其中包含可以从流中读取的字节。 内部计数器跟踪read方法要提供的下一个字节。
// 关闭ByteArrayInputStream没有任何效果。 在关闭流之后,可以调用此类中的方法,而不生成IOException。
ByteArrayInputStream bis=null;
byte[] arr="abcdef".getBytes();
StringBuilder sb=new StringBuilder();
try {
//该构造方法中的参数是一个字节数组,该字节数组就是数据源
bis=new ByteArrayInputStream(arr);
int temp;
//从该输入流读取下一个数据字节。
while ((temp=bis.read())!=-1) {
sb.append((char)temp);
}
System.out.println(sb);//返回表示此顺序中的数据的字符串。
}finally {
try {
if(bis != null) {
bis.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

package IO流;
import java.io.ByteArrayOutputStream;
/**
* @author 缘友一世
* date 2022/10/21-21:56
*/
public class ByteArrayOutputDemo {
public static void main(String[] args) {
ByteArrayOutputStream bos=null;
try {
//StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的
StringBuilder sb=new StringBuilder();
bos=new ByteArrayOutputStream();
bos.write('q');
bos.write('p');
bos.write('m');
bos.write('n');
byte[] arr=bos.toByteArray();
for (byte b : arr) {
sb.append((char)b);
}
System.out.println(sb);
}finally {
try {
if(bos!=null) {
bos.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}

package IO流;
import java.io.*;
/**
* @author 缘友一世
* date 2022/10/21-22:32
*/
public class DataOutputDemo {
public static void main(String[] args) throws IOException {
//数据流是一个处理流,但是最后还是要使用节点流对数据进行读写
//BufferedOutputStream字节的缓冲流对象
DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("basic grammar/src/IO流/data.txt")));
dos.writeChar('a');
dos.writeDouble(Math.random());
dos.writeUTF("hello world");
dos.flush();
dos.close();
//为什么看到的都是乱码呢?
//因为我们是基于字节流向文本文件输出的,
// 由于文件本身是文本文件,以不同的编码格式方式打开,看到的就是乱码
}
}

以字节的方式写入不同类型的数据,然后编码和解码,就会出现乱码
更深入详细的内容参看大佬的博客:【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
package IO流;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
/**
* @author 缘友一世
* date 2022/10/21-23:07
*/
public class DataInputDemo {
public static void main(String[] args) {
DataInputStream dis=null;
try {
dis= new DataInputStream(new BufferedInputStream(new FileInputStream("basic grammar/src/IO流/data.txt")));
//直接读取数据,注意:读取的顺序与写入的顺序一直,否则不饿能正确读取数据
System.out.println(dis.readChar());
System.out.println(dis.readDouble());
System.out.println(dis.readUTF());
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(dis!=null) {
dis.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
