




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1Java语言程序设计马 皓2第九章 文件输入输出n概念nJava I/O类nJava I/O操作n标准输入/输出n文件读写操作n目录管理n随机访问文件n文件属性3概念nI/O来源n控制台(console, 如DOS窗口)打印/读入n文件(file)读/写n网络接口(TCP/UDP端口)读/写n针对数据的读写n以流(stream)的方式对数据进行操作数据源程序读出数 据流目的程序写入数 据流流的重要特性n顺序读/写nsequentially4概念n读/写流的一般流程n读(Reading)nopen a stream /打开读出流nwhile more information /判断n read
2、 information /读nclose the stream /关闭流n写(Writing)nopen a stream /打开写入流nwhile more information /判断n write information /写1.close the stream /关闭流5概念n两种流的定义(读取信息的基本数据单位)n字节流(byte stream): 一个字节(8-bit)一个字节读/写n字符流(character stream):一个字符一个字符读/写(具有特定字符编码的数据)j a v a 语 言6A 61 76 61 D3 EF D1 D4以字节流的方式读: 读8次,8个字节
3、以字符流的方式读: 读6次,6个字符6第九章 文件输入输出n概念nJava I/O类nJava I/O操作n标准输入/输出n文件读写操作n目录管理n随机访问文件n文件属性7Java I/O类n字节流的读/写操作(来自JDK1.0)n (抽象类)npublic abstract int read()npublic int read(byte b)npublic int read(byte b, int offset, int length)n到达流的终点,无数据读出则返回-1n (抽象类)npublic abstract void write(int b)npublic void write(b
4、yte b)npublic void write(byte b, int offset, int length) 1.所有的读/写函数都抛出8Java I/O类n字符流的读/写操作(来自JDK1.1)n (抽象类)npublic int read()npublic int read(char cbuf)npublc abstract int read(char cbuf, int offset, int length)n到达流的终点,无数据读出则返回-1n (抽象类)npublic void write(int c)npublic void write(char cbuf)npublic vo
5、id write(char cbuf, int offset, int length)1.所有的读/写函数都抛出9Java I/O类nI/O流的层次关系nclass 的子类nclass nclass java.io.FileInputStreamnclass nclass java.io.BufferedInputStreamnclass nclass nclass nclass nclass nclass nclass n 10Java I/O类nI/O流的层次关系nclass 的子类nclass nclass java.io.FileOutputStreamnclass nclass ja
6、va.io.BufferedOutputStreamnclass nclass nclass nclass n 11Java I/O类nI/O流的层次关系nclass 的子类nclass java.io.BufferedReadernclass nclass nclass nclass nclass nclass java.io.FileReadernclass nclass n 12Java I/O类nI/O流的层次关系nclass 的子类nclass java.io.BufferedWriternclass nclass nclass nclass java.io.FileWriternc
7、lass nclass nclass n 13Java I/O类nI/O流的分类 (12个功能类)I/O类型所用到的类描述文件FileReader/FileWriterFileInputStream/FileOutputStream文件流(读/写文件)缓冲BufferedReader/BufferedWriterBufferedInputStreamBufferedOutputStream提高读/写效率打印PrintWriter PrintStream (System.out.println()内存CharArrayReader/CharArrayWriterByteArrayInputStr
8、eamByteArrayOutputStreamStringReader/StringWriterStringBufferInputStream读/写内存14Java I/O类nI/O流的分类 (12个功能类)I/O类型所用到的类描述字节流和字符流的转换InputStreamReaderOutputStreamWriter将InputStream中读入的字节转为字符/将字符转为字节写入OutputStream管道pipePipedReader/PipedWriterPipedInputStream/PipedOutputStream文件流(读/写文件)连接ConcatenationSequen
9、ceInputStream多个输入流连接为一个输入流对象串行化ObjectInputStreamObjectOutputStreamObject Serialization15Java I/O类nI/O流的分类 (12个功能类)I/O类型所用到的类描述基本数据转化DataInputStreamDataOutputStreamJAVA基本数据类型的读/写计数LineNumberReaderLineNumberInputStream读操作时记录行数Peeking AheadPushbackReaderPushbackInputStream可回退缓存(pushback buffer)过滤Filter
10、Reader/FilterWriterFilterInputStream/FilterOutputStream在读/写操作时对数据进行过滤16第九章 文件输入输出n概念nJava I/O类nJava I/O操作n标准输入/输出n文件读写操作n目录管理n随机访问文件n文件属性17Java I/O操作n主要内容n标准输入/输出n控制台屏幕打印和键盘读入n文件I/O操作n文件读写n如何提高文件读写效率n流的包装(Wrap)n基本数据转换流n目录管理n随机访问文件(Random Access File)n文件属性1.网络流操作(见第十三讲)18n输出: 控制台屏幕打印class Test public
11、 static void main(String args) System.out.println(“Hello World!”);标准输入/输出19n输入: 键盘读入import ;class Test public static void main(String args) throws IOException byte b = new byte10;System.out.println(Received number= + System.in.read(b);标准输入/输出C:java TestAReceived number=3C:20n文件读/写流程n打开文件流n条件判断n读出/写入
12、n关闭文件流n两种类型文件nFileInputStream/FileOutputStream (字节流)1.FileReader/FileWriter (字符流)文件读写操作21n字节流构造方法npublic FileInputStream(File file) throws FileNotFoundExceptionnpublic FileInputStream(String name) throws FileNotFoundExceptionnpublic File(String pathname)npublic FileOutputStream(File file) throws Fil
13、eNotFoundExceptionnpublic FileOutputStream(File file, boolean append) throws FileNotFoundException /是否向已存在的文件后添加npublic FileOutputStream(String name) throws FileNotFoundExceptionnpublic FileOutputStream(String name, boolean append) throws FileNotFoundException文件读写操作22n文件读写-实例1文件读写操作import .*;public
14、class CopyBytes public static void main(String args) throws IOException File inputFile = new ); File outputFile = new ); FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int c; while (c = () != -1) out.write(c); (); (); public int read ()t
15、hrows IOExceptionpublic int read (byte b) throws IOExceptionpublic int read (byte b, int off, int len) throws IOExceptionFileInputStream in = new );FileOutputStream out = new );public void write (int b) throws IOExceptionpublic void write (byte b) throws IOExceptionpublic void write (byte b, int off
16、, int len) throws IOException23n字符流构造方法npublic FileReader(File file) throws FileNotFoundExceptionnpublic FileReader(String fileName) throws FileNotFoundExceptionnpublic File(String pathname)npublic FileWriter(File file) throws IOExceptionnpublic FileWriter(File file, boolean append) throws IOExcepti
17、onnpublic FileWriter(String fileName) throws IOExceptionnpublic FileWriter(String fileName, boolean append) throws IOException文件读写操作24n文件读写-实例2文件读写操作import .*;public class Copy public static void main(String args) throws IOException File inputFile = new ); File outputFile = new ); FileReader in = ne
18、w FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while (c = () != -1) out.write(c); (); (); FileReader in = new );FileWriter out = new );public int read () throws IOExceptionpublic int read (char cbuf) throws IOExceptionpublic int read (char cbuf, int off, int len) throws
19、 IOExceptionpublic void write (int b) throws IOExceptionpublic void write (char cbuf) throws IOExceptionpublic void write (char cbuf, int off, int len) throws IOException25n两类缓冲流n针对字节流n类n类n针对字符流n类n类如何提高文件读写效率26n构造方法npublic BufferedInputStream(InputStream in) 2048 bytesnpublic BufferedInputStream(Inp
20、utStream in, int size)npublic BufferedOutputStream(OutputStream out) 512 bytesnpublic BufferedOutputStream(OutputStream out, int size)npublic BufferedReader(Reader in) 8192 bytesnpublic BufferedReader(Reader in, int sz)npublic BufferedWriter(Writer out) 8192 bytenpublic BufferedWriter(Writer out, in
21、t sz)如何提高文件读写效率27 String filename = “”; FileInputStream fis = new FileInputStream(filename); int count = 0; int c; while (c = fis.read() != -1) if (c = A) count+; (); System.out.println(count);n如何提高文件读写效率-实例1如何提高文件读写效率 String filename = “”; FileInputStream fis = new FileInputStream(filename); Buffer
22、edInputStream bis = new BufferedInputStream(fis); int count = 0; int c; while (c = bis.read() != -1) if (c = A) count+; (); System.out.println(count); FileInputStream fis = new ”); int count = 0; final int BUFSIZE = 1024; byte buf = new byteBUFSIZE; int len; while (len = fis.read(buf) != -1) for (in
23、t i = 0; i len; i+) if (bufi = A) count+; ();28 String filename = “”; FileReader fr = new FileReader(filename); BufferedReader br = new BufferedReader(fr); int count = 0; while () != null) count+; (); System.out.println(count);n如何提高文件读写效率-实例2如何提高文件读写效率29n概述流的包装(wrap) FileReader fr = new FileReader (
24、filename); BufferedReader br = new BufferedReader (fr); BufferedReader br = new BufferedReader ( new FileReader(filename); PrintWriter out = new PrintWriter ( new BufferedWriter(new FileWriter(filename); public String readLine() in public void println(String x) in n利用不同流的特点(方法)n寻找合适的方法完成特定的需求n对已有的流进
25、行再处理30n流的种类n节点流n直接对数据源进行读/写操作的流n处理流n对一个已有的流进行某种操作的流流的包装(wrap)31n节点流nFileInputStream, PipedInputStream, ByteArrayInputStream, StringBufferInputStreamnFileOutputStream, PipedOutputStream, ByteArrayOutputStreamnCharArrayReader, FileReader, PipedReader, StringReadernCharArrayWriter, FileWriter, PipedWri
26、ter, StringWriter流的包装(wrap)32n处理流nFilterOutputStream, DataOutputStream, BufferedOutputStream, PrintStreamnFilterInputStream, LineNumberInputStream, DataInputStream, BufferedInputStream, PushbackInputStreamnBufferedReader, LineNumberReader, InputStreamReader, FilterReader, PushBackReadernBufferedWrit
27、er, OutputStreamReader, FilterWriter, PrintWriter流的包装(wrap)33n一个实例npublic FileReader(File file) throws FileNotFoundExceptionnpublic FileReader(String fileName) throws FileNotFoundExceptionnpublic BufferedReader(Reader in) 8192 bytesnpublic BufferedReader(Reader in, int sz)n流的包装改变了流的行为流的包装(wrap)34n流的
28、包装(wrap)-实例1流的包装(wrap)import .*;public class Echo public static void main(String args) throws IOException BufferedReader in = new BufferedReader( new ); String s; while(s = in.readLine().length() != 0) System.out.println(s); public static final InputStream in ()public InputStreamReader(InputStream i
29、n)public BufferedReader(Reader in)程序如何结束(跳出while循环)?35n概述n类npublic DataInputStream(InputStream in)npublic final boolean readBoolean()npublic final byte readByte()npublic final char readChar()npublic final int readInt()n类npublic DataOutputStream(OutputStream out)npublic final void writeBoolean(boolea
30、n v)npublic final void writeByte(int v)npublic final void writeChar(int v)npublic final void writeInt(int v)基本数据转换流36DataOutputStream out = new DataOutputStream(new FileOutputStream(invoice1.txt);double prices = 19.99, 9.99;int units= 12, 8;String descs = Java T-shirt, Java Mug;for (int i = 0; i ; i
31、 +) out.writeDouble(pricesi);out.writeChar(t);out.writeInt(unitsi);out.writeChar(t);out.writeChars(descsi);out.writeChar(n);();n基本数据转换流-实例基本数据转换流DataInputStream in = new DataInputStream( new FileInputStream(invoice1.txt);double total;try while (true) double price = (); (); int unit = (); (); char ch
32、r; StringBuffer desc = new StringBuffer(20);while (chr = ()!= n) desc.append(chr);System.out.println(Youve ordered + unit + units of + desc + at $ + price); total = total + unit * price; catch (EOFException e) System.out.println(For a TOTAL of: $ + total);();19.99 12 Java T-shirt9.99 8 Java Mug 37n概
33、述n类: 文件和目录的路径名n构造方法npublic File(String pathname)npublic File(String parent, String child)npublic File(File parent, String child)nparent通常表示一个目录, child则表示一个目录或文件n路径名(pathname)nUNIX平台上绝对路径的前缀“/”,相对路径无前缀,例“/etc/”、“”nWindows平台,绝对路径名的前缀由“盘符:”组成;UNC 路径名前缀为“”,然后是主机名和共享名,相对路径名无盘符,例“”、“”目录管理38n方法npublic bool
34、ean canWrite()/canRead()npublic boolean exists()npublic boolean delete() 删除文件或目录,若删除目录,要求该目录必须为空npublic boolean createNewFile() 创建一个空文件,当且仅当该文件不存在npublic boolean isDirectory()/isFile()/isHidden()npublic long lastModified()/public boolean setLastModified(long time)npublic String list() 得到当前目录下的所有文件名和
35、目录名,若该File对象不是表示目录,则返回nullnpublic boolean mkdir()/mkdirs() 创建一个目录npublic boolean renameTo(File dest)npublic boolean setReadOnly()目录管理39n目录管理方法举例目录管理import ;public class DirList public static void main(String args) File path = new File(.);String list = ();for(int i = 0; i ; i+)System.out.println(list
36、i);40n目录管理方法举例目录管理import ;import ;public class DirList public static void main(String args) File path = new File(.);String list = path.list(new DirFilter(args0); for (int i = 0; i ; i+) System.out.println(listi);class DirFilter implements FilenameFilter String key; DirFilter(String key) = key; publi
37、c boolean accept(File dir, String name) String f = new File(name).getName();return f.indexOf(key) != -1; 接口 public boolean accept(File dir, String name); /是否指定的文件应包含在文件列表中public String getName() in /获得文件或目录名,仅仅是最后的部分41n随机访问文件(Random Access File)n类n读写操作在同一个类中完成,须在构造对象时指定参数n通过移动文件指针(file pointer)在文件的指
38、定位置进行读写操作n构造方法npublic RandomAccessFile(String name, String mode) throws FileNotFoundExceptionnpublic RandomAccessFile(File file, String mode) throws FileNotFoundExceptionnmode: “r”, “rw”随机访问文件42n方法npublic void seek(long pos) npublic int read()npublic int read(byte b)npublic int read(byte b, int off,
39、 int len)npublic final boolean readBoolean()/readByte()/readChar()/readShort()/readInt()/readDouble()/readFloat()npublic final String readLine()npublic void write(int b)npublic void write(byte b)npublic void write(byte b, int off, int len)npublic final void writeBoolean()/writeByte()/writeChar()/wri
40、teShort()/writeInt()/writeDouble()/writeFloat()随机访问文件43n随机访问文件(Random Access File)-实例随机访问文件RandomAccessFile rf = new , rw);for(int i = 0; i 10; i+)rf.writeDouble(i*1.414);();rf = new , rw);rf.seek(5*8);rf.writeDouble(47.0001);();rf = new , r);for(int i = 0; i 10; i+)System.out.println(Value + i + :
41、+ ();();运行结果:44n文件的特性n读和写的权限n文件长度n修改时间n是否是目录n类n设定文件属性n查询文件属性文件属性45文件属性n获取文件路径import .*;class AttrDemo1 public static void main(String args) throws IOException File testfile = new File(. + + testfile1); testfile.createNewFile(); System.out.println(name = + testfile.getName(); System.out.println(path
42、= + testfile.getPath(); System.out.println(absolute path = + testfile.getAbsolutePath(); System.out.println(canonical path = + testfile.getCanonicalPath(); 46文件属性n获取文件修改时间import .*; import .*;public class AttrDemo2 public static void main(String args) throws IOException File testfile = new File(test
43、file2); (); (); long modtime = (); System.out.println(last modification time #1 = + new Date(modtime); testfile.setLastModified(0); modtime = (); System.out.println(last modification time #2 = + new Date(modtime);47文件属性n获取和设定文件长度import .*;public class AttrDemo3 public static void main(String args) t
44、hrows IOException File testfile = new File(testfile3); (); (); System.out.println(length #1 = +(); RandomAccessFile raf = new RandomAccessFile(testfile3, rw); raf.setLength(100); (); System.out.println(length #2 = + (); 48文件属性n设置读写权限import .*;public class AttrDemo4 public static void main(String arg
45、s) throws IOException File testfile = new File(testfile4); (); (); if () System.out.println(file can be read #1); if () System.out.println(file can be written #1); (); if () System.out.println(file can be read #2); if () ( file can be written #2); 49第九章 结束 !50n概述nURL应用nSocket应用nUDP数据报第十章 Java网络编程51概
46、述nThe Java platform is highly regarded in part because of its suitability for writing programs that use and interact with the resources on the Internet and the World Wide Web. 52概述nAppletnApplet程序嵌在HTML文件中,通过网络下载Applet程序代码,在本地Java-enabled browser 中执行nHTTPn通过URL类获取服务器端的HTML文件nSocket(套接字)n实现Client/Ser
47、ver结构的应用nJDBC (Java Database Connectivity)n通过网络访问关系型数据库nOracle, MS SQL, SybasenServlet/JSP (Java Server Page)nWEB服务器端的动态编程53概述n网络基础-TCP/IP协议簇n网络层(Network Layer)nInternet Protocol (IP), nIP地址, 32比特n传输层(Transport Layer)n传输控制协议(TCP: Transport Control Protocol)n用户数据报协议(UDP: User Datagram Protocol)n端口(Po
48、rt, 16比特, 065535)n应用层(Application Layer)nHTTP, FTP, SMTP, POP3, Telnet, DNS TCP or UDPPort应用PortPortPortPort 数据1应用应用应用Port 数据2主机54概述nJava语言中基本网络类nPackage 55n概述nURL应用nSocket应用nUDP数据报第十章 Java网络编程56URL应用n什么是URL?n统一资源定位符(Uniform Resource Locator)na reference (an address, a pointer) to a resource on the
49、Internet. :/协议标识符资源名 (主机名, 端口号, 文件名) :/ftp/pub/:/57URL应用n类n构造方法npublic URL(String spec) throws MalformedURLExceptionnpublic URL(String protocol, String host, String file) throws MalformedURLExceptionnpublic URL(String protocol, String host, int port, String file) throws MalformedURLExceptionn n实例方法n
50、public final InputStream openStream() throws IOExceptionnOpens a connection to this URL and returns an InputStream for reading from that connectionnpublic URLConnection openConnection() throws IOExceptionnReturns a URLConnection object that represents a connection to the remote object referred to by
51、 the URL 58URL应用n类-示例n“ :/”nnew );n :/nnew );nnew URL( , , /academic/);nnew URL( , , 80, “/academic/);59URL应用n实例import .*;import .*;public class URLReader public static void main(String args) throws Exception URL pku = new );BufferedReader in = new BufferedReader(new InputStreamReader( ();String inp
52、utLine;while (inputLine = () != null) System.out.println(inputLine);(); 类public final InputStream openStream() throws IOException60URL应用n类-实例2StringBuffer document = new StringBuffer();String urlString = “ :/”;try URL url = new URL(urlString);URLConnection conn = ();BufferedReader reader = new Buffe
53、redReader(new InputStreamReader();String line = null;while(line = () != null)document.append(line + “n”);(); catch(MalformedURLException e) System.out.println(“Unable to connection to URL:” + urlString); catch (IOException e) System.out.println(“IOException when connected to URL:” + urlString);();类o
54、penStream() is a shorthand for openConnection().getInputStream()61URL应用n类n操作流程n用所要连接资源的有效 URL实例化一个 URL对象(如有问题则抛出 MalformedURLException)n打开该 URL对象上的一个连接 n把该连接的 InputStream 包装进 BufferedReader 以便能按行读取n用 BufferedReader 读文档n关闭 BufferedReader (关闭该URL)62n概述nURL应用nSocket应用nUDP数据报第十章 Java网络编程63Socket应用nTCP协议
55、n从功能上来讲,建立一个可靠的、端到端的通信连接n操作系统实现了TCP协议的内容nSocket(套接字)n代表了TCP所定义的双向通信连接的一个端点n通信双方(两台机器)n一个作为客户端,一个作为服务器端n客户/服务器的本质区别n服务器方(Server)总在监听一个特定的端口n客户(Client)则向该端口发出连接请求nWindows系统TCP/UDP连接状态的监测nnetstat -a64Socket应用n类n表示TCP连接的客户方(Client),和谁连接n指定对方的IP地址和端口号npublic Socket(String host, int port) throws UnknownHo
56、stException, IOExceptionnSocket对象包括两个流nSocket代表了TCP所定义的双向通信连接的一个端点n输入流(读取通过网络进来的数据)npublic InputStream getInputStream() throws IOExceptionn输出流(将数据写入输出流中,并通过网络发送)npublic OutputStream getOutputStream() throws IOExceptionn操作步骤n先建立连接 1.进行流的读写操作65Socket应用n对客户端对Socket进行读写-实例ServerSocketLocalhostSocketOutp
57、utStreamInputStreamInputStreamOutputStream客户端服务器端66Socket应用n对客户端对Socket进行读写-实例import .*;import .*;public class SimpleClient public static void main(String args) Socket s = new ”, 5432);InputStream in = ();DataInputStream dis = new DataInputStream(in);String st = ();System.out.println(st);();();Serve
58、rSocketLocalhostSocketOutputStreamInputStreamInputStreamOutputStream建立连接打开输入流读取输入流关闭输入流关闭连接67Socket应用n类nTCP连接的服务器方(Server),监听端口n等待自客户端发来的连接npublic ServerSocket(int port) throws IOExceptionn接收连接请求npublic Socket accept() throws IOExceptionnListens for a connection to be made to this socket and accepts
59、 it. The method blocks(阻塞) until a connection is maden服务器端通过所接收到的Socket对象和客户端通信nSocket代表了TCP所定义的双向通信连接的一个端点n操作步骤n监听端口n接收连接1.进行流的读写操作68Socket应用n对ServerSocket的实现-实例ServerSocketLocalhostSocketOutputStreamInputStreamInputStreamOutputStream客户端服务器端69Socket应用ServerSocket s = null;String hello = “Hello Worl
60、d!”;try s = new ServerSocket(5432); catch(IOException e) System.out.println(e);System.exit(1);while(true) try Socket cs = ();OutputStream out = cs.getOutputStream();DataOutputStream dos = new DataOutputStream(out);dos.writeUTF(hello);();(); catch(IOException e) System.out.println(e); ServerSocketLoc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化遗产保护与管理考试题及答案
- spijava面试题及答案
- 公共政策与社会稳定的关系探讨试题及答案
- 城市犯罪防控政策的有效性评估试题及答案
- 软考网络工程师复习计划与试题及答案
- 新考纲适应策略2025年信息系统项目管理师试题及答案
- 西方政治制度对国际关系的影响试题及答案
- 公共政策中的风险管理策略试题及答案
- 公共政策实施中的风险管理试题及答案
- 如何提升信息系统项目管理师考试中的独立思考能力试题及答案
- 电场电场强度
- 白酒质量要求 第4部分:酱香型白酒
- JT-T-329-2010公路桥梁预应力钢绞线用锚具、夹具和连接器
- 湖北武汉市2024届高三冲刺模拟数学试卷含解析
- 2024年浙江台州椒江区公安局警务辅助人员招聘笔试参考题库附带答案详解
- 广东省广州市天河区2024年八年级下册数学期末考试试题含解析
- 土木工程专业毕业答辩常问问题
- 红色大气商务企业启动会企业启动仪式
- 2024年新改版苏教版六年级下册科学全册复习资料
- 手机制造行业未来五至十年行业分析
- 《发酵生物技术》课件
评论
0/150
提交评论