IO流(字符流与字节流)
今日内容介绍
 标准输入流 & 转换流 & 打印流
 对象操作流
 Properties集合
第1章标准输入流 & 转换流 & 打印流
1.1标准输入输出流
public static final InputStream in:标准输入流
public static final PrintStream out:标准输出流

/** 标准输入输出流:public static final InputStream in:字节输入流,用来读取键盘录入的数据public static final int x;InputStream is = System.in;Scanner sc = new Scanner(System.in);public static final PrintStream out:字节输出流,将数据输出到命令行System.out.println();*/
public class SystemInOutDemo {}

1.2转换流
1.2.1OutputStreamWriter:将字节输出流转换为字符输出流
1.2.1.1案例代码一:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;/** 需求:读取项目根目录下的SystemInOutDemo.java,并输出到命令行* * 数据源:项目根目录下的SystemInOutDemo.java  BufferedReader* 目的地:命令行  System.out* * * 由于标准输出流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读取到的数据则是字符串,如果想进行输出还需要转换成字节数组* 我们要想通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可,OutputStreamWriter* * OutputStreamWriter(OutputStream out) :转换流,把字节输出流转换成字符输出流* * */
public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException   {//method2();//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象//OutputStream os = System.out;//Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//BufferedWriter bw = new BufferedWriter(w);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {bw.write(line);bw.newLine();}//释放资源bw.close();br.close();}private static void method2() throws FileNotFoundException, IOException {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象//OutputStream os = System.out;Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {w.write(line);w.write("\r\n");}//释放资源w.close();br.close();}private static void method() throws FileNotFoundException, IOException {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象OutputStream os = System.out;String line;//用于存储读取到的数据while((line = br.readLine()) != null) {os.write(line.getBytes());os.write("\r\n".getBytes());}//释放资源os.close();br.close();}
}

1.2.2InputStreamReader:将字节输入流转换为字符输入流
1.2.2.1案例代码二:

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;/** 需求:读取键盘录入的数据,并输出到项目根目录下的a.txt文件中* * 数据源:读取键盘录入的数据    System.in* 目的地:项目根目录下的a.txt  FileWriter* * * * 转换流:需要把字节输入流转换成字符输入流,InputStreamReader* InputStreamReader(InputStream in) */
public class InputStreamReaderDemo {public static void main(String[] args) throws IOException  {//创建输入流对象InputStream is = System.in;Reader r = new InputStreamReader(is);//创建输出流对象FileWriter fw = new FileWriter("a.txt");//读写数据char[] chs = new char[1024];int len;while((len = r.read(chs)) != -1) {fw.write(chs,0,len);fw.flush();}//释放资源fw.close();is.close();}private static void method() throws IOException {//创建输入流对象InputStream is = System.in;//创建输出流对象FileWriter fw = new FileWriter("a.txt");//读写数据byte[] bys = new byte[1024];int len;//用于存储读取到的字节个数while((len = is.read(bys)) != -1) {fw.write(new String(bys,0,len));fw.flush();}//释放资源fw.close();is.close();}
}

1.3打印流
打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
字符打印流 PrintWriter
void print(String str): 输出任意类型的数据,
void println(String str): 输出任意类型的数据,自动写入换行操作
1.3.1案例代码三:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;/** 打印流:*         PrintStream*        PrintWriter*            可以自动换行,println()*            不能输出字节,但是可以输出其他任意类型*             通过某些配置,可以实现自动刷新(只有在调用 println、printf 或 format才有用)*             也是包装流,不具备写出功能*           可以把字节输出流转换成字符输出流* * 注意:只能输出不能输入* *  */
public class PrintWriterDemo {public static void main(String[] args) throws IOException  {//创建打印流对象PrintWriter pw = new PrintWriter("b.txt");//写出数据pw.write("hello");pw.write("world");pw.write("java");//释放资源pw.close();}
}

1.3.2案例代码四:
利用打印流实现自动换行与自动更新

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/** 打印流的特有功能:*        自动换行 使用方法println()实现自动换行*       自动刷新  创建PrintWriter对象时启动自动刷新开关,并且使用println等3个方法可以实现自动刷新* * 注意:创建FileWriter对象时boolean参数是是否追加,*      而创建打印流对象的boolean类型参数是是否自动刷新*/
public class PrintWriterDemo2 {public static void main(String[] args) throws IOException  {//method();//创建打印流对象//PrintWriter pw = new PrintWriter("d.txt");PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);pw.println("hello");pw.println("world");pw.println("java");//释放资源//pw.close();}private static void method() throws FileNotFoundException {//创建打印流对象PrintWriter pw = new PrintWriter("c.txt");/*pw.write("hello");pw.write("world");pw.write("java");*/pw.print("hello");pw.println("world");pw.println("java");//释放资源pw.close();}
}

1.3.3案例代码五:
利用打印流将根目录下的SystemInOutDemo.java复制到d:\SystemInOutDemo.java下

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/** 使用打印流复制文本文件* * 数据源   SystemInOutDemo.java    BufferedReader* 目的地 d:\\SystemInOutDemo.java    PrintWriter* */
public class PrintWriterDemo3 {public static void main(String[] args) throws IOException  {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建打印流对象PrintWriter pw = new PrintWriter(new FileWriter("d:\\SystemInOutDemo.java"),true);String line;//用于存储读取到的每行数据while((line = br.readLine()) != null) {pw.println(line);}//释放资源pw.close();br.close();}}

第2章对象操作流

2.1概述
用于从流中读取对象的
ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

/*   * 对象操作流:可以用于读写任意类型的对象*       ObjectOutputStream*                 writeObject *               ObjectOutputStream(OutputStream out) *      ObjectInputStream*              readObject*                 ObjectInputStream(InputStream in)* * 注意:*        使用对象输出流写出对象,只能使用对象输入流来读取对象*      只能将支持 java.io.Serializable 接口的对象写入流中* */
public class ObjectOutputStreamDemo2 {public static void main(String[] args)  {}}

2.2利用序列化流读写对象

import java.io.Serializable;public class Student implements Serializable {/*** */String name;int age;public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age +"]";}
}import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/*    * 使用对象输出流和读对象输入流写对象* Exception in thread "main" java.io.NotSerializableException: * Serializable:序列号,是一个标识接口,只起标识作用,没有方法*                当一个类的对象需要IO流进行读写的时候,这个类必须实现该接口* * Exception in thread "main" java.io.EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。* */
public class ObjectOutputStreamDemo {public static void main(String[] args) throws IOException, ClassNotFoundException  {//method();//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));//读取对象/*Object obj = ois.readObject();System.out.println(obj);Object obj2 = ois.readObject();System.out.println(obj2);Object obj3 = ois.readObject();System.out.println(obj3);*/try {while(true) {Object obj = ois.readObject();System.out.println(obj);}} catch(EOFException e) {System.out.println("读到了文件的末尾");}//释放资源ois.close();}private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象//FileOutputStream fos = new FileOutputStream("a.txt");//ObjectOutputStream oos = new ObjectOutputStream(fos);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));//创建学生对象Student s = new Student("zhangsan",18);Student s2 = new Student("lisi",19);//写出学生对象oos.writeObject(s);oos.writeObject(s2);//释放资源oos.close();}}

2.2.1案例代码六:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;/** 使用字符流复制文本文件* * 数据源       IODemo.java* 目的地        d:\\IODemo.java*    */
public class FileCopyDemo {public static void main(String[] args) throws IOException  {//创建字符输入流对象FileReader fr = new FileReader("IODemo.java");//创建字符输出流对象FileWriter fw = new FileWriter("d:\\IODemo.java");//一次读写一个字符/*int ch;while((ch = fr.read()) != -1) {fw.write(ch);fw.flush();}*///一次读写一个字符数组int len;//用于存储读到的字符个数char[] chs = new char[1024];while((len = fr.read(chs)) != -1) {fw.write(chs,0,len);fw.flush();}//释放资源fw.close();fr.close();}
}

2.3解决对象输入流读取对象出现异常的问题
2.3.1案例代码七:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;/** 解决对象输入流读取对象出现异常的问题* */
public class ObjectOutputStreamDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException   {//method();//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));//读取数据Object obj = ois.readObject(); //System.out.println(obj);//向下转型,获取具体的子类对象ArrayList<Student> list = (ArrayList<Student>) obj;for (Student student : list) {System.out.println(student);}//释放资源ois.close();}private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));//创建集合对象ArrayList<Student> list = new ArrayList<Student>();//添加学生对象list.add(new Student("wangwu",30));list.add(new Student("zhaoliu",28));//写出集合对象oos.writeObject(list);//释放资源oos.close();}
}

2.4解决读写对象版本不一致问题

2.4.1案例代码八:

import java.io.Serializable;public class Student implements Serializable {/*** */private static final long serialVersionUID = 6361890890437825953L;String name;int age;String gender;public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";}}import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/** 解决对实现序列化接口出现的黄色警告问题* Exception in thread "main" java.io.InvalidClassException* 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。 该类的序列版本号与从流中读取的类描述符的版本号不匹配 该类包含未知数据类型 该类没有可访问的无参数构造方法 * */
public class ObjectOutputStreamDemo4 {public static void main(String[] args) throws IOException, ClassNotFoundException  {//method();method2();}//读取学生对象private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));//读取对象Object obj = ois.readObject();System.out.println(obj);//释放资源ois.close();}//写出学生对象private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));//创建的学生对象Student s = new Student("qianqi",28);//写出学生对象oos.writeObject(s);//释放资源oos.close();}}

第3章Properties集合
3.1Properties介绍
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
1、Hashtable的子类,map集合中的方法都可以用。
2、该集合没有泛型。键值都是字符串。
3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
4、有和流技术相结合的方法。

3.2利用Properties存储键值对
3.2.1案例代码九:

import java.util.Map;
import java.util.Properties;
import java.util.Set;/** Properties:表示了一个持久的属性集,属性列表中每个键及其对应值都是一个字符串* * 构造方法:*         Properties() */
public class PropertiesDemo2 {public static void main(String[] args) {//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.put("CZBK001", "zhangsan");prop.put("CZBK002", "lisi");prop.put("CZBK003", "wangwu");//遍历属性列表//获取所有的key,通过key获取valueSet<Object> keys = prop.keySet();for (Object key : keys) {Object value = prop.get(key);System.out.println(key + "=" + value);}System.out.println("------------------");//获取所有的结婚证对象Set<Map.Entry<Object,Object>> entrys = prop.entrySet();for (Map.Entry<Object, Object> entry : entrys) {Object key = entry.getKey();Object value = entry.getValue();System.out.println(key + "=" + value);}}
}

3.3Properties与流结合使用
3.3.1案例代码十:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;/** Properties和IO流结合的功能: void load(Reader reader) void list(PrintWriter out)void store(Writer writer, String comments) **/
public class PropertiesDemo2 {public static void main(String[] args) throws IOException{//method();//method2();//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.setProperty("CZBK001", "zhangsan");prop.setProperty("CZBK002", "lisi");prop.setProperty("CZBK003", "wangwu");//创建输出流对象FileWriter fw = new FileWriter("e.txt");//void store(Writer writer, String comments) prop.store(fw, "hello world");//释放资源fw.close();}private static void method2() throws FileNotFoundException, IOException {//创建属性列表对象Properties prop = new Properties();//创建一个输入流对象FileReader fr = new FileReader("d.txt");//void load(Reader reader) prop.load(fr);//释放资源fr.close();System.out.println(prop);}private static void method() throws FileNotFoundException {//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.setProperty("CZBK001", "zhangsan");prop.setProperty("CZBK002", "lisi");prop.setProperty("CZBK003", "wangwu");//创建打印流对象PrintWriter out = new PrintWriter("d.txt");//void list(PrintWriter out)  prop.list(out);//释放资源out.close();}
}

第4章编码表
4.1编码表的概述
编码表:把计算机底层的二进制数据转换成我们能看到的字符

  •  ASCII
    
  •  GB2312 --- GBK
    
  •  Unicode 所有的字符都占2个字节
    
  •  UTF-8   长度可变的码表
    
  • ANSI:本地编码表 gbk
  • Java中的字符串默认使用的ANSI(gbk)
  • 乱码:编码保持前后一致即可解决
    4.2Java中字符串的编码
    4.2.1常用方法
    构造方法(字节数组转字符串):
    String():初始化一个新创建的 String 对象,使其表示一个空字符序列
    String(byte[] bytes) 使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
    String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String
    成员方法(字符串转字节数组)
    getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
    getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组

4.2.2案例代码十一


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;/** 编码表:把计算机底层的二进制数据转换成我们能看到的字符*         ASCII* *        GB2312  --- GBK*        Unicode 所有的字符都占2个字节*        UTF-8   长度可变的码表* * ANSI:本地编码表    gbk* Java中的字符串默认使用的ANSI(gbk)* * 乱码:编码保持前后一致即可解决* */
public class EncoderDemo {public static void main(String[] args) throws IOException   {//method();FileInputStream fis = new FileInputStream("a.txt");byte[] bys = new byte[1024];int len = fis.read(bys);//System.out.println(new String(bys,0,len));System.out.println(new String(bys,0,len,"UTF-8"));}private static void method() throws UnsupportedEncodingException, FileNotFoundException, IOException {String s = "高薪就业";//byte[] bys = s.getBytes();//通过默认编码转换成数组byte[] bys = s.getBytes("UTF-8");FileOutputStream fos = new FileOutputStream("a.txt");fos.write(bys);fos.close();}}

4.3字符流中的编码
4.3.1常见对象
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader

OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter
4.3.2案例代码十二

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;/** 字符流中的编码* * 字符流 = 字节流 + 编码* */
public class EncoderDemo2 {public static void main(String[] args) throws IOException {//method();OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));String s = "迎娶白富美";osw.write(s);osw.close();}private static void method() throws IOException, UnsupportedEncodingException {FileWriter fw = new FileWriter("b.txt");String s = "月薪过万";byte[] bys = s.getBytes("UTF-8");//fw.write(s);fw.write(new String(bys));fw.close();}}

01-21 IO流(字符流与字节流)相关推荐

  1. Java基础(十五)IO流---字符流(Reader、Writer)、字节流(InputStream、OutputStream)

    IO流(应用广泛) 1.概念与三要素 本质是一套用于数据传输的机制 分类: 根据传输的方向(参照物–内存) 输入流:往内存传输数据 输出流:从内存往外传输数据 根据数据传输方式: 字符流:底层以字符形 ...

  2. java io字符流_Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  3. 第十五章 IO流(转换流 字符流 字符缓冲流 打印流)

    Java基础15 第十五章 IO流(转换流 字符流 字符缓冲流 打印流) 15.1 字符编码和字符集 15.1.1 字符编码 15.1.2 字符集 15.1.3 String类getBytes()方法 ...

  4. Java字节缓冲流/字符流/IO流小结

    文章目录 字节缓冲流 字节缓冲流构造方法 字符流 为什么会出现字符流 编码表 字符串中的编码解码问题 字符流中的编码解码问题 字符流写数据的5种方式 字符流读数据的2种方式 字符缓冲流 字符缓冲流特有 ...

  5. Java IO: 其他字符流(下)

    转载自   Java IO: 其他字符流(下) 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackRe ...

  6. java IO流---字符流

    为什么需要字符流? 由于字节流操作中文不是特别的方便,所以Java就提供字符流 字符流 = 字节流+编码表 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,因为最终底层操作会自动进行字节拼接 ...

  7. IO流 字符流 字节流 缓冲流 文件的复制

    IO流 IO概述 IO流就是一个管道,是用来在设备之间传输数据 input:相对于内存/程序 往进走输入流 output:相对于内存/程序 往硬盘写入 分类 根据数据进出方式 1.输出流: FileW ...

  8. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  9. JAVA Io 流 字符流 编码表 编码和解码的方法

    字节流,用中文可能会出现乱码 计算机中存储的信息都是二进制表示的 按照某种规则将字符编程二进制 再存储到计算机中,成为编码 按照同样规则,在计算机中二进制数解析出来,成为解码 编码和解码的方式必须一致 ...

  10. JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流

    JAVA IO流 一.相关概念 1.分类: 区别和联系 代码 嵌套的IO流关闭的问题 一.相关概念 I/O流: Input/Output Stream,文件输入输出流. 1.分类: 输入流 和 输出流 ...

最新文章

  1. delphi:多态置换原则
  2. sklearn多分类问题
  3. 求两条轨迹间的hausdorff距离_圆锥曲线三种定义间的关系
  4. Source Code Library 源代码收集器
  5. shell调用函数并获取函数返回值
  6. c语言 sqrt求100以内素数,C语言实现判断一个数是否为素数并求100以内的所有素数...
  7. [大妈吐糟] 虾米音乐的系列猜想
  8. 43.连接 Internet
  9. vi编辑器的常用命令
  10. win10隐藏任务栏_win7/10任务栏合并但不隐藏标签
  11. php淘口令,淘口令使用说明
  12. Java保存书店每日交易记录
  13. [NIPS 18] Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning
  14. 判断浏览器必须是IE10以上,低于IE10做出提示
  15. 巴塞瓦尔能量守恒定理
  16. android锁屏界面快捷键,Funtouch新特性 锁屏快捷键可以自定义
  17. Kotlin之身份证阅读器(华视)二次开发
  18. uniapp获取手机App权限
  19. matlab 2016a
  20. php添加学生信息,PHP开发 学生管理系统之添加信息PHP页面

热门文章

  1. 计算机论文中画图,论文:浅谈电脑绘画的利和弊
  2. 万物萌新绿跑出我速度 PUMA 2014春夏“炫绿奔驰”系列生机上台
  3. 群体智能优化算法学习
  4. 使用console口登录管理设备和单臂路由基本配置
  5. 给网赚从业者的几点建议
  6. PreScan快速入门到精通第三十九讲基于车道线识别传感器的车道保持辅助算法Demo讲解
  7. windows装迅雷aplayer播放引擎
  8. RISC架构和STM32哈弗架构
  9. RemoteCall全新推出网页版,不安装软件也能远程技术支持
  10. 京东又一高管辞职 隆雨辞去京东集团首席法务官职务