Java中流的概念细分
• 按流的方向分类:
1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。
2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。
• 按处理的数据单元分类:
1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。
2. 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。
• 按处理对象不同分类:
1. 节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等。
2. 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。
节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。
文件专属:
java.io.FileInputStream(掌握)
java.io.FileOutputStream(掌握)
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInputStream
java.io.DataOutputStream
标准输出流:
java.io.PrintWriter
java.io.PrintStream(掌握)
对象专属流:
java.io.ObjectInputStream(掌握)
java.io.ObjectOutputStream(掌握)
File文件类
java.io.File
简单写的读取文本
public class TestIo {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("d:/a.txt");
int s = 0;
while ((s=fileInputStream.read())!=-1){
if (s >= 128) {
// 第一位不是0代表多字节
int byteCnt = Integer.toBinaryString(s).indexOf("0");
System.out.println("byteCnt"+byteCnt);
byte[] bytes = new byte[byteCnt];
System.out.println("bytes"+bytes);
bytes[0] = (byte) s;
for (int i = 1; i < byteCnt; i++) {
bytes[i] = (byte) fileInputStream.read();
}
System.out.print(new String(bytes));
} else {
System.out.print((char) s);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
io实现简单的交流
服务器端
public class ChatServer {
public static void main(String[] args) {
//需要一个地址端口号
ServerSocket serverSocket = null;
Socket accept=null;
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream=null;
try {
//设置自己的端口
serverSocket = new ServerSocket(9999);
//等待客户连接过来
//侦听socket连接 返回值为socket 这个就是连接过来的socket
accept = serverSocket.accept();
//读取客户端的消息
inputStream = accept.getInputStream();
//管道流 获取
byteArrayOutputStream = new ByteArrayOutputStream();
byte [] buffer = new byte[1024];
int len;
while((len=inputStream.read(buffer))!=-1){
byteArrayOutputStream.write(buffer,0,len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (byteArrayOutputStream!=null){
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (accept!=null){
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
发送消息端
public class ChatUser {
public static void main(String[] args) {
//需要知道要连接的地址和端口
InetAddress inetAddress = null;
Socket socket=null;
try {
//设置接收方的ip
inetAddress=InetAddress.getByName("127.0.0.1");
//设置接收方的断口号
int port = 9999;
//通过端口号和ip创建连接
socket = new Socket(inetAddress,port);
//创建字节流 我理解为建立流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("这里是李佳琪".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
网上爬取文件
/**
* @author : LeeGaki
* @date : 2022/6/5 21:30
* 面向面试编程 --> 李佳琪
*/
public class DownFile {
public static void main(String[] args) throws Exception {
//给到一个地址
URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242306111155-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1657028356&t=700bfd56a5a605b4a7d654331dbe7176");
//开启连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//开启输入流
InputStream inputStream = urlConnection.getInputStream();
//处理流包装
FileOutputStream file = new FileOutputStream("a.jpg");
//给到开辟空间
byte [] bytes = new byte[1024];
int len;
//循环读出来
while((len=inputStream.read(bytes))!=-1){
file.write(bytes,0,len);
}
file.close();
inputStream.close();
urlConnection.disconnect();
}
}